ZC_RXJH_我的信息
1、
CE 搜索出 血值的 基址 Client.exe+0x2BEC3F8 ==> 0x02FEC3F8
2、
CE 选中怪,写入内存的语句变成 0x005022AB处。
选中怪 的ID,写入到地址 [[0x032354BC]+0x14e4]中。==> [0x032354BC] 就是 角色的基址(正确性还有待验证)(ZC: 我对它不信任的点在于:这个值>血值基址...)。
上面 ESI的值 == 选中的怪物的基址 ==> 不是角色的基址,前面的分析 错误了。
怪物数组基址 0x032354C0
0050220E . 6A 00 PUSH 0x0
00502210 . 6A 00 PUSH 0x0
00502212 . 68 50040000 PUSH 0x450
00502217 . FFD0 CALL EAX
00502219 > 837E 08 31 CMP DWORD PTR DS:[ESI+0x8],0x31
0050221D . 6A 00 PUSH 0x0
0050221F . /75 71 JNZ SHORT Client.00502292 // ZC: 这里 直接跳走,注意 对于下面一个CALL 上面还 压了一个0x0 。
00502221 . |8B0D BC542303 MOV ECX,DWORD PTR DS:[0x32354BC]
00502227 . |8B46 14 MOV EAX,DWORD PTR DS:[ESI+0x14]
0050222A . |8B16 MOV EDX,DWORD PTR DS:[ESI]
0050222C . |8B52 04 MOV EDX,DWORD PTR DS:[EDX+0x4]
0050222F . |50 PUSH EAX
00502230 . |898D 98FEFFFF MOV DWORD PTR SS:[EBP-0x168],ECX
00502236 . |68 33040000 PUSH 0x433
0050223B . |8BCE MOV ECX,ESI
0050223D . |FFD2 CALL EDX
0050223F . |8B46 14 MOV EAX,DWORD PTR DS:[ESI+0x14]
00502242 . |8B8D 98FEFFFF MOV ECX,DWORD PTR SS:[EBP-0x168]
00502248 . |8981 983C0000 MOV DWORD PTR DS:[ECX+0x3C98],EAX
0050224E . |8B56 14 MOV EDX,DWORD PTR DS:[ESI+0x14]
00502251 . |8B0D 4014FB00 MOV ECX,DWORD PTR DS:[0xFB1440]
00502257 . |52 PUSH EDX
00502258 . |E8 83121100 CALL Client.006134E0
0050225D . |84C0 TEST AL,AL
0050225F . |74 41 JE SHORT Client.005022A2
00502261 . |8B46 14 MOV EAX,DWORD PTR DS:[ESI+0x14]
00502264 . |8B0D 4014FB00 MOV ECX,DWORD PTR DS:[0xFB1440]
0050226A . |8B91 70030000 MOV EDX,DWORD PTR DS:[ECX+0x370]
00502270 . |6A 00 PUSH 0x0
00502272 . |50 PUSH EAX
00502273 . |68 37040000 PUSH 0x437
00502278 . |52 PUSH EDX
00502279 . |E8 82513100 CALL Client.00817400
0050227E . |8B46 0C MOV EAX,DWORD PTR DS:[ESI+0xC]
00502281 . |8B0D BC542303 MOV ECX,DWORD PTR DS:[0x32354BC]
00502287 . |83C4 10 ADD ESP,0x10
0050228A . |8981 E4140000 MOV DWORD PTR DS:[ECX+0x14E4],EAX
00502290 . |EB 55 JMP SHORT Client.005022E7
00502292 > \8B06 MOV EAX,DWORD PTR DS:[ESI] // ZC: 上面直接跳到这里继续执行
00502294 . 8B50 04 MOV EDX,DWORD PTR DS:[EAX+0x4]
00502297 . 6A 01 PUSH 0x1 // ZC: 这里压入第2个参数
00502299 . 68 50040000 PUSH 0x450 // ZC: 这里压入第3个参数
0050229E . 8BCE MOV ECX,ESI // ZC: 这里设置ECX,也就是设置对象地址,于是推断出ESI应该是选中怪的基址 而非 角色基址
005022A0 . FFD2 CALL EDX // ZC: 显示选中怪物的血条的函数
005022A2 > 8B46 0C MOV EAX,DWORD PTR DS:[ESI+0xC]
005022A5 . 8B0D BC542303 MOV ECX,DWORD PTR DS:[0x32354BC]
005022AB . 8981 E4140000 MOV DWORD PTR DS:[ECX+0x14E4],EAX
005022B1 . EB 34 JMP SHORT Client.005022E7
经过分析,[[怪物基址] +0x04] ==> 怪物类的某个函数(应该是包含选中时 显示血值条) ==> 0x004CFED0,上面的 "CALL EDX"中的EDX就是0x004CFED0
显示选中怪血条:
mov ecx,选中的怪物的基址
mov edx,怪物类的函数地址
push 0x0
push 0x1
push 0x450
call edx
隐藏某个怪血条:(这个是自己的猜测,验证下来 确实是这样)
mov ecx,选中的怪物的基址
mov edx,怪物类的函数地址
push 0x0
push 0x0
push 0x450
call edx
3、攻击选中的怪物(CE找到的 攻击怪时 才访问的两个汇编指令地址为 0x4F79AA 和 0x4F7A21,靠的非常近)
mov ecx,0x032354BC // ZC: 存放选中怪ID的地方
mov ecx,[ecx] // ZC: 这里ECX没有设置成选中怪的基址,而是到函数中通过怪的ID找到怪的基址
mov eax,0x004F7970 // ZC: 攻击选中怪 的函数地址
call eax
ZC: 通过 视频2.5.1【19:35】左右的讲解,找到了更里层的CALL(在 0x004F7A44 处被调用)
push 选中怪的ID
mov ecx, 角色基址
call 0x004E9D30
ZC: 这样,没有自动跑路的功能,角色手动跑到指定地点后,就可以开始自动练级/吃红了
4、
5、