本文章原作者 非虫,文章来源网站Mottoin
目录
简述(脱壳前学习的知识、壳的历史、脱壳方法)
Apk文件结构

Dex文件结构

壳史
第一代壳 Dex加密
- Dex字符串加密
- 资源加密
- 对抗反编译
- 反调试
- 自定义DexClassLoader
第二代壳 Dex抽取与So加固
- 对抗第一代壳常见的脱壳法
- Dex Method代码抽取到外部(通常企业版)
- Dex动态加载
- So加
第三代壳 Dex动态解密与So混淆
- Dex Method代码动态解密**
- So代码膨胀混淆
- 对抗之前出现的所有脱壳法
第四代壳 arm vmp(未来)
壳的识别
1.用加固厂商特征:
- 娜迦: libchaosvmp.so , libddog.solibfdog.so
- 爱加密:libexec.so, libexecmain.so
- 梆梆: libsecexe.so, libsecmain.so , libDexHelper.so
- 360:libprotectClass.so, libjiagu.so
- 通付盾:libegis.so
- 网秦:libnqshield.so *百度:libbaiduprotect.so
2.基于特征的识别代码

第一代壳
- 内存Dump法
- 文件监视法
- Hook法
- 定制系统
- 动态调试法
内存Dump法
- 内存中寻找dex.035或者dex.036
- /proc/xxx/maps中查找后,手动Dump

- android-unpacker github.com/strazzere/a…



文件监视法



Hook法


定制系统

- DumpApk github.com/CvvT/DumpAp…
- 只针对部分壳

动态调试法


.gdbserver :1234 –attach pid
.gdb
(gdb) target remote :1234
(gdb) gcore
coredump文件中搜索“dex.035”

第二代壳
- 内存重组法
- Hook法
- 动态调试
- 定制系统
- 静态脱壳机
内存重组法
Dex篇
ZjDroid bbs.pediy.com/showthread.…
对付一切内存中完整的dex,包括壳与动态加载的jar


so篇
elfrebuild


构造soinfo,然后对其进行重建


Hook法
针对无代码抽取且Hook dvmDexFileOpenPartial失败
Hook dexFileParse


针对无代码抽取且Hook dexFileParse失败
Hook memcmp


定制系统
修改安卓源码并刷机-针对无抽取代码

Hook dexfileParse


DexHunter-最强大的二代壳脱壳工具
DexHunter的工作流程:

DexHunter的工作原理:

绕过三进程反调试


修改系统源码后:


ls /proc/345/task

./gdbserver :1234 --attach346
...
(gdb) gcore
gcore防Dump解决方案:
断点mmap调试,针对Hook dexFileParse无效
原理: dexopt优化时, dvmContinueOptimization()->mmap()

静态脱壳机
分析壳so逻辑并还原加密算法

自定义linker脱so壳
main() -> dump_file()

第三代壳
dex2oat法
ART模式下,dex2oat生成oat时,内存中的DEX是完整的

定制系统
Hook DalvikdalviksystemDexFiledefineClassNative
枚举所有DexClassDef,对所有的class,调用dvmDefineClass进行强制加载
