游戏安全实验室 首页 游戏漏洞 查看内容

【游戏漏洞】逆向基础之OD找CALL实践

发布于:2018-3-29 10:48   |    141106次阅读 作者: 外部投稿    |   原作者: 通化程序员

在逆向中除了分析数据之外,另外一个重要的工作就是找算法,找CALL

例如各种功能函数:攻击CALL,走路CALL,喊话CALL等等

以及加密解密等算法需要我们先锁定其位置,然后进行逆向分析。

 

最常见方法一

API函数下断,例如send

下断以后做相应动作,会得到相应的调用关系及堆栈

 

//做换装备动作产生的堆栈

调用堆栈:     主线程

地址       堆栈       函数过程                              调用来自                      结构

0018EA0C   00686516   <jmp.&WS2_32.#19>                     ELEMENTC.00686511

0018EA80   0067ABE2   ? ELEMENTC.006863B0                   ELEMENTC.0067ABDD

0018EA94   0067D58F   ? ELEMENTC.0067ABA0                   ELEMENTC.0067D58A

0018EAD0   006C6E55   ? ELEMENTC.0067D4E0                 ELEMENTC.006C6E50//结构体CALL

0018EAE0   00684D1A   ? ELEMENTC.006C6E20                   ELEMENTC.00684D15

0018EAF8   00491DFF   ELEMENTC.00684CF0                     ELEMENTC.00491DFA

0018EB1C   00566737   ELEMENTC.00491C50                     ELEMENTC.00566732

0018EB50   008E1B8E   包含ELEMENTC.00566737                   ELEMENTC.008E1B8B

0018EB78   008E1A9B   ELEMENTC.008E1AE0                     ELEMENTC.008E1A96

0018EBA0   00903FBC   ELEMENTC.008E1A70                     ELEMENTC.00903FB7

0018EDD0   008EB9FD   包含ELEMENTC.00903FBC                   ELEMENTC.008EB9FA

0018EDE4   008DB977   可能 ELEMENTC.008EB9E0                  ELEMENTC.008DB974

0018EE38   008EBF6E   ELEMENTC.008DB460                     ELEMENTC.008EBF69

0018EEBC   0093C252   ELEMENTC.008EBA00                     ELEMENTC.0093C24D

0018F0E8   0062947A   ELEMENTC.0093C210                     ELEMENTC.00629475

 

堆栈是自上而下的调用关系

说通俗点就是,越上面的越是内层函数 ,越下面的越是外层函数。

这些调用或许都能实现功能,但是越上面的,由于很内层,往往绕过了多层判断,可能会功能更强大,而越下面的,由于处在调用的较外层,所有功能会更完整,这就需要根据自己的需求去分析选择,以及逐一实验哪个函数是自己所需要的。

 

例如上面堆栈

我们选择标准结构体参数的CALL到该地址分析

 

006C6E20  /$  56            push    esi

006C6E21  |.  6A 04         push    4

006C6E23  |.  E8 A87A2A00   call    0096E8D0

006C6E28  |.  8BF0          mov     esi, eax

006C6E2A  |.  83C4 04       add     esp, 4

006C6E2D  |.  85F6          test    esi, esi

006C6E2F  |.  74 2D         je      short 006C6E5E

006C6E31  |.  8A4424 08     mov     al, byte ptr [esp+8]

006C6E35  |.  8A4C24 0C     mov     cl, byte ptr [esp+C]

006C6E39  |.  66:C706 1100  mov     word ptr [esi], 11

006C6E3E  |.  8846 02       mov     byte ptr [esi+2], al

006C6E41  |.  884E 03       mov     byte ptr [esi+3], cl

006C6E44  |.  8B15 1CDFD000 mov     edx, dword ptr [D0DF1C]          ;  ELEMENTC.00D11A50

006C6E4A  |.  6A 04         push    4

006C6E4C  |.  56            push    esi                              ;  4 字节结构体

006C6E4D  |.  8B4A 20       mov     ecx, dword ptr [edx+20]

006C6E50  |.  E8 8B66FBFF   call    0067D4E0

006C6E55  |.  56            push    esi

006C6E56  |.  E8 857A2A00   call    0096E8E0

006C6E5B  |.  83C4 04       add     esp, 4

