frida 初识

环境安装

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包名

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容