前言本文将主要介绍个人在AndroidApp逆向分析中常用的一些工具和技巧。说起Android逆向,就不得不提到常用的逆向分析神器,IDA、jadx、AndroidKiller、JEB。常用工具介绍jadx是一款非常不错的apk反编译工具,可以直接将apk转成java源码,代码还原度高,支持交叉引用等。以一款开源工具为例,结构图反编译后的代码显示效果:排除混淆的影响,代码整体显示效果与原工程基本一致,非常符合逻辑。也可以通过右键查看方法和变量的引用,但是jadx有很多缺点,速度慢。而且不支持变量、方法重命名等,在分析混淆代码时有点力不从心。这里推荐另一个工具JEB。JEB是一款非常优秀的Android逆向分析工具。新版JEB也支持app动态调试,但由于不稳定,暂时不推荐使用。本文使用1.5版本。由于大部分人都接触过JEB,也就知道了JEB的共同特点,本文主要讲解JEB的另一个功能,脚本功能,示例app为RE管理器。反编译后可以看到方法中的大部分字符串都被转换成字节数组了,逆向分析会是个大头。为了解决这个问题,我们可以尝试写一个脚本来恢复这些字符串,打开idea,创建一个java项目,导入jeb.jar(该文件可以在JEB目录下找到),第一步,你需要要知道JEB需要遍历什么方法,这里调用新的String方法将字节数组转成字符串,那么这里需要匹配新的String方法。接下来需要让JEB枚举所有的方法。这里主要使用JEB的插件功能,枚举所有引用签名的方法。好处是可以节省后续匹配更换的时间。找到密钥后自然就开始进行替换和解密操作了。这里主要是遍历迭代所有方法中的元素。获取到元素后,需要先进行过滤。因为是newString,所以需要判断当前类型是不是New。如果是这样,请将签名值与上面的一组匹配。当匹配成功后,就可以获取元素中的值了。拿到值后,需要进行相应的处理,将类型转换成我们需要的字节数组,以后再解密替换。整体逻辑和实现并不复杂。上面的截图也做了详细的注释,处理后的截图丢了:这样分析起来就容易多了。当然,这里只是newString的一个简单例子。同样,对脚本稍加修改即可解密,如des、aes、Base64等加密编码操作。当然,说到逆向工程,不得不提的工具当然是IDA了。作为一款适用于多平台的逆向分析工具,在Android上也很受欢迎。强大的反汇编功能和F5转伪C代码功能给分析人员提供了便利。下面是一个CrackeMe的演示:常见的native方法有两种形式:静态注册和动态注册。静态注册以java开头,以类路径命名,方便查找。双击方法即可来到汇编代码,F5后发现代码少了很多,如下图:在汇编代码状态按空格键切换到流程图,如下:发现方法有两个入口点都被识别了,所以结果很多代码都没有识别出来。找到第一个分支的末尾,在菜单栏中选择Edit->function->removefunctiontail,修改后在菜单栏中点击Edit->other->forceBLcall。之后按F5就可以正常显示所有代码了,动态注册的方式比静态注册的方式在找关键点的时候麻烦一点,而且动态注册必然会在jni_Onload中处理这些函数。以某个so为例,F5后的代码如下你会看到这里有很多偏移地址,其实就是指针在jniEnv中的相对位置。这时候你可以通过导入jni头文件来自动识别。您可以轻松地在Internet上下载此文件。导入后,右键ConverttoStruct,然后代码如下:这里很清楚,调用了RegisterNatives方法注册了两个方法,off_8004记录了方法的偏移地址,双击进入:这里看到了_Z10verifySignP7_JNIENVP8_jobect和_Z13getentyStringv两个方法对应的内容,双击跳转到该方法。当然,这些都是ida的基本功能,新版IDA支持直接对字节码打补丁。不需要像以前那样记录和修改地址,使用16进制编辑字节码由调试器修改,例子如下:在000025C6处,我调用了一个方法检测当前是否处于调试状态。如果程序被调试器连接,它会自动崩溃,readStatus是一个没有参数的void方法。还有返回值,思路很简单,nop方法重新打包,正常调试,在菜单栏选择Options->General,把0改成4,就已经显示了每条指令对应的机器码,就可以了看到readStatus是一个arm命令,修改方法很简单,常用nop方法可以用全0来代替机器码。点击修改命令,在菜单栏中选择Edit->patchprogram->changebyte,将前4个字节修改为00000000,效果如下:可以看到反调试的方法已经清空,那么如何保存修改后的文件也很简单。点击菜单栏中的Edit->patchprogram->ApplypatchestoInputfile,直接点击ok。当然ida有很多小技巧,比如在动态调试的时候改变android_server的默认端口,可以通过反调试过滤掉23946端口的检测。命令为-p123,123为端口号。请记住,-p和端口号之间没有空格。最重要的是AndroidKiller,ak是一款不错的apk反编译集成工具,有不错的smali显示效果和编辑功能,当然作为反编译工具,这些是最基本的功能,ak有个强大的功能就是代码插入,可以稍微封装一下代码,也可以快速插入代码,比如我实现的logplug-in插件,是基于开源项目LogUtils转成smali插件,支持一键输出任何基本类型的数据以及json、Intent等数据类型,使用方法也非常简单。右键单击并选择插入代码。代码只有一句话,其中p0是需要打印的寄存器。在静态方法中,p0代表第一个输入参数。在逆向工程方面,代码插桩可以很好的帮助我们分析数据。这些插件我都发布在网上了,可以下载。总结本文主要介绍AndroidApp逆向工程中常用的工具及其一些使用技巧,但相同的工具和常用的技巧往往不足以进行逆向工程。需要大家的尝试和耐心,也需要自己的逆向研究精神。
