环境安装
python
pip install frida
pip install frida-tools
模拟器
- 查看CPU架构
adb kill-server #Mac可不运行,windows需要先杀一下进程
adb shell
su
cat /proc/cpuinfo
- 根据架构,从frida官网下载对应的server
https://github.com/frida/frida/releases - 例如我的机器为arm32为架构,就选择frida-server-12.8.14-android-arm.xz下载 [请解压xz,拿到文件]
- 推送到模拟器内
adb push frida-server-12.8.14-android-arm /sdcard
adb shell
cd /sdcard
chmod 777 frida-server-12.8.14-android-arm
cp frida-server-12.8.14-android-arm /data/local/tmp/frida
- 对frida进行重命名,并放到root目录下
- 运行frida
cd /data/local/tmp
./frida
模拟器配置完成 [frida会以持续运行的方式运行,当前窗口最小化即可]
校验是否安装成功
frida-ps -Ua
输出pid,应用名称,apk包名即成功
python进行hook
- test
# -*- coding: UTF-8 -*-
import frida
import sys, os
#转发端口
def adbforward():
os.system("adb forward tcp:27042 tcp:27042")
os.system("adb forward tcp:27043 tcp:27043")
rpc_js = '''
Java.perform(function(){
var Log = Java.use('c.a0.a.w.l0.b');
Log.b.overload('java.lang.String').implementation = function ( content) {
console.log(content);
};
});'''
if __name__ == '__main__':
adbforward()
#这里注意,win10系统只能使用get_remote_device+pid的方式运行(pid通过上文可以获得,每次运行都不一致)
process = frida.get_remote_device().attach(2959)
script = process.create_script(rpc_js)#加载js
script.load()#加载js
sys.stdin.read()#持续hook
- 在模拟器里进行操作,即可正常吐出内容
js说明
- hook 获取入参
Java.perform(function(){
var Log = Java.use('c.a0.a.w.l0.b'); //选择c.a0.a.w.l0.b类
//b 是c.a0.a.w.l0.b的一个方法,overload是重载,参数类型为String类(可通过错误提示进行补充选择)
//content 为入参变量,可自定义,也可为空,console.log 输出内容到界面
Log.b.overload('java.lang.String').implementation = function ( content) {
console.log(content);
};
});
- hook 主动调用 RPC方式 [仅适用于static静态类 非静态类需要用choose调用]
function gethello(str){ //定义函数,传入参数
var strs=""; //定义局部函数,防止在内部回调取不到
Java.perform(function(){
//选择com.czzdit.mit_atrade.data.DataJSONHttpHelper类
var Log = Java.use('com.czzdit.mit_atrade.data.DataJSONHttpHelper');
console.log('start ===>>>',str);
//调用com.czzdit.mit_atrade.data.DataJSONHttpHelper的deCompress方法,传入字符串参数str,获取结果,返回
strs=Log.deCompress(str);
});
return strs;
}
rpc.exports = {
gethello: gethello //定义接口
};
- rpc python
# -*- coding: UTF-8 -*-
import frida
import sys, os
from flask import request
from flask import Flask
def adbforward():
os.system("adb forward tcp:27042 tcp:27042")
os.system("adb forward tcp:27043 tcp:27043")
rpc_js = '''
function gethello(str){
var strs="";
Java.perform(function(){
var Log = Java.use('com.czzdit.mit_atrade.data.DataJSONHttpHelper');
console.log('start ===>>>',str);
strs=Log.deCompress(str);
});
return strs;
}
rpc.exports = {
gethello: gethello
};'''
app = Flask(__name__) # 创建一个实例
@app.route('/api', methods = ["GET","POST"])
def hello_world():
name = request.args.get("rsa_value")
//调用gethello方法获取结果
result=script.exports.gethello(name)
return result
if __name__ == '__main__':
adbforward()
process = frida.get_usb_device().attach(pid)
script = process.create_script(rpc_js)
script.load()
app.run(debug=False,host='0.0.0.0')
frida 脱壳
- frida_dexdump
pip install frida_dexdump
- 安装成功后,打开app,调用
frida-dexdump
- 会输出脱壳结果和对应目录
- 合并脱壳,进行查看反编译
import os, sys
# python3.7 merge_dex.py ./file/ livedex
if __name__ == "__main__":
if len(sys.argv) < 3 :
print("start error")
sys.exit()
print(sys.argv[1], sys.argv[2])
path = sys.argv[1] #文件夹目录
files= os.listdir(path) #得到文件夹下的所有文件名称
s = []
for file in files: #遍历文件夹
if file.find("dex") > 0: ## 查找dex 文件
sh = 'jadx -j 1 -r -d ' + sys.argv[2] + " " + path + file
print(sh)
os.system(sh)
frida调用JS,非py方法
- 创建log.js[文件名无所谓,txt等均可]
Java.perform(function(){
var Log = Java.use('c.a0.a.w.l0.b'); //选择c.a0.a.w.l0.b类
//b 是c.a0.a.w.l0.b的一个方法,overload是重载,参数类型为String类(可通过错误提示进行补充选择)
//content 为入参变量,可自定义,也可为空,console.log 输出内容到界面
Log.b.overload('java.lang.String').implementation = function ( content) {
console.log(content);
};
});
- 执行命令进行调用[目前测试 不带-f无法正常使用 -f spawn 重启apk]
frida -U -l log.js -f apk包名
-U 使用USB连接 -l 加载js -f spawn延时重启 apk包名
网友评论