一个老游戏hook c++函数

一个十几年前就停服的老游戏,从塞班系统到运营到ios系统。
因为我本身是个小白,所以写的可能乱七八糟,或者是完全错误的,大家理解。
游戏没有开启aslr,ida里面看见的地址就是实际可以下断或者hook的地址。

打开游戏
查看日志
Jul 13 09:23:06 LFMMDteki-iPhone Anrufen_OL[4006] : CGameUpdate::ChangeState: 1

Jul 13 09:23:06 LFMMDteki-iPhone Anrufen_OL[4006] : CGameUpdate::ChangeState 1: 1

Jul 13 09:23:06 LFMMDteki-iPhone Anrufen_OL[4006] : CGameUpdate::ChangeState 2: 1
可以看见打印了一些ChangeState,游戏因为需要联网获取更新,获取更新文件,等等操作。但是游戏停服了,这些肯定是走不通的。
把游戏执行文件拉进ida里面


哦豁!armv6 armv7 好像是3gs时代的玩意啊,其实就是的。
随便选择一个armv7进去吧
等待了一段时间以后,ida解析完了。

都是明文的函数名字,基本上没有sub_xxxx

按照这个推测,log打印的字符串应该是可以搜索到的


搜索到了很多啊。凭借我不多的知识,我认为%d应该是打印相关的部分会使用到的。点开这个代码

头皮发麻头皮发麻
F5启动!

稍微可以看看了。
里面的代码主要写了一个case,然后根据传递的数据执行具体的动作。
动作的主要过程就是从资源文件string_res.godat里面获取到网络资源的url信息,然后执行下载。
可是,服务器他不存在了啊,这不是完犊子了。
一开始我试图解密string_res.godat,修改以后替换回去。 分析了好久的文件,还研究了Quick BMS
没有成功

然后就回来继续看伪代码。case ?
这玩意应该是一个流程控制吧。
void __fastcall CGameUpdate::ChangeState(CGameUpdate *this, int a2)函数原型是这样的。
this应该是一个隐式参数,大概就是返回值的东西
int a2就是传进来的参数。
那就先操作一下看看。
void __fastcall CGameUpdate::ChangeState(CGameUpdate *this, int a2)函数原型
tab切换asm
__ZN11CGameUpdate11ChangeStateEi这个是c++函数经过编译器重命名的函数名字。

参考http://www.cydiasubstrate.com/api/c/MSHookFunction/里面说的写出来以后。

好像不行,想起来大佬在群里说过,函数需要使用这个函数搜索MSFindSymbol


写成了这样的一个代码,先hook以后,看看具体是怎么样的一个流程。
过程中发现他是需要多次调用这个函数的的。

分析代码(眼睛看看的),发现,代码里面需要下载txt文本的,就是前面的部分,所以就一次次的修改a2的数据,尝试跳过。最终发现21和16是不能跳过的,其他的下载文本,根据文本更新文件的是可以跳过的。

写起来大概用了1小时,实际上因为不是专业的,正逆向开发都是小白。断断续续其实有大半年了。抽空就看看,抽空就看看。
这个游戏还是非常适合练习的,没有混淆,函数名基本上都有。
最终结果是成功进入到了游戏的主界面。比永远显示正在下载公告进了一大步。

没有hook之前


处理之后