Android逆向脱壳

脱壳的方式分别有:工具脱壳,hook脱壳,插桩脱壳,反射脱壳,动态调试脱壳

Ps:目前大多数的脱壳方式都还没有测试过 后续会陆续将脱壳实战补充完整 每种脱壳方式会单独的开一篇

工具脱壳

Frida-dexdump

  • 因为不管是使用何种方式进行加壳 在app运行的某一个时间段 都会存在完整的dex文件 所以使用内存dump

  • 简单来说就是在合适的时间进行内存dump

  • 简单好用 前面有说如何使用这个工具

Fart

实现原理

  1. https://bbs.kanxue.com/thread-254555.htm

  2. https://bbs.kanxue.com/thread-254028.htm

  3. https://bbs.kanxue.com/thread-252630.htm

Youpk

  • 主要解决整体加固和抽取加固的方式

  • 运行环境比较复杂 没有具体测试

  • 据说特别好用 企业壳也能搞

  • 地址: https://github.com/youlor/unpacker

注意事项

仅支持被壳保护的Dex 不支持动态加载的dex或者jar

Hook脱壳法

  • 函数包含Dexfile对象的情况下就可以使用hook拿到该对象

  • frida和xposed 前面都有些如何搭建环境

脱壳方式

  1. 先查壳 np或者mt都行

  2. 找脱壳点 通过so文件搜索Dexfile 各家的都有比较明显的特征

  3. 写脚本

  4. 启动服务 等待脱壳成功 拖进jadx分析就行

插桩脱壳法

  • 都是通过对Android源码更改 编译 和Youpk差不多

脱壳方式

  1. 同样的查找定位点

  2. 之后将dexfile对象重新复制或者其他什么办法 放到一个新的目录

反射脱壳法

脱壳方式

  1. 反射获取classloader

  2. 找到DexPathList(这个和如下的dex数组 可以自行查看 直接As一直往里进就可以看到)

  3. 拿到DexElements(dex数组 在dexpathlist内可以看见 还有一个so的数组)

  4. 获取mcookie和filename

  5. 根据cookie的值做转换 找到dexfile的内存指针

  6. 使用findClassDef匹配Dex

  7. dump写文件