- 注册时间
- 2011-8-8
- 最后登录
- 1970-1-1
该用户从未签到
|
寻路CALL.txt 买来的特徵码 , 后面会接着写X偏移如何找 call如何调用
==========================================================
00A021E6 52 PUSH EDX
00A021E7 50 PUSH EAX
00A021E8 8B86 30040000 MOV EAX,DWORD PTR DS:[ESI+430]
00A021EE 99 CDQ
00A021EF 52 PUSH EDX
00A021F0 50 PUSH EAX
00A021F1 6A 03 PUSH 3
00A021F3 68 D8070000 PUSH 7D8
00A021F8 E8 23BD1800 CALL xajh.00B8DF20
00A021FD 83C4 20 ADD ESP,20
00A02200 EB 73 JMP SHORT xajh.00A02275
00A02202 8B86 9C040000 MOV EAX,DWORD PTR DS:[ESI+49C]
00A02208 85C0 TEST EAX,EAX
00A0220A 74 43 JE SHORT xajh.00A0224F
00A0220C 50 PUSH EAX
00A0220D E8 FE12C4FF CALL xajh.00643510
00A02212 83C4 04 ADD ESP,4
00A02215 85C0 TEST EAX,EAX
00A02217 74 36 JE SHORT xajh.00A0224F
00A02219 D940 20 FLD DWORD PTR DS:[EAX+20]
00A0221C 8B96 30040000 MOV EDX,DWORD PTR DS:[ESI+430]
00A02222 6A 00 PUSH 0
00A02224 D95C24 20 FSTP DWORD PTR SS:[ESP+20]
00A02228 D940 24 FLD DWORD PTR DS:[EAX+24]
00A0222B 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
00A0222F 51 PUSH ECX
00A02230 D95C24 28 FSTP DWORD PTR SS:[ESP+28]
00A02234 8B48 10 MOV ECX,DWORD PTR DS:[EAX+10]
00A02237 D940 28 FLD DWORD PTR DS:[EAX+28]
00A0223A 52 PUSH EDX
00A0223B D95C24 30 FSTP DWORD PTR SS:[ESP+30]
00A0223F 8B10 MOV EDX,DWORD PTR DS:[EAX]
00A02241 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
00A02244 51 PUSH ECX
00A02245 8B8F 9C020000 MOV ECX,DWORD PTR DS:[EDI+29C]
00A0224B 52 PUSH EDX
00A0224C 50 PUSH EAX
00A0224D EB 1F JMP SHORT xajh.00A0226E
00A0224F E8 0C7BAAFF CALL xajh.004A9D60
00A02254 8B96 30040000 MOV EDX,DWORD PTR DS:[ESI+430]
00A0225A 6A 00 PUSH 0 ; C3518BAA 0 C2E80A1A
00A0225C 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00A02260 51 PUSH ECX //目的地坐标,是个结构
00A02261 8B88 9C020000 MOV ECX,DWORD PTR DS:[EAX+29C]
00A02267 52 PUSH EDX ; 48地图号
00A02268 6A 00 PUSH 0
00A0226A 6A 00 PUSH 0
00A0226C 6A 00 PUSH 0
00A0226E 6A 00 PUSH 0 ; ecx==2CF45720
00A02270 E8 3BEBCEFF CALL xajh.006F0DB0 ; 寻路CALL
特征码:
99 52 50 6a 03 68 d8 07 00 00
=======================================================================================================================
上面这份代码已经挺旧的了 以下的比较新
这裡开始是X偏移的找法 自己做的过程一步一步纪录下来的
搜 99 52 50 6a 03 68 d8 07 00 00
找到
xajh.gzflags+3289E9 - 99 - cdq
xajh.gzflags+3289EA - 52 - push edx
xajh.gzflags+3289EB - 50 - push eax
xajh.gzflags+3289EC - 6A 03 - push 03
xajh.gzflags+3289EE - 68 D8070000 - push 000007D8
xajh.gzflags+3289F3 - E8 28B81D00 - call xajh.gzflags+504220
xajh.gzflags+3289F8 - 83 C4 20 - add esp,20
xajh.gzflags+3289FB - E9 9C000000 - jmp xajh.gzflags+328A9C
xajh.gzflags+328A00 - F6 87 9C000000 01 - test byte ptr [edi+0000009C],01
往下拉 到
xajh.gzflags+328A68 - E8 3322ABFF - call 004ABED0
^^ 基址放到eax , 后面会+029C给ecx
xajh.gzflags+328A6D - D9 05 C4630E01 - fld dword ptr [xajh.gzclearerr+1C7314]
xajh.gzflags+328A73 - 8B 96 38040000 - mov edx,[esi+00000438]
xajh.gzflags+328A79 - 6A 00 - push 00
xajh.gzflags+328A7B - 6A 01 - push 01
xajh.gzflags+328A7D - 51 - push ecx
xajh.gzflags+328A7E - D9 1C 24 - fstp dword ptr [esp]
xajh.gzflags+328A81 - 6A 00 - push 00
xajh.gzflags+328A83 - 8D 4C 24 24 - lea ecx,[esp+24]
xajh.gzflags+328A87 - 51 - push ecx
xajh.gzflags+328A88 - 8B 88 9C020000 - mov ecx,[eax+0000029C]
xajh.gzflags+328A8E - 52 - push edx
xajh.gzflags+328A8F - 6A 00 - push 00
xajh.gzflags+328A91 - 6A 00 - push 00
xajh.gzflags+328A93 - 6A 00 - push 00
xajh.gzflags+328A95 - 6A 00 - push 00
xajh.gzflags+328A97 - E8 B405D1FF - call xajh.gzflags+39050
^^^巡路call , 10个参数
push ebx
push Y
push Z
push X
mov ebx,esp
call 004ABED0 //取基址
fld dword ptr [010E63C4] //也是基址 一开始要存
push 00
push 01
push ecx //不用改 从04ABED0的call裡面来的ecx
fstp dword ptr [esp]
push 00
push ebx //[ebx+0] = X , [ebx+4] = Z (给0) , [ebx+8] = Y
mov ecx,[eax+0000029C]
push 044 //地图ID
push 00
push 00
push 00
push 00
call 070A280
pop ebx
X座标的偏移找法:
CE
在寻路call开头下断 M开大地图 人物在福州城or洛阳 偏移应该是 -256
座标输入 259,-100 然后按寻径 (不要用滑鼠点 上层不一样)
断下来后 shift+f8返回 看到call
xajh.gzflags+32D429 - 6A 00 - push 00
xajh.gzflags+32D42B - 6A 01 - push 01
xajh.gzflags+32D42D - 51 - push ecx
xajh.gzflags+32D42E - D9 1C 24 - fstp dword ptr [esp]
xajh.gzflags+32D431 - 6A 00 - push 00
xajh.gzflags+32D433 - 8D 4C 24 30 - lea ecx,[esp+30]
xajh.gzflags+32D437 - 51 - push ecx
xajh.gzflags+32D438 - 52 - push edx
xajh.gzflags+32D439 - 6A 00 - push 00
xajh.gzflags+32D43B - 6A 00 - push 00
xajh.gzflags+32D43D - 6A 00 - push 00
xajh.gzflags+32D43F - 6A 00 - push 00
xajh.gzflags+32D441 - 8B C8 - mov ecx,eax
xajh.gzflags+32D443 - E8 08BCD0FF - call xajh.gzflags+39050
在 lea ecx,[esp+30]下断 再按一次寻路 , memory视窗ctrl+g查看esp+30的位置 f9执行游戏
往上拉到函数头下断 , f8单步开始找哪一步改到了esp+30的内容
xajh.gzflags+32D3FA - D9 44 24 14 - fld dword ptr [esp+14]
xajh.gzflags+32D3FE - D9 5C 24 20 - fstp dword ptr [esp+20]
^^^发现是这行 先F9继续 免得断线 , google查fstp跟fld的用途
fdl这行 = 把[esp+14] 读出来到ST(0)
fstp这行 = 把ST(0) 丢进 [esp+20]
so, 接着ctrl+g看esp+14 重覆刚才动作找哪一行改了这
xajh.gzflags+32D3EA - DB 44 24 0C - fild dword ptr [esp+0C]
xajh.gzflags+32D3EE - D9 5C 24 14 - fstp dword ptr [esp+14]
^^^^结果找到 这个 跟刚一样结构 , 所以再找esp+0C
这边注意看会发现 esp+0C存着4byte型的3 放进ST(0)之后 被fstp 以浮点数丢到esp+14
所以esp+14裡面的内容跟esp+0C的内容不一样 一个是整数3 一个浮点数3
要寻路的X (259) + 偏移 ( -256 ) = 寻路call参数X ( 3 )
一样重覆刚才动作找谁改了esp+3
一个在
xajh.gzflags+32D366 - 89 44 24 0C - mov [esp+0C],eax
这边改了一次 改成259 不过不是我们要的偏移后的值
再往下几行
xajh.gzflags+32D3B7 - E8 2465E8FF - call xajh.gzflags+1B38E0
xajh.gzflags+32D3BC - 8B C8 - mov ecx,eax
xajh.gzflags+32D3BE - E8 4D09AAFF - call 0049EF40
xajh.gzflags+32D3C3 - 8B C8 - mov ecx,eax
xajh.gzflags+32D3C5 - E8 D627ACFF - call 004C0DD0
^^^^ 这裡 这个call也有改
F7进去call裡面看 下面几行保留一下原code 方便比对
xajh.gzflags+32D3CA - DB 44 24 10 - fild dword ptr [esp+10]
xajh.gzflags+32D3CE - 83 EC 08 - sub esp,08
xajh.gzflags+32D3D1 - B9 10487B01 - mov ecx,017B4810 : [xajh.gzclearerr+236F88]
xajh.gzflags+32D3D6 - D9 5C 24 04 - fstp dword ptr [esp+04]
xajh.gzflags+32D3DA - DB 44 24 14 - fild dword ptr [esp+14]
xajh.gzflags+32D3DE - D9 1C 24 - fstp dword ptr [esp]
xajh.gzflags+32D3E1 - E8 3AF10E00 - call xajh.gzflags+41C520
xajh.gzflags+32D3E6 - D9 5C 24 18 - fstp dword ptr [esp+18]
xajh.gzflags+32D3EA - DB 44 24 0C - fild dword ptr [esp+0C]
xajh.gzflags+32D3EE - D9 5C 24 14 - fstp dword ptr [esp+14]
xajh.gzflags+32D3F2 - DB 44 24 10 - fild dword ptr [esp+10]
xajh.gzflags+32D3F6 - D9 5C 24 1C - fstp dword ptr [esp+1C]
xajh.gzflags+32D3FA - D9 44 24 14 - fld dword ptr [esp+14]
xajh.gzflags+32D3FE - D9 5C 24 20 - fstp dword ptr [esp+20]
xajh.gzflags+32D402 - D9 44 24 18 - fld dword ptr [esp+18]
xajh.gzflags+32D406 - D9 5C 24 24 - fstp dword ptr [esp+24]
xajh.gzflags+32D40A - D9 44 24 1C - fld dword ptr [esp+1C]
xajh.gzflags+32D40E - D9 5C 24 28 - fstp dword ptr [esp+28]
==============================================================================
进到call裡面后
004C0DD0 - 8B 51 7C - mov edx,[ecx+7C]
004C0DD3 - 8B 44 24 04 - mov eax,[esp+04]
004C0DD7 - 01 10 - add [eax],edx
^^^ 这一行改了 , 根据单步这三行变数的改变情况发现
ecx+7C读出来的就是偏移
然后把传址进来的上层的esp+0C 加上了偏移
换句话说
寻路call的X算法就是
偏移 = [[[[基址]+24]+C]+140]+7C
要走的 (259) + 偏移 (-256) = 3
3 就是加密后的X座标 传给寻路call
004C0DD9 - 8B 89 80000000 - mov ecx,[ecx+00000080]
004C0DDF - 8B 44 24 08 - mov eax,[esp+08]
004C0DE3 - 01 08 - add [eax],ecx
004C0DE5 - C2 0800 - ret 0008
以下VB代码
Private Sub walk(ByVal X As Integer, ByVal Y As Integer, ByVal mapid As Integer, ByVal pHandle As Integer)
X = X - 256 '这个 -256就是上面说的 [[[[基址]+24]+C]+140]+7C , 当前地图的X偏移
'这样做的寻路call 过地图后必须再寻路一次 才会是当前地图的X偏移
oDm.AsmClear()
oDm.AsmAdd("push ebx")
oDm.AsmAdd("push 0" & memFunc.floatTo4Byte(Y)) ' Y跟X座标转成16进制的函数
oDm.AsmAdd("push 00") ' Z
oDm.AsmAdd("push 0" & memFunc.floatTo4Byte(X))
oDm.AsmAdd("mov ebx,esp")
oDm.AsmAdd("call 004ABED0")
oDm.AsmAdd("fld dword ptr [010E63C4]")
oDm.AsmAdd("push 00")
oDm.AsmAdd("push 01")
oDm.AsmAdd("push ecx")
oDm.AsmAdd("fstp dword ptr [esp]")
oDm.AsmAdd("push 00")
oDm.AsmAdd("push ebx")
oDm.AsmAdd("mov ecx,[eax+029C]")
oDm.AsmAdd("push 044")
oDm.AsmAdd("push 00")
oDm.AsmAdd("push 00")
oDm.AsmAdd("push 00")
oDm.AsmAdd("push 00")
oDm.AsmAdd("call 070A280")
oDm.AsmAdd("add esp,0C")
oDm.AsmAdd("pop ebx")
oDm.AsmCall(pHandle, 1)
End Sub
调用
walk(138, -65, &H44, lasthwnd)
裝備數據結構的分析
目前只找到這些
装备数据结构的分析
目前只找到这些
dd [[[[[[13179F8]+24]+90]+8]+14]+2c]+i*4 //背包基址 ,
+6C物品的数量
+c 物品ID
+10==0x27 是药品 +10==0xc3是装备
+d0+4 是药品名
+e0+4 是装备名
+88是裝備等級
+70是商店售價 |
|