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

 阅读目录

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

发布于:2016-7-12 10:09   |    121600次阅读 作者: 管理员    |   原作者: 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 99opcode修改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、实现代码

替换函数的代码,函数将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

发表评论