这个游戏存银子Call,从银子数量变化去找已经晚了,使用之前搜索字符串,或者模块间调用Call,全部下断,然后不停地取消断点,逐步逼近,就会找到 ClientCo.PropCore::CPropClient::SendMsg_SaveMoney, 这个函数就很明显,你可以直接到DLL导出函数查到
这里下断,你会发现这个就是点击存银子时候就会立即被断下来 mov eax, dword ptr [esi+1334] push eax 这里eax就是你要存的银子数量,很简单 但是还有个参数就是ecx是由edi得到的, mov ecx, edi 这个就相当麻烦了 鼠标点击0046A068发现提示 所以我们跟踪跳转 发现来到了函数头 这里下断然后再点击存银子按钮,发现断下后,是由MFC71U调用的 所以这里就比较麻烦了,只能一步一步跟踪,看EDI的值到底是怎么来的 单步运行
你会发现,进入这个Call的时候,ECX已经被赋值 跟踪到下图就会发现 所以存银子Call的ECX是由EDI得到,而EDI是由上图 mov edi, dword ptr [esi+474] add edi, 534 所以ecx = [esi + 474] + 534 (注意这里是地址)
所以关键是要找到函数头那里的ECX的来源 在函数头下断被断下来的寄存器如下 发现这里找ECX的来源用OD也好,用CE也好,根本无法获得具体来源,最终只好在数据窗口来到ECX值的内存下硬件写入DWORD,看这个值是如何写入到030E0A10的 经过半天测试,发现点击
时候会断下 在堆栈里返回上第二层Call 来到
这个函数往上翻,找到函数头下断,关掉保险箱窗体,重新点击file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml13512/wps16.png,断到函数头,看堆栈发现还是 MFC71U调用此函数 此时寄存器为 上图中间,ECX会赋值给ESI,发现这个ECX为0308BD88眼熟 之前找坐下Call也会出现这个 所以上面红色标记的0308BD88应该就是牛牛大厅的主窗体对象指针了,而存银子窗体应该是大厅主窗体的子窗体。 单步运行到下图 运行到00441D1A时候出现mov ecx, dword ptr [esi+286C] 此时ECX正好就是上面要找的030E0A10 而下面的 mov dword ptr [esi+286C], edi 也会把窗体指针保存在mov dword ptr [esi+286C]里面 所以由此可知道存银子Call的那个Ecx参数如下 注意参数是地址,而不是值哦 发现游戏必须先创建一次存银子窗体,这个存银子Call参数Ecx才有效,不然直接调用游戏崩溃 附上我找的CE表
Dd [5030cc] 00467EB8 8B86 34130000 mov eax,dword ptr ds:[esi+0x1334] 00467EBE 50 push eax 00467EBF 8BCF mov ecx,edi 00467EC1 90 nop 00467EC2 E8 19B67F02 call ClientCo.PropCore::CPropClient::Sen>
例: Push 钱 Mov ecx,0x0 call 02C634E0 = 234e0+client的基址: 转载说明:以下文章来源于shou8shou.cn
|