声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
前言
在上一篇中,我们列举了互联网上常见的脱壳工具以及如何使用他们。
这本篇中,将会讲解一代壳整体加固中的落地加载方式。
N代壳的两种说法
在我学习和阅读其他师傅的文章时,发现对几代壳的理解有两种。
上一种将整体加固统一当成一代,我觉得哪种说法都可以。本文以教学为目的,所以就以划分更详细的第二种为主。
下面文章将介绍一代壳中(落地加载)方式。
-
• 通过apksheller对APK进行加固。 -
• 正向分析壳的代码逻辑。 -
• 010Editor手动修复dex。
一代壳的原理
过程中涉及到的修改AndroidManifest.xml和资源文件等在下面的解释中忽略了。
详细过程请参考:https://bbs.kanxue.com/thread-286929.htm
加固过程
将原DEX添加到壳DEX尾部。
解密过程
读取DEX文件,将解密后的DEX保存到本地,然后再加载到内存中使用。
apksheller对APK进行加固
apksheller项目地址:https://github.com/yongyecc/apksheller
下载项目,安装依赖
pip install pillow filetype
以frida-labs中的frida0x1为例
python sheller.py -f Challenge0x1.apk
注意:
-
1. 路径中不要存在空格和中文字符。 -
2. apksheller不支持多dex的APK加固。多dex加密是付费功能,不过我们只是学习,也不需要。
编译成功:result.apk
jadx反编译
成品APK可在文章最后的知识星球获取。
分析代码逻辑
Android 应用启动时,关键生命周期方法的执行顺序通常是Application.attachBaseContext->Application.onCreate->MainActivity.onCreate
我们搜索实现attachBaseContext的类。
壳程序 cn.yongye.stub.StubApp
StubApp继承Application类,重写attachBaseContext方法。
-
1. 构造解密后dex路径 /data/user/0/com.ad2001.frida0x1/files/yongye.dex
-
2. 将路径和dex文件传入FileUtils中进行解密
-
1. 将传入的byte[] dex 文件解密,也就是对该字节数组与255(0xff)进行异或。 -
2. 取解密后的dex的最后四个字节,即原始dex的大小,保存到bArr2中。 -
3. 将原始的dex拷贝到bArr3中 -
4. 将原始dex写入文件,路径是 /data/user/0/com.ad2001.frida0x1/files/yongye.dex
我们查看解密后的dex文件:
这就是一代壳中的落地加载。
在010Editor中手动修复
在上一部分,我们分析了代码逻辑,原始dex文件是拼接在壳dex的后面的,也就是说,用的是比较简单的异或形式,我们完全可以手动修复。
解压APK文件,用010Editor打开classes.dex,执行DEX脚本。
可以看到最后有一大块解析不了的
全选,通过XOR
Tools->Hex Operation->Binary Xor
和255异或
此时,可以看到开头文件还原为dex.039,复制相关dex字节另存为新dex
查看最后四个字节 0x007a9c84
长度还是8035460。
去掉最后四个字节,保存到new.dex
jadx解析,解析成功
参考资料
-
• Android从整体加固到抽取加固的实现及原理 https://bbs.kanxue.com/thread-286929.htm
欢迎加入知识星球~
原文始发于微信公众号(进击的HACK):脱壳与加固 | 一代壳(落地加载)的学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论