hioy 发表于 2013-11-7 08:42:12

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

寻路CALL.txt 买来的特徵码 , 后面会接着写X偏移如何找 call如何调用

==========================================================
00A021E6    52            PUSH EDX
00A021E7    50            PUSH EAX
00A021E8    8B86 30040000   MOV EAX,DWORD PTR DS:
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:
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:
00A0221C    8B96 30040000   MOV EDX,DWORD PTR DS:
00A02222    6A 00         PUSH 0
00A02224    D95C24 20       FSTP DWORD PTR SS:
00A02228    D940 24         FLD DWORD PTR DS:
00A0222B    8D4C24 20       LEA ECX,DWORD PTR SS:
00A0222F    51            PUSH ECX
00A02230    D95C24 28       FSTP DWORD PTR SS:
00A02234    8B48 10         MOV ECX,DWORD PTR DS:
00A02237    D940 28         FLD DWORD PTR DS:
00A0223A    52            PUSH EDX
00A0223B    D95C24 30       FSTP DWORD PTR SS:
00A0223F    8B10            MOV EDX,DWORD PTR DS:
00A02241    8B40 04         MOV EAX,DWORD PTR DS:
00A02244    51            PUSH ECX
00A02245    8B8F 9C020000   MOV ECX,DWORD PTR DS:
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:
00A0225A    6A 00         PUSH 0                                 ; C3518BAA 0 C2E80A1A
00A0225C    8D4C24 14       LEA ECX,DWORD PTR SS:
00A02260    51            PUSH ECX                              //目的地坐标,是个结构
00A02261    8B88 9C020000   MOV ECX,DWORD PTR DS:
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 ,01

往下拉 到
xajh.gzflags+328A68 - E8 3322ABFF         - call 004ABED0
^^ 基址放到eax , 后面会+029C给ecx
xajh.gzflags+328A6D - D9 05 C4630E01      - fld dword ptr
xajh.gzflags+328A73 - 8B 96 38040000      - mov edx,
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
xajh.gzflags+328A81 - 6A 00               - push 00
xajh.gzflags+328A83 - 8D 4C 24 24         - lea ecx,
xajh.gzflags+328A87 - 51                  - push ecx
xajh.gzflags+328A88 - 8B 88 9C020000      - mov ecx,
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 //也是基址 一开始要存
push 00
push 01
push ecx       //不用改 从04ABED0的call裡面来的ecx
fstp dword ptr
push 00
push ebx // = X , = Z (给0) , = Y   
mov ecx,
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
xajh.gzflags+32D431 - 6A 00               - push 00
xajh.gzflags+32D433 - 8D 4C 24 30         - lea ecx,
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,下断 再按一次寻路 , memory视窗ctrl+g查看esp+30的位置 f9执行游戏
往上拉到函数头下断 , f8单步开始找哪一步改到了esp+30的内容

xajh.gzflags+32D3FA - D9 44 24 14         - fld dword ptr
xajh.gzflags+32D3FE - D9 5C 24 20         - fstp dword ptr
^^^发现是这行 先F9继续 免得断线 ,google查fstp跟fld的用途   
fdl这行 = 把 读出来到ST(0)
fstp这行 =把ST(0) 丢进
so, 接着ctrl+g看esp+14重覆刚才动作找哪一行改了这

xajh.gzflags+32D3EA - DB 44 24 0C         - fild dword ptr
xajh.gzflags+32D3EE - D9 5C 24 14         - fstp dword ptr
^^^^结果找到 这个 跟刚一样结构 , 所以再找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 ,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
xajh.gzflags+32D3CE - 83 EC 08            - sub esp,08
xajh.gzflags+32D3D1 - B9 10487B01         - mov ecx,017B4810 :
xajh.gzflags+32D3D6 - D9 5C 24 04         - fstp dword ptr
xajh.gzflags+32D3DA - DB 44 24 14         - fild dword ptr
xajh.gzflags+32D3DE - D9 1C 24            - fstp dword ptr
xajh.gzflags+32D3E1 - E8 3AF10E00         - call xajh.gzflags+41C520
xajh.gzflags+32D3E6 - D9 5C 24 18         - fstp dword ptr
xajh.gzflags+32D3EA - DB 44 24 0C         - fild dword ptr
xajh.gzflags+32D3EE - D9 5C 24 14         - fstp dword ptr
xajh.gzflags+32D3F2 - DB 44 24 10         - fild dword ptr
xajh.gzflags+32D3F6 - D9 5C 24 1C         - fstp dword ptr
xajh.gzflags+32D3FA - D9 44 24 14         - fld dword ptr
xajh.gzflags+32D3FE - D9 5C 24 20         - fstp dword ptr
xajh.gzflags+32D402 - D9 44 24 18         - fld dword ptr
xajh.gzflags+32D406 - D9 5C 24 24         - fstp dword ptr
xajh.gzflags+32D40A - D9 44 24 1C         - fld dword ptr
xajh.gzflags+32D40E - D9 5C 24 28         - fstp dword ptr
==============================================================================
进到call裡面后

004C0DD0 - 8B 51 7C            - mov edx,
004C0DD3 - 8B 44 24 04         - mov eax,
004C0DD7 - 01 10               - add ,edx
^^^ 这一行改了 , 根据单步这三行变数的改变情况发现
ecx+7C读出来的就是偏移
然后把传址进来的上层的esp+0C 加上了偏移
换句话说
寻路call的X算法就是
偏移 = [[[[基址]+24]+C]+140]+7C
要走的 (259) + 偏移 (-256) = 3
3 就是加密后的X座标 传给寻路call

004C0DD9 - 8B 89 80000000      - mov ecx,
004C0DDF - 8B 44 24 08         - mov eax,
004C0DE3 - 01 08               - add ,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 ")

      oDm.AsmAdd("push 00")
      oDm.AsmAdd("push 01")
      oDm.AsmAdd("push ecx")
      oDm.AsmAdd("fstp dword ptr ")
      oDm.AsmAdd("push 00")
      oDm.AsmAdd("push ebx")
      oDm.AsmAdd("mov ecx,")
      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 [[[[[+24]+90]+8]+14]+2c]+i*4//背包基址,
+6C物品的数量
+c 物品ID
+10==0x27 是药品 +10==0xc3是装备
+d0+4 是药品名
+e0+4 是装备名
+88是裝備等級
+70是商店售價
页: [1]
查看完整版本: 笑傲江湖ol寻路call详细X座标偏移找法 VB源码