本文记录开始于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的导出方法名。
修改完后如下
#-*- 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 包名
出现错误文章来源:https://www.toymoban.com/news/detail-460229.html
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
本文完结文章来源地址https://www.toymoban.com/news/detail-460229.html
到了这里,关于安卓Frida hook脱壳环境配置过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!