某移动应用安全加固与脱壳技术研究与实例分析

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.apk

ZjDroid版本: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 了,但未测试收费的加壳服务不知道能不能脱壳,后面有机会再测试,脱壳过程主要是研究各个工具的使用,均是利用工具自动化方式来实现,后面有机会尝试手动脱壳测试。还有其他厂商的加固,如梆梆,腾讯,爱加密等,如果有兴趣也可以一一进行尝试。

本文作者:逢魔安全实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/70232.html

Tags:
评论  (0)
快来写下你的想法吧!

逢魔安全实验室

文章数:13 积分: 20

逢魔安全团队(FormSec)是一支民间非企运营的信息安全技术研究团队。团队恪守职业道德,遵守法律法规,以知识共享、技术传承、帮助团队成员成长、构建新的网络安全人才体系为最终夙愿。

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号