基于frida框架的脱壳工具frida-unpack
前言
frida-unpack是一个基于frida的脱壳工具,项目地址:https://github.com/chzphoenix/frida-unpack
但是作者说明的不够详细,使用的时候遇到了种种问题,所以整理了一下。
注意我的android版本是8.1.0
安装frida
因为是基于frida框架,所以需要安装frida,这个可以参考frida官方文档,或者参考我之前的一篇文章:
获取libart.so(libdexfile.so)
在低版本(应该是android10以下)上应该使用:
- 32位应用:/system/lib/libart.so
- 64位应用:/system/lib64/libart.so
在android10上应该使用,作者说应该使用/apex/com.android.runtime/lib/libdexfile.so,但是应该也有一个64版本/apex/com.android.runtime/lib64/libdexfile.so,这个我没有验证。
通过adb将so文件拷贝到电脑上
获取OpenMemory
然后需要在libart.so中获取OpenMemory方法的签名,在终端中输入命令:
nm libart.so |grep OpenMemory
作者说在libdexfile.so中则是OpenCommon方法。但是注意,在android8.1.0中提取出来的libart.so中已经没有OpenMemory方法了,取而代之的是OpenCommon方法,所以大家如果通过命令发现获取OpenMemory没有任何信息,就可以试试OpenCommon
nm libart.so |grep OpenCommon
得到的信息是方法的签名,如下:
$ nm libart.so |grep OpenCommon
0000000000193560 T _ZN3art7DexFile10OpenCommonEPKhmRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPKNS_10OatDexFileEbbPS9_PNS0_12VerifyResultE
这个后面会用到,记录下来。
修改OpenMemory.js
然后我们需要修改项目中的OpenMemory.js,原代码如下:
Interceptor.attach(Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"), {
onEnter: function (args) {
//dex起始位置
var begin = args[1]
//打印magic
console.log("magic : " + Memory.readUtf8String(begin))
//dex fileSize 地址
var address = parseInt(begin,16) + 0x20
//dex 大小
var dex_size = Memory.readInt(ptr(address))
console.log("dex_size :" + dex_size)
//dump dex 到/data/data/pkg/目录下
var file = new File("/data/data/xxx.xxx.xxx/" + dex_size + ".dex", "wb")
file.write(Memory.readByteArray(begin, dex_size))
file.flush()
file.close()
},
onLeave: function (retval) {
if (retval.toInt32() > 0) {
/* do something */
}
}
});
首先需要将findExportByName的第二个参数换成我们获取到的方法签名,即:
_ZN3art7DexFile10OpenCommonEPKhmRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPKNS_10OatDexFileEbbPS9_PNS0_12VerifyResultE
然后更改一下保存的地址,作者这里保持到/data/data/pkg/目录下没必要,可以直接放到/sdcard/下随便新建一个目录,这样获取也方便。
最后还要修改一下dex起始位置var begin = this.context.x0
,这个后面细说。
运行
然后在终端进入项目目录,输入命令:
./inject.sh 要脱壳的应用的包名 OpenMemory.js
即可,等待脱壳完成就可以得到dex文件了。
问题
Error: expected a pointer
如果报错:
Error: expected a pointer
at value (frida/runtime/core.js:367)
at <eval> (/OpenMemory.js:32)
说明OpenMemory(或OpenCommon)的方法签名不对,检查签名。比如是32位so文件中的签名,但是应该是64位的。
Error: access violation accessing
如果报错:
Error: access violation accessing 0x4e067c
at onEnter (/OpenMemory.js:14)
Error: access violation accessing 0x526304
at onEnter (/OpenMemory.js:14)
Error: access violation accessing 0xae330
at onEnter (/OpenMemory.js:14)
Error: access violation accessing 0x19ee4
at onEnter (/OpenMemory.js:14)
可以是dex起始位置代码有问题,上面提到过,要修改成var begin = this.context.x0
。
如果是64位的so文件,应该使用var begin = this.context.x0
;如果是32位的,则保持原代码不变。
相关文章
- SQL调优和诊断工具之SQL Trace (10046 Event)介绍
- Unity SKFramework框架(四)、Timer 时间类工具
- Unity SKFramework框架(二十一)、Texture Filter 贴图资源筛选工具
- Unity SKFramework框架(二十二)、Runtime Console 运行时调试工具
- 一系列令人敬畏的.NET核心库,工具,框架和软件[通俗易懂]
- socket使用方法_socket调试工具怎么用
- linux性能工具--ftrace框架
- 工具分享 | FoFa采集工具
- 盘点| 能够实现小程序开发提效的框架/工具有这些
- Infoga:一款针对电子邮件的公开资源情报工具
- 工具Linux下最佳渗透工具——Linux安全实践(linux下的渗透)
- 利用 Redis 挖掘数据潜能: Redis 分析工具(redis分析工具)
- 安装 Linux 上的 jq 工具(linux 安装 jq)
- 每个人都有害怕的东西,虚拟现实的这些工具能帮我们战胜恐惧
- 利用Xtrabackup工具备份及恢复(MySQLDBA的必备工具)
- 从零开始学YII2框架(五)快速生成代码工具Gii的使用