01 概述
—
由于近期很多朋友问关于Android加壳与脱壳技术,这两天我就对目前主流的脱壳工具和加壳方法做了研究,就对目前的脱壳方法做个汇总和方法记录。
首先目前市面上有很多的安卓脱壳工具,主流的有DexExtractor, ZjDroid, drizzleDumper,其中前面的2个工具与后面的工具略有不同,文章会一一对工具进行分析和尝试脱壳,各个工具的使用都在手机root的环境下进行的,并且在实体机上进行,所以如果有读者尝试破解的话建议还是在实体机上进行。
其实对于加壳的方案很多加固尝试都做了什么防动态调试等等措施,所以整体来讲,Android的加壳技术也提升了不少。对于工具DexExtractor, ZjDroid,主要基于hook的拦截系统加载的dex文件,然后直接从手机内存中dump出dex数据,然后直接把dex转化为jar即可看到客户端的源码。但工具drizzleDumper的脱壳原理略有不同把,这个工具主要原理是附加目标程序,寻找内存段,然后对dex的头部信息进行dump,此种方法可以获取到程序的比较完整的dex文件,但对于前两个工具,由于是hook拦截,所以可能拦截不全,造成了无法抓取完整的dex文件。
02 脱壳研究与测试
—
关于DexExtractor的脱壳原理网上已经有很多的文章,这里可以参考一个文章,原理写的比较详细:https://www.cnblogs.com/jiaoxiake/p/6818786.html
这个工具的使用和下载可以参照,https://github.com/lambdalang/DexExtractor,这个工具的使用环境实在太难弄了,之前好不容易弄到了系统的镜像,但还是没有脱壳成功,这里就不示范了,意义不大,有兴趣的可以研究一下。
关于工具ZjDroid,这个工具网上也有很多的文章提到,也是目前大多数人用的工具,但笔者今天测试,发现ZjDroid有局限性,最新的壳可能无法脱。ZjDroid是基于hook的,所以使用需要xposed框架,在安装xposed框架需要注意一点,目前搜索到的xposed框架版本主要是3.0以上的,但xposed框架3.0以上的系统安装在Android4.0系统,否则可能安装不是,如果大家需要将xposed框架安装在Android4.0以上,那就需要安装xposed2.7一下的xposed版本了,笔者对这个也是做了多次尝试才弄清楚,所以今天笔者尝试的脱壳资源如下:
Android版本:Android4.1.2应用名称:微恋交友(com.thsseek.welove_29.apk)Xposed版本:de.robv.android.xposed.installer_v32_de4f0d.apkZjDroid版本:V1.0手机权限:已root的实体机壳类型:某数字免费壳 |
---|
在脱壳之前,我们首先用apktools的反编译IDE工具JEB尝试反编译,如下图所示:
从图中可以看到,核心代码一个也没有,只反编译出了壳代码,这里很明显是qihoo,即360的免费加壳,查看stub包,里面包含了加载加密资源的路径和方法:
其中的libjiagu就是核心资源文件,那这个文件在哪里呢,我们解压开apk程序就可以看到,如下图所示:
好了,既然无法直接利用apk的IDE工具直接反编译出核心源代码,那么就尝试脱壳吧。首先利用利用工具zjdroid。在xposed里面配置好模块就可以了,如下所示:
第一步:运行程序,如图所示开始运行目标程序:
第二步:手机连上电脑,打开手机调试模式,然后获取进程号:
adb shell dumpsys activity top|more |
---|
以上就获取到了目标程序的进程号和进程名:com.thsseek.welove 进程号:22886
第三步:查询dex信息所在的内存位置:
am broadcast -a com.zjdroid.invoke --ei target 22886 --es cmd '{action:dump_dexinfo}' |
---|
第四步:监控logcat日志信息
logcat -s zjdroid-shell- com.thsseek.welove |
---|
如图所示获取到apk的位置filepath:/mnt/asec/com.thsseek.welove-1/pkg.apk
第五步:重新开一个adb shell,然后执行一下命令:
am broadcast -a com.zjdroid.invoke --ei target 22886 --es cmd '{action:backsmali, "dexpath":" /mnt/asec/com.thsseek.welove-1/pkg.apk "}' |
---|
查看logcat窗口,发现已经dump 出dex数据:
导出dex数据/data/data/com.thsseek.welove/files/dexfile.dex,然后利用逆向助手,将dex文件转化为jar文件:
然后利用gd-gui查看代码:
可以看到,虽然我们dump了目标程序,并且成果获取到dex的数据,但是代码中还是壳的信息,并没有核心代码,这个问题其实主要还是因为hook的局限性吧,并不能正确的获取到dex的开头信息。
接下来测试工具drizzleDumper,此工具有x86和非x86平台的,使用的时候按需使用。如图将drizzleDumper传到手机的tmp文件下面:
给drizzleDumper赋予777的权限:
接下来按照之前的方法,获取当前目标程序的进程号和包名:
dumpsys activity top |more |
---|
然后根据进程号看一下maps表:
Cat /proc/2886/maps|grep com.thsseek.welove |
---|
接下来运行脱壳程序进行脱壳,这里比较简单了,直接运行脱壳程序,参数就是进程名,如下:
./drizzleDumper com.thsseek.welove |
---|
脱壳成功,并且将dex文件保存在/data/local/tmp/com.thsseek.welove_dumped_75.dex路径,我们导出文件:
然后对dex文件转化为jar反编译查看代码:
点击操作就完成了脱壳操作了:
03 总结
通过对3款Android应用的脱壳工具的测试,效果最好的就是drizzleDumper 了,但未测试收费的加壳服务不知道能不能脱壳,后面有机会再测试,脱壳过程主要是研究各个工具的使用,均是利用工具自动化方式来实现,后面有机会尝试手动脱壳测试。还有其他厂商的加固,如梆梆,腾讯,爱加密等,如果有兴趣也可以一一进行尝试。