安卓Frida hook脱壳环境配置过程

本文记录开始于22/7/22/16:50
目的是记录安卓Android脱壳过程
使用Frida对360加固的apk进行脱壳
操作环境:win10+Android雷神模拟器

一、安装所需软件

(1)Java JDK
(2) Android SDK 平台工具软件包
下载:https://developer.android.com/studio/releases/platform-tools
配置:参考教程:
http://t.csdn.cn/qXGXi
(3)安卓模拟器
本文使用夜神Android7.1.2
(4)Python
本文使用vscode编写并运行python代码
(5)IDA PRO

二、开始操作

(1)adb连接夜神模拟器

1.打开夜神模拟器
2.打开cmd,用adb链接夜神模拟器

adb connect 127.0.0.1:62001


连接后输入

adb devices


代表已经连接上

(2)导出librat.so

adb pull /system/lib/libart.so D:\Desktop


出现如上表示导出成功

(3)查看android架构

输入

adb shell
getprop ro.product.cpu.abi

获取设备信息,我这里因为用夜神模拟器所以是x86

(4)在android安装frida-server

下载地址:https://github.com/frida/frida/releases
需要与后面下载的frida-tool版本一样,然后什么架构下载什么版本的frida-server,下载完解压出来,一个无后缀文件
这里我是模拟器,我发现有两个x86版本,一个是x86,一个是x86_64,要下载x86版本。
输入

adb push 电脑的文件路径 /data/local/tmp


最后开启服务

adb start-server # 第一步 开启服务
adb devices # 第二步 查看是否链接
adb shell 
su # 进入root权限
cd /data/local/tmp #进入frida-server #所在目录
chmod 777 frida-server-15.2.2-android-x86 # 授予其文件权限。这个名字要改成你下载的文件名
./frida-server-15.2.2-android-x86 # 这个名字要改成你下载的文件名

运行成功后不会有任何提示。
新开一个cmd,输入frida-ps -U

出现上面就代表frida配置完成!

(5)用ida打开librat.so,查找OpenMemory的导出方法名

不同安卓版本导出方法名可能不同

查找到这个,记录下来。后面hook的目标函数的就是他。

_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_

(6)安装python的frida模块

具体参见https://frida.re/
需要用到python的pip模块,没安装自行百度“安装pip”
cmd输入(记得cmd要有管理员权限)

pip install frida-tools

安装失败

未曾想到一个小小的安装python的frida模块能有那么多坑,网上一查才知道有很多人和我一样在安装的时候遇到麻烦。
然后也试过用各种国内镜像,手动下载安装,同样是卡在setup这一步骤。也尝试过卡在这一步骤的时候,开启系统代理,因为我猜测是因为安装过程同样也要联网,才导致这么慢,所以代理或许能更快?但依旧卡在setup?wtf????

在检索frida历史版本中,发现frida在最新1.5系列中似乎都没有python3.7的,只有3.8和3.6,而我的python恰巧是3.7,会不会是因为不支持3.7了呢,于是试着安装之前的frida版本,之前的1.4系列就有存在3.7的安装包,但同样失败,卡在setup这一步。
一气之下,重装python,换了个python310,然后直接按照官网的指令安装frida-tools,依旧是卡在setup,会不会是我python安装的D盘权限问题呢?我在重装一次python,这次安装在C盘,依旧是卡在Running setup.py install for frida,我就开始怀疑是不是因为setup中存在什么下载需要代理,不代理就会很慢。但是开代理pip又会报代理错误。
然后我就用http://t.csdn.cn/saWEA的方法,电脑开启代理,让pip用代理。成功了兄弟们!

pip install frida-tools --proxy='socks5://127.0.0.1:10808'


所以总而言之,安装frida执行到Running setup.py install for frida…这一步骤的时候,肯能setup内部还要自己去pipy下载其他模块,而国内网络环境复杂,pipy我自己测试了下速度只有0.01kb\s,这才导致一直开在Running setup.py install for frida…并且不报错误,就是单纯速度慢。但是在pip运行后在开代理,并不会通过代理软件,必须在pip开启前开启代理,而开代理直接使用pip则会导致pip报proxy错误,所以必须使用上面的神奇的“–proxy=‘socks5://127.0.0.1:10808’”指令。

(7)编写python脚本

这里直接采用https://github.com/dstmath/frida-unpack/blob/master/frida_unpack.py的脚本
但是要做一定修改
要把src里的"libdexfile.so"后面的那个参数改成我们之前获取到的OpenMemory的导出方法名。
28行做修改
修改完后如下

#-*- coding:utf-8 -*-
# coding=utf-8
import frida
import sys

def on_message(message, data):
    base = message['payload']['base']
    size = int(message['payload']['size'])
    print(hex(base),size)
    # print session
    # dex_bytes = session.read_bytes(base, size)
    # f = open("1.dex","wb")
    # f.write(dex_bytes)
    # f.close()

# 9.0 arm 需要拦截 _ZN3art13DexFileLoader10OpenCommonEPKhjS2_jRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPKNS_10OatDexFileEbbPS9_NS3_10unique_ptrINS_16DexFileContainerENS3_14default_deleteISH_EEEEPNS0_12VerifyResultE
# 7.0 arm:_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_

# android 10: libdexfile.so 
# #_ZN3art13DexFileLoader10OpenCommonEPKhjS2_jRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPKNS_10OatDexFileEbbPS9_NS3_10unique_ptrINS_16DexFileContainerENS3_14default_deleteISH_EEEEPNS0_12VerifyResultE

package = sys.argv[1]
print("dex 导出目录为: /data/data/%s"%(package))
device = frida.get_usb_device()
pid = device.spawn(package)
session = device.attach(pid)
src = """
Interceptor.attach(Module.findExportByName("libdexfile.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"), {
    onEnter: function (args) {
      
        var begin = args[1]
        
        console.log("magic : " + Memory.readUtf8String(begin))
     
        var address = parseInt(begin,16) + 0x20
        var dex_size = Memory.readInt(ptr(address))
        console.log("dex_size :" + dex_size)
      
        var file = new File("/data/data/%s/" + dex_size + ".dex", "wb")
        file.write(Memory.readByteArray(begin, dex_size))
        file.flush()
        file.close()
        var send_data = {}
        send_data.base = parseInt(begin,16)
        send_data.size = dex_size
        send(send_data)
    },
    onLeave: function (retval) {
        if (retval.toInt32() > 0) {
        }
    }
});
"""%(package)

script = session.create_script(src)

script.on("message" , on_message)

script.load()
device.resume(pid)
sys.stdin.read()

(8)运行脚本

python D:\Desktop\unpack.py 包名

出现错误

Traceback (most recent call last):
  File "C:\Python310\lib\site-packages\frida\core.py", line 458, in _on_message
    callback(message, data)
  File "D:\Desktop\unpack.py", line 7, in on_message
    base = message['payload']['base']
KeyError: 'payload'

找到了同道中人的文章https://unsafe.sh/go-26062.html
本文完结

猜你喜欢

转载自blog.csdn.net/weixin_45518621/article/details/125952730