登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 73|回复: 1

CALL返回值的应用

[复制链接]

40

主题

3

回帖

59

积分

版主

积分
59
发表于 2025-3-22 12:07:19 | 显示全部楼层 |阅读模式
*CALL返回值首先考虑的是 EAX:EDX,在这里我就不班门弄斧了.详情请问百度,或者参考一些相关的书籍如 看雪出版的 加密与解密第三版等等.

*其实CALL返回值的应用在,CALL提升篇中找剑侠3喊话CALL的时候就应用到过.
目标:剑侠3血值基址的寻找
目的:找到血值基址的产生,来达到理解CALL返回值的应用.




1.png
打怪去掉一点血,我们来搜索减少的血值
2.png
好了 这里第一个就是我们要找的值,不过现在是动态的我们要找他的基址
3.png
查找写入的值,然后打怪去掉一点血.监视窗口便会出现 一条写入信息 EAX+184 便是血的地址我们要找EAX的值
4.png
我们来搜下 EAX的值,发现搜出3W多个来,没办法只好用OD来找,先把CE在加载游戏一次,因为刚刚监视血值的时候注入了CE的DLL所以,不在加载一次卸载的话 OD是无法注入的

5.png
重新加载一次
QQ20250317-201621.png
图中下段的地方, 就是刚刚找血值代码的地方,这里EDX里是血的值.而EAX+184 则是血的地址.
7.png
图中EDX=135 是血的16进制.而EAX则是我们要找的地址

如何找EAX的值呢?我们先来看看他啥时候开始变化的,我们断了几次发现EAX的值并没有发生改变

8.png
我们现在头部下段,去打怪让血发生变化,然后断下来了
9.png
这里有个对比EAX,如果不为0则跳转.
10.png   
好了,我们开始来找EAX的值,我们先记下EAX的值(这里跟你的不同) EAX=FBB0C8
11.png
在头部下段后,去打个怪 去血 然后断在头部了, 这个时候我们发现EAX的值并不=FBB0C8
12.png
13.png
我们按F8 一直运行一直这里 运行这个CALL后 EAX发生了改变.变成了FBB0C8
然后加上偏移 184 便是我们要找的血偏移

首先来看所有的调用规范都遵循的规定:返回值存储在EAX:EDX中,如果EAX放不下会放到EDX里
而上面的CALL便是 基址的计算CALL 然后返回 基址信息 存放在EAX里.

========================CALL的分析====================

一,先处理堆栈

      这里堆栈只有一个所以我们只需要写一个就可以了
push ecx
call 4265b0

二,堆栈中寄存器值的处理

      这里ECX的值往上找是 [eax] 赋给他的.而EAX的值则是读取了51f1b8  这个基址
mov eax,[51f1b8]
mov ecx,[eax]
push ecx
call 4265b0

三,寄存器的处理

14.png
图中 灰色的寄存器是 寄存器环境的保护.对应下面的POP.
其实这里也是调用约定的范畴.

红色的是需要传入的值,而ESI则是 由ECX传入.所以我们只需要给ECX传值就可以了

这里只有一条 lea    ecx, dword ptr [eax+4DB0]  EAX 的值 已经赋值了
        
mov eax,[51f1b8]
mov ecx,[eax]
push ecx
lea ecx,[eax+4db0]
call 4265b0

四,内存指针地址的处理
    这里没有往内存里写的代码所以略过
五,堆栈的处理

    这里CALL下面没有 堆栈处理.所以可以略过.


=================================分析结束========================

好了 根据调用约定 返回的值一般都放在EAX里 ,而刚刚的跟踪也说明了这一点.

所以我们返回EAX的值  加上偏移就等于 血的地址

mov eax,[51f1b8]
mov ecx,[eax]
push ecx
lea ecx,[eax+4db0]
call 4265b0
add eax,184      '加上184的偏移 相当于 EAX+184
mov eax,[eax]        '读取EAX里的值

好了 血的值就已经读出来了 ,现在我们用CE开辟一个空的地址 来存放血值
15.png
用CE搜0 的值 等CE的搜索按钮能暂停了 立马暂停 然后随便选一个地址

这里我们选的是50f09c


mov eax,[51f1b8]
mov ecx,[eax]
push ecx
lea ecx,[eax+4db0]
call 4265b0
add eax,184
mov eax,[eax]
mov [50f09c],eax        '往50f09c  的指针地址里写入血的值


我们来看看运行的效果

16.png
好了,值我们已经读出来了,如果这里我们转换地图或者等其他操作 不会改变基址的时候,那么我们在程序里只要读一次就够了

0

主题

41

回帖

117

积分

注册会员

积分
117
发表于 2025-3-23 10:47:38 | 显示全部楼层
膜拜神贴,后面的请保持队形~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-4-4 14:25 , Processed in 0.142518 second(s), 26 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

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