dumpDex: 一个开源的 Android 脱壳插件工具,需要xposed支持。可以用来脱掉当前市场上大部分的壳。(360加固、腾讯乐固、梆梆加固、百度加固均可脱壳)
支持大多数xposed环境的手机,暂不支持模拟器
github地址:https://github.com/WrBug/dumpDex,可以直接下载release的apk,也可以自行编译打包成apk安装到手机
安装插件,重启手机,打开加固的apk,脱壳的后的dex会在/data/data/对应包路径/dump文件夹下
1、根据类名查找当前运行的 APP 是否存在支持的加密壳(360加固、爱加密、梆梆加固、腾讯加固、百度加固);
2、存在支持的加密壳的情况下,根据手机的 Android 版本进行不同的处理,Android 8.0 及以上手机走 NDK 方式,其它低版本手机则走 Hook 方式;
3、Hook 方式,主要是通过 Hook Instrumentation 类的 newApplication() 方法和 ClassLoader 类的 loadClass() 方法,获取 Application 或 Activity 所在的 dex 的数据;
4、将这些数据导出到 APP 所在路径的 dump 子文件夹里的 dex 文件。
1、将app解压出来查看assets目录下,是否有对应的so文件,这个目录下的so文件名称是可以作为识别是什么加固厂商的方法
2、将app拖到反编译工具,如jadx工具上,通过工具可看出Application的入口类是否被替换,以及是否存在加固厂商的特征
PS:APP的Application类中的attachBaseContext和onCreate这两个函数是最先获取执行权进行代码执行的。这也是为什么很多加固工具的主要逻辑都是通过替换APP入口Application,并自实现这两个函数从而达到加固的效果
壳的种类非常多,可以简单的分为以下三类:
firda-unpack 原理是利用frida hook libart.so中的OpenMemory方法,拿到内存中dex的地址,计算出dex文件的大小,从内存中将dex导出,我们可以查看项目中的 OpenMemory.js 文件中的代码更清晰直观地了解
项目地址:https://github.com/GuoQiang1993/Frida-Apk-Unpack
frida -U -f com.APK进程名 -l. dexDump.js. --no-pause
PS:将 dex 文件并 dump 下来,保存在 data/data/packageName 目录下
脱壳后的dex文件保存在PC端main.py同一目录下,以包名为文件名
项目地址:https://github.com/hluwa/frida-dexdump
文件头搜索dex,来脱壳
项目地址:https://github.com/lasting-yang/frida_dump
https://github.com/AloneMonkey/frida-ios-dump
PS:会搜索 dex 文件并 dump 下来,保存在 data/data/packageName/files 目录下
Frida 版的 Fart, 目前只能在 andorid8 上使用该frida版fart是使用hook的方式实现的函数粒度的脱壳,仅仅是对类中的所有函数进行了加载,但依然可以解决绝大多数的抽取保护
项目地址:https://github.com/hanbinglengyue/FART
解压 frida_fart.zip 将目录中的 fart.so 与 fart64.so 推送到 /data/app目录下 并使用 chmod 777 需要以spawn方式启动app,等待app进入Activity界面后,执行fart()函数即可。如app包名为com.example.test,则
frida -U -f com.xxx.test -l frida_fart_hook.js --no-pause
等待app进入主界面,执行fart()
高级用法:
如果发现某个类中的函数的CodeItem没有dump下来,可以调用dump(classname),传入要处理的类名,完成对该类下的所有函数体的dump,dump下来的函数体会追加到bin文件当中
PS:于被动调用的脱壳修复,由于代码覆盖率低,不可能触发app中的所有函数的调用,因此,修复的范围有限
BlackDex是一个运行在Android手机上的脱壳工具,支持5.0~12,无需依赖任何环境任何手机都可以使用,包括模拟器。只需几秒,即可对已安装包括未安装的APK进行脱壳。
项目地址:https://github.com/CodingGay/BlackDex
对于完整的dex文件,采用暴力搜索方式搜索dex035关键特征,对于抹掉头文件信息的dex如抹掉dex035这个的magic bytes 信息,此时就需通过匹配一些特征来进行搜索
工具:https://github.com/dstmath/frida-unpack
pip3 install frida-tools
adb.exe push C:\xxx\frida-unpack\inject.sh /data
cd /data
chmod +x inject.sh
# 转发frida端口
adb.exe forward tcp:27042 tcp:27042
adb.exe forward tcp:27043 tcp:27043
adb.exe forward tcp:38089 tcp:38089
# 启动frida并修改监听端口(防止部分app监测默认端口)
adb.exe shell /data/local/tmp/ -l 0.0.0.0:38089
CPU架构 | 描述 |
---|---|
armeabi | 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢 |
armeabi-v7a | 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能 |
arm64-v8a | 第8代,64位,包含 Aarch32、Arch64两个执行状态对应32、64bit |
x86 | intel32位,一般用于平板电脑 |
x86_64 | intel64位,一般用于平板电脑 |
mips | 少接触 |
mips64 | 少接触 |
adb shell getprop ro.product.cpu.abi
adb.exe push E:\xxx\frida-unpack\frida-server-15.1.14-android-x86 /data/local/tmp/
adb.exe shell
cd /data/local/tmp/
chmod 777 frida-server-15.1.14-android-x86
./frida-server-15.1.14-android-x86
PS: 可能大家会遇到脱壳失败的,多试几次
脱壳失败解决方案:
1、多试几次python main.py -n com.jyzlhkj
2、尝试python main.py -n com.jyzlhkj -p 进程ID号
3、尝试python main.py -n com.jyzlhkj -p 进程ID号 -f
4、非root权限的话,尝试sudo sysctl kernel.yama.ptrace_scope=0 ,或 以root权限运行frida
5、frida版本换一个,不要最新版的
小书童是多次尝试第二种方法成功,有好几次运行的时候程序闪退,可能是模拟器的缘故造成的。