您当前的位置:首页 > 计算机 > 逆向分析

脱壳工具dumpDex、frida_dump、BlackDex

时间:08-18来源:作者:点击数:

脱壳工具dumpDex的使用详解

dumpDex概述

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 文件。


识别APP是否加固的小方法

1、将app解压出来查看assets目录下,是否有对应的so文件,这个目录下的so文件名称是可以作为识别是什么加固厂商的方法

2、将app拖到反编译工具,如jadx工具上,通过工具可看出Application的入口类是否被替换,以及是否存在加固厂商的特征

PS:APP的Application类中的attachBaseContext和onCreate这两个函数是最先获取执行权进行代码执行的。这也是为什么很多加固工具的主要逻辑都是通过替换APP入口Application,并自实现这两个函数从而达到加固的效果

Frida 脱壳工具

壳的分类

壳的种类非常多,可以简单的分为以下三类:

  • 一代整体型:采用Dex整体加密,动态加载运行的机制(免费类的壳)
  • 二代函数抽取型:将方法单独抽取出来,加密保存,解密执行(某加密)
  • 三代VMP、Dex2C:独立虚拟机解释执行
Frida-Unpack

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 目录下

frida-dexdump

脱壳后的dex文件保存在PC端main.py同一目录下,以包名为文件名

项目地址:https://github.com/hluwa/frida-dexdump

frida_dump

文件头搜索dex,来脱壳

项目地址:https://github.com/lasting-yang/frida_dump

https://github.com/AloneMonkey/frida-ios-dump

PS:会搜索 dex 文件并 dump 下来,保存在 data/data/packageName/files 目录下

FART

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

BlackDex是一个运行在Android手机上的脱壳工具,支持5.0~12,无需依赖任何环境任何手机都可以使用,包括模拟器。只需几秒,即可对已安装包括未安装的APK进行脱壳。

项目地址:https://github.com/CodingGay/BlackDex

脱壳

  • APP脱壳两个最为关键的要素
    • 内存中dex的起始地址和大小,只有拿到这两个要素,才能够成功dump下内存中的dex
    • 脱壳时机,只有正确的脱壳时机,才能够dump下明文状态的dex。否则,时机不对,及时是正确的起始地址和大小,dump下来的也可能只是密文
  • APP脱壳原理
    • 在壳app解密源apk的dex之后,源apk被加载之前,拦截这个过程中的系统函数,把内存中的dex文件dump拿出来

对于完整的dex文件,采用暴力搜索方式搜索dex035关键特征,对于抹掉头文件信息的dex如抹掉dex035这个的magic bytes 信息,此时就需通过匹配一些特征来进行搜索

工具:https://github.com/dstmath/frida-unpack

  • 需要安装frida环境:https://frida.re
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
  • AndroidCPU架构
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 少接触
  • 获取当前模拟器的CPU,好选择frida-server的版本
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版本换一个,不要最新版的

小书童是多次尝试第二种方法成功,有好几次运行的时候程序闪退,可能是模拟器的缘故造成的。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