阅读目录
实战篇——第二道习题及答案
发布于: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 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游戏可以实现快速通关的功能。如果读者有兴趣可尝试修改分数的话,也可实现相关功能。
|

最新评论
发表评论