|
发表于 2013-1-15 23:04:06
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-18 17:56 编辑
自己对二叉树值只有个概念,
没去学过
而且自己智商不高恐怕也无法用
纯汇编实现,(二叉树在高级语言的支持下代码、运算量减少很多
而纯汇编的工作量则是数倍的增加)
针对这段代码,虽然翻译代码量不算太大,但是逻辑要求可能很费时。
非线性数据结构遍历很麻烦。。
限于能力太低,只能提供WIN32ASM的编写思路+纯中文翻译
这样即使不会C++也能理解了
void getguailist(BiTree *t) //此句传入一个t指针指向二叉树首地址
//简单用汇编来讲就是一个DWORD的地址中存储着另一个地址,这个地址指向的
是一个结构的首地址
至于这个t的地址是怎么得到的,应该是注入后,通过下面那段汇编得到的
那段汇编根据不同游戏就不同
{
int top=0,i=0;//这个定义变量应该不用讲了吧
BiTree *p,*s[255]; //定义一个p指针(dword大小的变量)用来指向一个二叉树
首地址,再定义一个S指针数组,这个数组可以指向255个二叉树首地址
这里P和S的ASM实现就是DW开辟一段内存来存地址
p=t; //把P指针(就是一个DWORD变量)赋值为传进来的指针t
do{
while(p->EndofR!=1)//意思大概就是结构中有内容时,条件成立
{
GUAILIST[i++]=p->ADDRESS;//把该地址存放到自己定义的怪物数
组中,利用i作为怪物数组的下标
if(p->EndofR!=1)//如果结构中没内容,也就是没怪物吧
{
s[top++]=p->Rchild;//这两句就像一个树的结构,分左右,
我自己没学过这结构,抱歉
p=p->Lchild;
}
}
if(top>=0) p=s[--top];
}while(top>=0);
}
这是获得怪物二叉树根地址的函数:
ULONG getguaiADDRESS(){
ULONG cc;
__asm{
//这边的代码是根据不同游戏分析出来的获取方法,跟找CALL差不多
公式也就是这样[[[[[51F1B8h]]+4dc8h]+14h]+4h]
MOV EAX,DWORD PTR DS:[0X51F1B8]
MOV ECX,DWORD PTR DS:[EAX]
LEA ECX,DWORD PTR DS:[EAX+0X4DC8]
MOV EAX,[ECX+0X14]
MOV ECX,[EAX+0X4]
MOV cc,ECX
根据这段汇编,获取方法就是
先获取0X51F1B8这个地址中的值放到eax
然后把eax的值作为地址再找到一个地址放到ecx
把EAX的值+0x4dc8放到ecx
把ECX+14H作为地址找到这个地址中的值放到EAX
再把EAX+4H作为地址找到这个地址中的值放到ECX
这时ECX就是想要的值了
放到变量cc中
}
return cc;
}
调用的时候是这样的:
getguailist((BiTree *)getguaiADDRESS());
这样怪物二叉树的怪物结构地址便存储在了GUAILIST[ ]这个数组中勒。
二叉树的存储结构是个三叉链表:
typedef struct BiTree{
BiTree *Lchild,*Parent,*Rchild;
ULONG ID,ADDRESS;
BYTE EndofL,EndofR;
}BiTree;
这边是BitTree结构定义
结束标志为 EndofR为1
能力十分菜,不要笑话我哈,希望能帮到你
|
|