打开游戏软件,打开CE工具并附加到程序中,不断的打击游戏找到有效的内存数据。右击是什么改写了数据。

再次改变游戏中的数据—–显示汇编程序。

怎样确定call有哪些参数,在Call前有几个push就有几个参数。参数是多少可以在Call处下断点。

可以发现push esi,再查esi寄存器的值是01F2EF78,可以发现这个应该是调用者的地址也就是玩家的地址。每次启动这个地址是会发生变化的。

当知道玩家或调用者的头地址054CEF78,call的地址059DC378,在内存查看器中点工具—-自动汇编—-自动汇编框架代码。


alloc(callDead,256) //分配call函数 callDead内存空间
CreateThread(callDead) //创建一个线程来调用callDead函数。
callDead:.
push esp,0c //堆栈平衡,在汇编中照抄在push前和call后。若是注入就不需要了。
push 054CEF78 //汇编中esi的玩家头地址
call 059DC378 //在汇编中call后面的地址
add esp,10 //堆栈平衡,在汇编中照抄在push前和call后。若是注入就不需要了。
ret //调用线程是一定要ret的,否则会出问题。
可以通过选中或不选中来确定是否调用callDead函数。

通过修改数据变化扫描到地址后—–右击谁改写了这个地址——再次修改游戏数据的变化——-显示反汇编程序。

那怎样知道是谁调用了这个函数呢?可以在这个函数内的任意地方,下一个断点并运行,然后再把断点取消掉,调试—–运行到返回。

在add的上一句就是call的地方,而上面的两个push就是参数。


Post Views: 186