想要实现僵尸位置不动,那么需要先找到僵尸对象的地址。 上文我们知道了植物血量的偏移以及植物扣血的指令位置。
在0052FCF0地址的指令执行时,植物被僵尸咬会扣血,断点断住的时候,寄存器的值如下
既然是被僵尸攻击,那么这些寄存器中有概率存在僵尸对象的地址。这里EBP和ESI这两个寄存器里面的地址比较可疑。先试EBP中的值。
猜测EBP的值是僵尸对象的地址。并且大小等于EE6228C-EE62130 =0x15C字节
这里发现有10个值。但场上的僵尸个数并没有这么多。先在最后一行000000还未分配的地址下写断点。等大波僵尸时应该会触发断点。
发现在0x00522510左右的位置断住。
Run till return 点一下。僵尸属性赋值 函数中eax是僵尸的基地址。可以看到是从edi获取的。
而edi是在0041DDD3地址的指令得出最终的值。它先有ebx传入一个偏移值(0,1,2,3,4)然后乘以僵尸对象的大小0x15C字节,得出僵尸的地址偏移再加上esi地址里存储的基地址。
mov edi,ebx ;0041DDCB
imul edi,edi,15C ;0041DDCD
add edi,dword ptr ds:[esi] ;0041DDD3
使用CE搜出位置变化的字段,发现0x2C偏移的4字节字段是僵尸的X轴地址。 0052AB3B使用了fstp指令将float类型的数值从fpu寄存中存回内存。
fld st(0),dword ptr ds:[esi+2C] ;0052AB30
fadd st(0),dword ptr ss:[esp+8] ;0052AB33
cmp dword ptr ds:[esi+24],7 ;0052AB37
fstp dword ptr ds:[esi+2C],st(0) ;0052AB3B
所以如果想实现静止术,将fadd指令改成nop即可.
标签:别动,僵尸,edi,地址,dword,编写,ptr,esi From: https://www.cnblogs.com/dewxin/p/17104950.html