【逆向知识】单机游戏去启动广告
前言
很多网站下载出来的游戏很多都在启动游戏添加了广告程序,A广告嵌套B广告,再由B广告启动游戏。广告启动后关掉广告窗口,游戏也会被关掉,还会弹出一个网页广告。并且知道游戏的主要程序名后也无法打开游戏,因为游戏的PE文件被修改了,无法正常打开主游戏文件。
工具
小生我怕怕版本OD
收集信息
分析广告程序首先要确定出游戏的编程语言,可以利用PEID扫描文件夹的功能扫描文件信息提取特征。通过PEID的信息可以看到原本的游戏是VC++所编写的,而广告程序是被加壳的,壳是Aspack 2.12。而这个壳是没有必要去脱的。
动态调试
破解之前需要初步清晰动态调试的思路,程序广告程序的流程是A广告调用B广告,B广告调用游戏的主要进程。这些过程中必定会使用windows API 【CreateProcess】。即使知道游戏的主要程序名也无法打开游戏。因为游戏的正常PE文件被修改了,广告文件每次运行前会在内存中把exe修改回原来的内容。
【1】 使用OD的API断点功能,使用快捷键【Ctrl+G】,跳转到【CreateProcess】、【WriteProcessMemory】处进行断点。
【2】从内存中转存出正常的文件。
去启动广告调试过程
打开广告程序后,使用OD附加广告的进程。
使用快捷键【Ctrl+G】,跳转到【CreateProcess】、【WriteProcessMemory】API函数处。可以选择图形化界面操作OD反汇编界面右键-【转到】-【表达式】。也可以OD反汇编界面右键-【查找】-【当前模块中的名称】,将【CreateProcessA】、【CreateProcessW】的位置下断点。
F9运行后,会在断点的位置堆栈窗口中查看到B广告程序的名称。图的OCX文件是对象类别扩充组件(Object Linking and Embedding (OLE) Control Extension),可执行的文件的一种,但不可直接被执行,与 .exe、.dll 同属于PE文件。
在进入创建进程函数后,可以狂按F8单步步过,在OD菜单栏选择【调试】-【执行到返回】就可以自动跳转到ret指令处。
为了调试OCX的文件,我们需要另外启动一个OD进程,依然是选择OD菜单栏的【文件】-【附加】以附加进程调试的方式操作。再重复之前的步骤,使用快捷键【Ctrl+G】,跳转到【CreateProcess】、【WriteProcessMemory】API的位置。
这里有两种方法:
第一:可以选择图形化界面操作OD反汇编界面右键-【转到】-【表达式】。
第二:可以OD反汇编界面右键-【查找】-【当前模块中的名称】,将【CreateProcessA】、【CreateProcessW】、【WriteProcessMemory】的位置下断点。
在【WriteProcessMemory】处下断点是因为B广告程序运行后要在内存中把游戏的主要程序修改回来的话,会调用到这个Windows API。
F9运行后点击B广告的按键让程序执行起来。
F9把程序运行起来后,可以在OD堆栈窗口中查看到游戏的主要进程名字,且同时注意到进程的当前状态是挂起的。
推测B广告将进程挂起正是为了将exe的正常字节在内存中修复然后在恢复进程的运行,进入【WriteProcessMemory】这个API函数后,使用快捷键【Ctrl+F9】执行到函数结尾处。
为了调试游戏主要程序,还需要另外开启一个OD将游戏的进程附加进行调试(OD菜单栏的【文件】-【附加】以附加进程调试的方式操作。),从内存中转存出正常的文件。
跳到函数末尾处,F7或F8跳到下一条指令处。
75401E80 C2 1400 retn 0x14
在调试游戏主程序的OD反汇编界面,点击【E】跟随游戏进程跟随入口。
在入口点(OEP)处,右键选择【OllyDump脱壳调试进程】
把入口点的地址填写到输入框中,但是左下方的重建输入表的勾不要去点,因为会导致程序运行不起来再次重新修复一次。点击【脱壳】生成文件,就可以得到游戏的主要程序了。
恢复游戏主程序成功!
文中涉及的游戏程序