此方案的核心思想是"断点".我们知道游戏运行的时候,跑到某个断点就必然意味着游戏世界里发生了某件事情,比如某个断点的EAX里装的是HDC,我就可以把它断下来,然后自己调用字符输出API.
首先利用debug api编制一个小工具.它也是方案中最复杂的一个东西.但它的功能却是很简单.在游戏启动的时候,它根据断点地址表依次设置各个断点,为了让断点数量不受限制,我采用CC断点而不是硬件断点,这增加了复杂性,我在上面折腾了N久才最终调试通过.
所有的断点布置好以后,它就把控制权交给游戏,自己在后台静静等待那一个个断点异常的到来.当收到一个断点后,它完成一些必要的工作后,最关键的就是修改EIP了,这样我们就完成了游戏流程的强制调转功能.所以这个工具可以称为"跳转器"吧,哈哈
为了配合跳转器,必须要修改游戏的原始EXE文件,用编辑器给它增加两个附加段.一个代码一个数据,用来放我们自己的代码和数据.而这两个附加段里的东西,就只能靠用OD来手工硬编码,这活儿可真不是人干的,搞的人晕头转向几乎要吐血.于是我又考虑做一个DLL来装复杂一点的代码.只有体验过硬编码的人才知道回到编译器世界的感觉有多爽了~
那么DLL又怎么挂在游戏进程中去呢,我采用的是修改游戏EXE入口点,游戏一启动先立马跳到我的附加代码段中,在这里用LoadLibary载入DLL.然后取函数地址保存在附加数据段中备用.这样我的DLL就完全成了游戏的一部分,可以尽情为所欲为...~
就这样,断点->跳转器->附加硬编码保护现场->DLL工作函数->返回硬编码恢复现场->返回游戏.
现在试验基本上成功了,只是这种方案实施起来实在叫人晕头转向的,从上面的流程就看出来,要几种工具协同配合,还要非常小心,稍不注意就乱套了.
但是这种菜鸟补丁方案的功能自我感觉还是挺强大的,它可以让我不用去仔细分析那浩瀚的游戏代码,反正随便找到一个断点,就可以干出很多有趣的事情了.太爽啦~~HOHO~~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)