随着移动互联网的逐渐升温,移动安全的从业者群体不断壮大,在大牛们的研究与工程下,很多工具也日趋完善。
不过我们依然会问一个问题,仅仅会用工具就足够了吗?
不,不够的,对于一个有志于提高自己技术水平的移动安全从业者,原理与工具同样重要。
因为只有深入了解了原理,我们才会不为名词所惑,明白为什么这样安全,那样不安全。
本次教程将简单快速地讲一讲,什么是加固和脱壳,顺带的实验将帮助你收获一个 “手工脱壳” 的小小成就。
入门向,老鸟勿喷。
如今的应用加固,已经相当普遍。小型开发者会使用私有化加固保护自己的版权防范抄袭,而大型机构则特别注意用商业加固来保护客户端核心业务逻辑免于破解。而各家厂商也在加固中增加了反调试、反Hook、混淆、白盒加密等攻防对抗技术,这往往让许多测试人员十分头疼。
不过说白了,加固的核心原理,其实就是把运行逻辑隐藏起来,或者说,把真实Dex隐藏起来。
其实许多人会发现,把真实Dex从APK文件中隐藏起来,其实并不是一件太难的事情。
安卓提供了动态加载DEX文件的API,只要把Dex文件一加密,在运行的时候解密加载,APK中就看不到原始DEX的文件了。
没错,这就是早期加固的技术,只要找到了API,手写一个玩具也并不困难。
其实早期加固的问题是很大的,因为攻击者很快发现了,不管你再怎么加密,在动态加载的这一刻,内存中总是要出现原始DEX文件。找对时机,Dump一下内存,扣出DEX文件不就行了么?没错,这也就是本次实验的内容。
所以,相对专业的加固厂商为了对抗这一点,采取了类抽取,或者打散DEX内存结构的技术。通过在一定程度上嵌入安卓虚拟机,实现了字节码现用现加载,内存中不再出现完整可Dump的DEX文件了,就算Dump出来,也是一个几乎什么都没有的空壳DEX。
这个,就是市面上常见的免费加固的技术了。
其脱壳方法,在大佬面前也不是秘密,无非是强迫壳回填,或者是遍历内存结构重建DEX文件了。
其实,当谈论到商业级别的加固,其核心技术就不再是DEX的结构和解析了,那并不能满足商业上的要求。
商业加固的核心是编译,将字节码重新编译,并通过编译阶段的混淆和防护,用全新的难以理解的字节码重构应用本身。这不但使得分析变得十分困难,其过程往往还是单向的,从而保证了DEX文件的不可还原。
当然,商业加固还集成了多种攻防对抗技术,单是反调试,就有多种方式在同时检测,想破解就不是单纯某一项技术的对抗了。
实验样本:一个无保护的早期加固技术样本,正好适合本次实验。
APP名称:记账城市(某繁体语言APP,你们懂的)
实验目标:通过内存Dump方式获取其原始Dex文件。
实验工具:IDA、开源工具ExtractDexFromOat、开源工具Jadx
实验准备:
1. 在手机中启动IDA远程调试服务器
2. 在电脑中转发调试端口
在正确的时机找到目标DEX文件,是Dump的第一步。当缺少时机时,有时还需要主动创造时机。
不过本样本缺少保护,也并未清理内存中的DEX文件,所以可以相对简单地定位。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!