Android加壳与脱壳(2)——制作简易的第一代加壳机
一、前言
前面我在看雪论坛上发表的两篇文章都讲解了第一代壳的加壳原理和脱壳原理
Android加壳脱壳学习(1)——动态加载和类加载机制详解
但是不少朋友仍然私信说有没有完整的项目,由于最近一直很忙,就没有从头实现一个简易的第一代壳加壳机,恰好最近看见看雪有大佬的一篇文章Android 简单加密壳,这篇文章很详细的讲解的整体加壳的原理和实现的思路,于是我进行了编译了源码,而其中发现签名有一点问题,并进行了小小优化,然后打包提供给大家使用
源项目地址:https://github.com/overturncat/reverse_android/tree/master/ApkPacker
修改后的项目地址:github后续上传
二、原理解析
前面的两篇文章,我已经很详细的讲解了第一代壳动态加载的原理,不清楚的可以先去阅读前面的两篇文章,下面我主要分析上作者项目的大致流程和结构
首先我们回顾一下动态加载整体加壳的实现流程:
(1)代理启动:APK首先启动壳程序的Application,在壳程序的Application中的attachBaseContext
和onCreate
中依次完成源程序的解密和动态加载
(2)动态加载:壳Application中要完成classLoader的替换,然后用替换后的classLoader去加载源程序dex,就可以执行正常的代码
流程很简单,具体设计的步骤:
(1)制作壳dex代理类:负责完成解密和动态加密,如果源dex没有加密则不需要解密
DummyApplication:
功能:完成类加载器替换和动态加载
(2)使用apktool解压源程序
(3)修改源程序AndroidManifest中的Application为壳程序DummyApplication,即修改入口点
(4)将源程序dex拷贝到asset下,用于后面动态加载
(5)删除源程序的smali文件夹,替换为壳程序Application的smali代码
这样就将源程序的smali代码全部替换为壳程序代码,而源程序源码保存在asset下,就可以用壳程序代码去动态加载源程序,实现简易加壳
(6)然后重打包签名即可完成
补充一下:原作者的ApkPacker更新了两个版本,第二个版本主要是考虑源APK本身含有代理类Application的问题,然后进行了解决,大家可以查看源码
三、使用
其实理解了动态加载和加壳的原理,制作一个简易的加壳器是十分简单的,这里我编译时发现作者的签名会报错,然后对签名替换了一下,还优化了路径并进行打包,方便大家使用,最后的项目文件:
sign是用于签名的,这里我进行了更改
out是输出结果的文件夹,里面包含加壳后签名和未签名两类
dummyDexSmli是壳程序,大家想制作自己的加壳器,这里自己可以参考作者的代码进行修改,比如还可以加解密等等
使用:
sh ApkPacker.sh apk路径
环境:jdk18
测试:
这里我随便编写一个样本,然后使用GDA打开
可以发现源代码十分的简单,然后我们使用加壳工具
这里生成了加壳后的签名和未签名的样本,我们可以直接运行的是签名的样本,我们首先查看加壳的效果
大家是不是觉得和一些厂商的类型似曾相识呢,这里就实现了简易的第一代加壳器,当然我们可以看是否能运行
成功运行,说明是可以使用的
四、总结
当然这种加壳方式是十分简单的,这里可以进行加密、采用不落地加载、再慢慢到抽取壳、dex2c/dex-vmp,大家是不是发现加壳技术的发展也是一步步实现的,脱壳的方法我前面文章已经讲了,这里的加壳方法由于未加密,使用其他工具甚至可以直接查看
使用jadx-gui还是可以查看到源码,这是因为GDA和jadx-gui的解析方式不一样,不过如果我们加密了,jadx-gui就无法很好查看了
最后这里我是接原作者的ApkPacker给大家再一次梳理的简易加壳器的步骤,其实核心原理大家看我前面两篇文章就可以掌握
加壳器存在知识星球:安全后厨,后面上传github
后续会陆续讲解简易抽取壳的实现,简易dex-vmp的实现以及相应的脱壳方案,大家可以关注微信公众号:安全后厨
五、参考链接
https://bbs.pediy.com/thread-273880.htm#msg_header_h2_1
https://github.com/overturncat/reverse_android/tree/master/ApkPacker