前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于frida框架的脱壳工具frida-unpack

基于frida框架的脱壳工具frida-unpack

作者头像
BennuCTech
发布2022-11-11 10:27:52
1.5K0
发布2022-11-11 10:27:52
举报
文章被收录于专栏:BennuCTechBennuCTech

前言

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方法的签名,在终端中输入命令:

代码语言:javascript
复制
nm libart.so |grep OpenMemory

作者说在libdexfile.so中则是OpenCommon方法。但是注意,在android8.1.0中提取出来的libart.so中已经没有OpenMemory方法了,取而代之的是OpenCommon方法,所以大家如果通过命令发现获取OpenMemory没有任何信息,就可以试试OpenCommon

代码语言:javascript
复制
nm libart.so |grep OpenCommon

得到的信息是方法的签名,如下:

代码语言:javascript
复制
$ nm libart.so |grep OpenCommon
0000000000193560 T _ZN3art7DexFile10OpenCommonEPKhmRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPKNS_10OatDexFileEbbPS9_PNS0_12VerifyResultE

这个后面会用到,记录下来。

修改OpenMemory.js

然后我们需要修改项目中的OpenMemory.js,原代码如下:

代码语言:javascript
复制
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,这个后面细说。

运行

然后在终端进入项目目录,输入命令:

代码语言:javascript
复制
./inject.sh 要脱壳的应用的包名 OpenMemory.js

即可,等待脱壳完成就可以得到dex文件了。

问题

Error: expected a pointer

如果报错:

代码语言:javascript
复制
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

如果报错:

代码语言:javascript
复制
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位的,则保持原代码不变。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BennuCTech 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 安装frida
  • 获取libart.so(libdexfile.so)
  • 获取OpenMemory
  • 修改OpenMemory.js
  • 运行
  • 问题
    • Error: expected a pointer
      • Error: access violation accessing
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档