游戏逆向基础之OD找CALL实践

文章讲述了在逆向工程中如何通过分析堆栈调用关系找到关键的函数和算法,例如通过API函数下断获取调用关系,然后选择适当的内层或外层函数进行实验,以确定所需功能。同时提到了寻路函数的查找和简化调用过程,通过内联汇编实现直接调用。
摘要由CSDN通过智能技术生成

在逆向中除了分析数据之外,另外一个重要的工作就是找算法,找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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

douluo998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值