006C6E5E  |>  5E            pop     esi

 

函数较为简单 可以直接省略为这么几句代码

 

mov edx,[00D0DF1C]

mov ecx,[edx+20]

push 4

push XXXX//结果体参数  申请地址写入参数

call 0067D4E0

用内联汇编编写即可调用成功

 

最常见方法二

相关参数下断

例如寻路CALL

CE 搜索寻路 目的地坐标 ,在搜索到的地址上直接下写入断。

 

调用堆栈:     主线程

地址       堆栈       函数过程                              调用来自                      结构

0018E9B8   0057E9D4   ELEMENTC.00445AB0                     ELEMENTC.0057E9CF//第一个即可

0018EB50   008E1B8E   包含ELEMENTC.0057E9D4                   ELEMENTC.008E1B8B

0018EB78   008E1A9B   ELEMENTC.008E1AE0                     ELEMENTC.008E1A96

0018EBA0   00903FBC   ELEMENTC.008E1A70                     ELEMENTC.00903FB7

0018EDD0   008EB9FD   包含ELEMENTC.00903FBC                   ELEMENTC.008EB9FA

0018EDE4   008DB977   可能 ELEMENTC.008EB9E0                  ELEMENTC.008DB974

0018EE38   008EBF6E   ELEMENTC.008DB460                     ELEMENTC.008EBF69

0018EEBC   0093C252   ELEMENTC.008EBA00                     ELEMENTC.0093C24D

0018F0E8   0062947A   ELEMENTC.0093C210                     ELEMENTC.00629475

 

在得到的堆栈返回中分析寻路函数,第一个即可

 

0057E997   .  51            push    ecx

0057E998   .  8D4C24 3C     lea     ecx, dword ptr [esp+3C]

0057E99C   .  D95C24 28     fstp    dword ptr [esp+28]

0057E9A0   .  E8 7B68E8FF   call    00405220

0057E9A5   .  8B5424 38     mov     edx, dword ptr [esp+38]

0057E9A9   .  8B4C24 40     mov     ecx, dword ptr [esp+40]

0057E9AD   .  8B4424 3C     mov     eax, dword ptr [esp+3C]

0057E9B1   .  895424 28     mov     dword ptr [esp+28], edx

0057E9B5   .  6A 00         push    0                                ;  0

0057E9B7   .  56            push    esi                              ;  1  可能是地图ID

0057E9B8   .  8D5424 30     lea     edx, dword ptr [esp+30]

0057E9BC   .  894C24 38     mov     dword ptr [esp+38], ecx

0057E9C0   .  68 30F9D100   push    00D1F930                         ;  00D1F930   里面存放着目的地坐标

0057E9C5   .  52            push    edx                              ;  结构体  出发点的坐标 X,Z,Y

0057E9C6   .  B9 C8DED000   mov     ecx, 00D0DEC8

0057E9CB   .  894424 3C     mov     dword ptr [esp+3C], eax

0057E9CF   .  E8 DC70ECFF   call    00445AB0                         ;  X

0057E9D4   >  8BCD          mov     ecx, ebp                         ;  z

0057E9D6   .  E8 F5C2F7FF   call    004FACD0                         ;  y

0057E9DB   .  8B88 B40C0000 mov     ecx, dword ptr [eax+CB4]

0057E9E1   .  85C9          test    ecx, ecx

0057E9E3   .  74 2B         je      short 0057EA10

0057E9E5   .  8BCD          mov     ecx, ebp

0057E9E7   .  E8 E4C2F7FF   call    004FACD0

0057E9EC   .  8B80 B40C0000 mov     eax, dword ptr [eax+CB4]

0057E9F2   .  6A 00         push    0

 

简化成内联汇编,直接可以调用成功

 

push 0

push 1//可能是地图ID   如果其他地图变化  那么就找数据来源即可

push 00D1F930//目的地坐标结构体

push 00D3EB40//出发点坐标结构体

mov ecx,00D0DEC8

call 00445AB0



来源:通化程序员-公众号投稿

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞0

收藏

最新评论
引用 zusheng 2018-3-30 07:59
太简单了,能不能详细一点,大佬啊。感觉都和官方发的一样就好了。

查看全部评论(1)

B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部