游戏安全实验室 › 首页 ›技术入门 › 查看内容

 阅读目录

实战篇——第二道习题及答案

发布于:2016-7-12 10:09   |    123425次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

题目:

开发实现2048游戏快速通关功能,通过注入方式实现外挂功能


习题答案:

1、实现思路

下面讲解几种思路及其实现方式,然后挑选一种进行实现:

1. 第一种实现思路,利用inlineHook实现,属于最常见的功能实现方式,可利用Cydia Substrate 组件libsubstrate.so模块的MSHookFunction函数对Playground::addBoxAtIndexWithLevel方法进行Hook操作(前面Hook章节讲解了InlineHook实现,读者也可自实现InlineHook),通过新函数代替旧函数,把传入的第三个参数,即R2,修改为某个数再传入原函数执行。

2. 第二种实现思路,采用导入表Hook的方法(前面Hook章节讲解了导入表Hook实现),对导入函数arc4random()进行Hook操作,然后利用_Unwind_Backtrace,_Unwind_GetIP以及dladdr函数得到调用者(caller)的信息,判断如果是Playground::addBoxAtIndex调用,则将返回值设成 0,如此便可每次生成值为2的Box。

3. 第三种实现思路,采用异常Hook和导入表Hook的方式。与第二种类似,首先在Playground::addBoxAtIndex中的arc4random调用之前设置异常Hook,并计数。然后对arc4random函数设置导入表Hook,在新的arc4random函数replaced_arc4random中监控异常Hook运行的次数,每运行一次,replaced_arc4random的返回值为0,如此便能一直生成值为2的Box。

4.第四种实现思路,采用动态patch代码的方式进行。分析到Playground::addBoxAtIndexWithLevel的第三个参数只会进入Box::setCurrentLevel方法,那么只需要将“04 99”opcode修改为“0B 21”,修改前对应的代码如图1所示,修改后的代码如图2所示。

图1 修改前的代码

 

图2  修改后的代码

5. 第五种实现思路,采用静态patch代码的方式进行。与第四种类似,但是这种方法不用自己写代码,只需要用十六进制编辑工具静态修改libcocos2dcpp.so的对应的opcode,然后保存好这个文件,将其放入Android手机中,替换/data/data/com.estoty.game2048/lib/libcocos2dcpp.so文件,然后启动游戏即可。

介绍完五种实现思路,选择第一种实现,其他思路读者有兴趣可以自行实现。

2、实现原理

第一种思路用到的两个关键的知识点,分别为:注入和inlineHook,2048游戏没有反调试和反注入,读者可以参考《Android平台Ptrace注入实现》和《Android平台inline hook实现》两篇文章,将核心功能模块以ptrace方式注入到游戏的进程中,然后再利用dlopen 打开libsubstrate.so,利用dlsym获取MSHookFunction函数,通过调用MSHookFunction函数实现InlineHook目标函数。

3、实现流程

快速通关功能的详细实现流程如图3所示:

图3  外挂代码执行流程图

4、实现代码

图3 是替换函数的代码,函数将r2寄存器数值修改为11,然后将篡改之后的数值传入旧函数中。

 

图4 替换函数的代码

 

Inject_entry是注入程序后执行的入口函数,函数实现如图4所示,需要在Inject_entry函数内实现InlineHook操作。测试实例使用Cydia SubStrate组件提供的Hook功能,通过调用MSHookFunction函数实现InlineHook操作。

 MSHookFunction接口函数需要从libsubstrate.so文件中获取,获取方式为:通过dlopen打开libsubstrate.so文件,通过调用dlsym解析并获取MSHookFunction函数信息。

接下来需要获取将要Hook的_ZN10Playground22addBoxAtIndexWithLevelEiib函数地址信息,可通过两种方式实现,分别为:

1)通过dlsym方式获取_ZN10Playground22addBox AtIndexWithLevelEiib的返回值为该函数在内存的地址。

2)通过遍历进程模块信息,获取逻辑So模块的基地址信息,通过静态分析获取addBoxAtIndexWithLevel函数相对偏移,然后通过so基址+偏移地址得到需InlineHook的函数内存地址。

 

图5 执行Hook操作的函数

5、测试结果

编译好代码后,连接Android手机,打开游戏,执行下图5所示的命令,然后直接玩游戏即可取得胜利:

                图6测试执行过程

游戏中快速通关功能实现效果如图7 所示:

 

  图7 执行外挂后玩游戏截图

从结果来看,猜测和推论是正确的,功能的实现是可行的。那么在Android环境下2048游戏可以实现快速通关的功能。如果读者有兴趣可尝试修改分数的话,也可实现相关功能。

 

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩2 赞0

收藏

上一篇:实战篇——第一道习题及答案

下一篇:Unity3D引擎框架及用户接口调用方式相关分析及汇总

最新评论
B Color Image Link Quote Code Smilies

发表评论