FPS游戏自瞄透视之模块动态加载

本文详细解析了游戏开发中遇到的动态加载基地址问题,解释了为何某些游戏的代码段和数据段地址每次运行都会变化,并提供了通过获取模块句柄来定位具体地址的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用OD附加游戏进程,

进入OD主界面以后,

我们CTRL+G 跳转到地址 00401000(系统默认通常游戏领空的起始地址)的时候发现了错误。

 

也就是说代码段不在这了, 那跑哪去了?

 

为什么会有这样的错误呢?

首先我们先来看看什么是基地址

我们随便找一个其他游戏CE附加

 

 

如上图,基地址  00D0DF1C  实际上是可以继续拆分,我们直接写00D0DF1C其实是不对的。

他等于 游戏主模块句柄也就是 xxxx.exe  + 90DF1C,

而这个游戏主模块句柄 ,一般是固定的 , 系统为其分配成00400000。

00D0DF1C = 00400000 + 90DF1C

由于这个00400000 是不变的, 所以 00D0DF1C 也是不变的 ,我们就没有继续拆分了。

 

但是并不是所有游戏, 这个模块句柄 都是不变的。

也有游戏模块动态加载的,那今天这个游戏就是动态加载。

 

无论是代码段还是数据段都是动态加载的。

加载的地址每次变化,代码地址当然也是跟着搬家,每次变化了,加载的地址变化,模块句柄每次

变化,未拆分的基地址当然也是变化的,很好理解。

 

下面来个例子

OD附加上游戏进程

我们点开E模块窗口

发现游戏模块句柄不是00400000 而是12D0000

那么这种情况就是模块动态加载

模块句柄每次都是不一样的

我们重新启动游戏,此时 又变成了  1300000

我们双击进入游戏领空

 

由于模块是动态加载的

基地址和代码段地址,都是由模块句柄 + 偏移所得,所以每次启动游戏

他都是动态的。

 

例如我们随便到游戏里找一个有基地址的地址

该地址是  1301041 我们把他拆分成 模块句柄 +偏移

1301041 =  1300000 +1041 = 模块句柄 +1041

以后我们想直接到这个地址  就要 用 模块句柄 +1041了

 

 

同样基地址我们也进行拆分

22D92C0 = 1300000 + FD92C0 = 模块句柄 + FD92C0

我们想直接使用这个基地址就要用  模块句柄 + FD92C0了

 

 

那么模块句柄怎么获得呢?

用GetModuleHandleA这个函数就可以了

例如:

DWORD 模块句柄 = (DWORD)GetModuleHandleA("Crossout.exe");

 

 

用这样的方式就和固定加载00400000的游戏没有区别了

以后本游戏中所有基地址都以该方式表达。

 

转载自任鸟飞公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值