美文网首页
frida 初识

frida 初识

作者: 归隐小赵 | 来源:发表于2021-08-31 11:14 被阅读0次

环境安装

python

pip install frida
pip install frida-tools

模拟器

  1. 查看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包名

相关文章

网友评论

      本文标题:frida 初识

      本文链接:https://www.haomeiwen.com/subject/mzfziltx.html