特此申明:本文涉及的代码与分析内容仅供学习交流使用,任何个人或组织不得使用文中提到的技术做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。
测试环境红米TD版 MIUI-JHACNBA13.0(已越狱) 叉叉助手Beta1.1.2
使用工具Apktool Ddms jd-gui
程序分析 在分析程序之前,我首先去下载了《欢乐斗地主》、《全民飞机大战》、《天天酷跑》三款腾讯的热门游戏,打开xx助手,界面如图1所示。 图1 此时,xx助手已经检测到机器上安装的游戏了,在xx助手里面下载相应游戏的辅助程序之后点击“启动游戏”来打开天天酷跑,界面如图2所示。 图2 很明显,从xx助手中打开游戏会发现右边多了一个设置按钮,点击设置,在弹出的界面中我们可以设置相应的“飞行距离”、“奖励倍数”等。 打开DDMS,使用FileExplorer工具定位到/data/data/com.xxAssistant,查看目录结构如图3所示。 图3 仔细查看图3中的app_plugin目录,发现其中恰好有三个子级目录,分别对应了酷跑,欢乐斗地主和飞机大战的辅助插件。 到目前为止,单从这个目录结构中,我们大致可以得出如下一个猜想,即:xx助手主程序只是一个启动器,用来启动各个游戏辅助,更多时候,可以把它理解为是一个游戏辅助的发布平台,本身并不具备修改游戏的功能。而每一个插件目录才是具体实现某个游戏的辅助程序。例如,拿103目录来说,xxUI.apk是上述图2中看到的那个游戏中出现的设置界面,libxxkupao.so是实现hook游戏关键函数,修改游戏功能的重要库文件,而xxplist可能是某个配置文件。为了印证自己的猜测是否正确,我们利用工具把103插件目录导出到本地来做详细分析。
验证猜想 1、com.tencent.pao.xxplist 用文本编辑器打开插件目录下的com.tencent.pao.xxplist文件,内容如图4。 图4 经过简单的分析,此文件确实是为xx助手的配置文件。其中,game-name字段为被操作的游戏包名;apk-path字段为具体辅助的apk文件;ui-name字段则是辅助启动后的主Activity;activity-name字段为游戏的主Activity;so-path字段则为具体实现hook游戏相关函数,patch游戏进程的主要文件。
2、xxzhushou_android.apk 此apk文件为xx助手的安装文件,经过详细分析,xx助手主程序主要实现了下载指定游戏辅助、启动游戏、解析上述xxplist、把辅助dex注入到游戏进程等功能。而且这一整套东西的实现与具体的某个游戏是松耦合的,堪称是一个游戏辅助的发布平台呀。(由于我们今天主要分析的是游戏辅助的实现原理,下回有时间再写一篇详细分析xx助手的文章,所以在这里,关于xx助手本身的功能就先一笔带过了)
3、xxUI.apk 这个包文件是进入游戏之后主要显示的辅助设置界面,具体如图2所示。下面我们来具体分析下其实现原理。 解包xxUI.apk,使用JavaDecompiler工具查看解密出来的类java代码,代码结构如图5所示。 图5 发现代码并没有经过加密混淆,下面我们首先来看看xxkupao这个类的实现,如图6所示。 图6 这个类的init函数首先保存so path路径,然后调用show函数初始化界面布局。show函数中调用initView来创建Setting和About View,并使用线性布局来排版界面。接下来我们来看看Setting View的实现,如图7。 图7 这个Setting View类的大致功能是,首先保存so文件的路径,即/data/data/com.xxAssistant/app_plugin/103/libxxkupao.so,然后调用initNativeFunc函数加载so文件,并开始patch游戏的相关函数,接着调用initView函数初始化界面中的各种控件。 具体来看下initNativeFunc函数,图7中这个函数反编译出来的代码并不是很准确,大致的代码应该是这样的,如图8所示。 图8 InitNativeFunc函数首先加载so文件,然后通过调用set方法设置相应的辅助属性。最后判断CPU的类型,实施不同的hook方案(因为天天酷跑这个游戏会根据CPU的不同而释放不同的游戏so文件,所以hook的时候代码偏移都有所不同,这里hook方案的不同主要就是为了配合游戏释放出来的文件不同)。其中这里的set方法和xxdohook函数都是JNI调用,即在java层中调用底层c或者c++的代码,不知道这方面知识的同学可以学习下NDK开发。
楼下继续
|