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

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

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web

vue.js环境搭建

2143
来自专栏linux驱动个人学习

线程详解

以下内容摘自《程序员的自我修养》 什么是线程? 线程(Thread),有时被称为轻量级(Lightweight Process, LWP),是程序执行流程的最小...

3725
来自专栏张戈的专栏

WordPress评论ajax动态加载,解决静态缓存下评论不更新问题

这是一个历史遗留问题,自从博客部署了 PHP 纯静态缓存之后,所有页面都是 html 静态内容了,而且在七牛 CDN 静态分离之后,速度更是达到极致! ? 不过...

3916
来自专栏技术博客

菜菜从零学习WCF一(WCF概述)

  菜菜刚开始接触WCF,一切都要从零开始,所以在此也记下笔记,以作日后翻看,大家也可以多多指点。

2342
来自专栏企鹅号快讯

做网站-推荐3种CSS,JS合并的方式

在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一些问题,如,页面引入的的js,css越多的话,那么对就增加了...

67911
来自专栏码神联盟

灵丹妙药 | 关于缓存,你必须要知道的

这两天小编一直在总结缓存的要点,也同时参考了一些文档,仅此奉上,以供参考。 缓存是必备技能 身为后端开发的开发人员,缓存是必备技能。不需要花费太多的精力就能显著...

3577
来自专栏信安之路

绕过内容安全策略总结

今年的 0CTF 预选赛 6 道 web 题,其中三道都涉及 CSP 的知识点,简直可怕。。。这次趁着空闲时间就稍稍总结一下 CSP 绕过方面的知识,无论是对以...

2150
来自专栏JAVA烂猪皮

大型分布式网站架构:缓存在分布式系统中的应用

缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。

1562
来自专栏Java技术栈

Redis 的 4 大法宝,2018 必学中间件!

Redis是什么? 全称:REmote DIctionary Server Redis是一种key-value形式的NoSQL内存数据库,由ANSI C编写,遵...

3975
来自专栏程序员互动联盟

【线程池】线程池与工作队列

为什么要用线程池? 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式...

3568

扫码关注云+社区

领取腾讯云代金券