【游戏逆向】FPS游戏自瞄透视模块动态加载分析

用OD附加游戏进程, 进入OD主界面以后,我们CTRL+G 跳转到地址00401000(系统默认通常游戏领空的起始地址)的时候发现了错误。【游戏逆向】FPS游戏自瞄透视模块动态加载分析_第1张图片
也就是说代码段不在这了, 那跑哪去了? 为什么会有这样的错误呢?
首先我们先来看看什么是基地址我们随便找一个其他游戏CE附加【游戏逆向】FPS游戏自瞄透视模块动态加载分析_第2张图片
如上图,基地址 00D0DF1C 实际上是可以继续拆分,我们直接写00D0DF1C其实是不对的。
他等于 游戏主模块句柄也就是 xxxx.exe + 90DF1C,
而这个游戏主模块句柄 ,一般是固定的 , 系统为其分配成00400000。00D0DF1C = 00400000 + 90DF1C
由于这个00400000 是不变的, 所以 00D0DF1C 也是不变的 ,我们就没有继续拆分了。
但是并不是所有游戏, 这个模块句柄 都是不变的。
也有游戏模块动态加载的,那今天这个游戏就是动态加载。
无论是代码段还是数据段都是动态加载的。
加载的地址每次变化,代码地址当然也是跟着搬家,每次变化了,加载的地址变化,模块句柄每次
变化,未拆分的基地址当然也是变化的,很好理解。
下面来个例子
OD附加上游戏进程我们点开E模块口【游戏逆向】FPS游戏自瞄透视模块动态加载分析_第3张图片
【游戏逆向】FPS游戏自瞄透视模块动态加载分析_第4张图片
发现游戏模块句柄不是00400000 而是12D0000
那么这种情况就是模块动态加载模块句柄每次都是不一样的
在这里插入图片描述
我们重新启动游戏,此时 又变成了 1300000
我们双击进入游戏领空
由于模块是动态加载的【游戏逆向】FPS游戏自瞄透视模块动态加载分析_第5张图片
基地址和代码段地址,都是由模块句柄 + 偏移所得,所以每次启动游戏他都是动态的。
例如我们随便到游戏里找一个有基地址的地址
该地址是 1301041 我们把他拆分成 模块句柄 +偏移1301041 = 1300000 +1041 = 模块句柄 +1041
以后我们想直接到这个地址 就要 用 模块句柄 +1041了
同样基地址我们也进行拆分
22D92C0 = 1300000 + FD92C0 = 模块句柄 + FD92C0
我们想直接使用这个基地址就要用 模块句柄 + FD92C0了
那么模块句柄怎么获得呢?
用GetModuleHandleA这个函数就可以了例如:
DWORD 模块句柄 = (DWORD)GetModuleHandleA(“Crossout.exe”);
用这样的方式就和固定加载00400000的游戏没有区别了以后本游戏中所有基地址都以该方式表达。

你可能感兴趣的:(文章,游戏,windows)