看流星社区

 找回密码
 注册账号
查看: 3914|回复: 0

笑傲江湖ol寻路call详细X座标偏移找法 VB源码

[复制链接]

该用户从未签到

发表于 2013-11-7 08:42:12 | 显示全部楼层 |阅读模式
寻路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是商店售價
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 07:25

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表