免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
內容參考于:圖靈Python學院
工具下載:
鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89
提取碼:zy89
復制這段內容后打開百度網盤手機App,操作更方便哦
上一個內容:9.安卓逆向2-frida hook技術-frida基本使用-frida-ps指令
frida的hook主要是學習下圖紅框的參數,也并不需要全部學習,常用的就那幾個
-U
使用usb線連接
frida -U
-f
指令app包名
-p
使用app的pid
-l
加載 hook腳本
-o
把腳本輸出的信息保存到文件中
frida兩種操作模式
cli命令行,javascript腳本注入進程
rpc,Python進行javascript腳本注入
frida兩種操作app的方式
spwan模式,不管app運不運行它都會重啟,然后注入,它的注入比較早,就是可以攔截app啟動時執行的代碼
attach模式,給一個正在運行的app進行注入,也就是說只有app運行了它才能進行注入,它比較晚,app啟動時的代碼沒辦法攔截(運行之后才注入怎么可能攔截啟動時的代碼)
到底是用spwan模式還是attach模式,-f指定包名 使用spwan模式,加了-f就會使用spwan模式,加-F使用attach模式
frida腳本都是使用JavaScript語言編寫,它有個固定格式
Java.perform(function () {});
首先啟動一下手機里的 frida-server
attach模式注入腳本 frida -UF -l .\FridaHook初體驗.js
Java.perform(function () {// 獲取當前應用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 獲取包名var packageName = context.getPackageName();// 輸出包名console.log("當前應用的包名是: " + packageName);send(packageName)
});
直接寫exit然后按回車鍵(Enter鍵)退出hook
使用Python啟動腳本
核心是通過 frida.get_usb_device()獲取frida功能
然后使用device.get_process("com.xxx.frodo").pid 獲取app進程id
然后寫JavaScript的hook腳本
js_cpde = ''' Java.perform(function () {// 獲取當前應用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 獲取包名var packageName = context.getPackageName();// 輸出包名console.log("當前應用的包名是: " + packageName); }); '''
然后使用 session.create_script(js_cpde) 加載腳本
然后使用 script.load() 把腳本注入到app中并執行腳本
spwan模式
指令 frida -Uf com.XXX.frodo -l .\FridaHook初體驗.js
執行了上面的指令后會卡主,然后輸入 %resume讓app繼續運行
![]()
Python使用spwan模式,,主要修改了下圖紅框的兩行代碼
# -*- coding: utf-8 -*-
import frida
import sysdef on_message(message, data):print("message", message)print("data", data)# 通過Spawn模式啟動一個新的應用程序進程,并在該進程中加載Frida腳本
device = frida.get_usb_device()pid = device.spawn(["com.trs.xxxx.xxx"])
# 恢復應用程序的執行
device.resume(pid)session = device.attach(pid)js_cpde = '''
Java.perform(function () {// 獲取當前應用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 獲取包名var packageName = context.getPackageName();// 輸出包名console.log("當前應用的包名是: " + packageName);send(packageName)
});
'''script = session.create_script(js_cpde)
# 設置監聽
script.on("message", on_message)
script.load()
# 阻塞主線程,以保持腳本運行
sys.stdin.read()
還有如下圖紅框
使用 script.on("message", on_message)設置監聽message消息,然后通過 send(packageName)的send函數觸發on_message函數,這樣就可以在Python代碼中獲取JavaScript里的數據
frida遠程模式,一般不使用,它有點麻煩
首先使用把剛剛啟動的frida-server按CTRL+C進行退出,然后使用 ./frida-server-14.2.18-android-arm64 -l 0.0.0.0:8881指定frida-server的端口為8881啟動
然后使用 adb forward tcp:8881 tcp:8881 指令映射端口(或者理解為開啟端口)
然后這時的客戶端指令,不是-U使用-H了,別的沒變化
Python使用frida的遠程模式
# -*- coding: utf-8 -*-import frida, sysjsCode = """
Java.perform(function () {// 獲取當前應用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 獲取包名var packageName = context.getPackageName();// 輸出包名console.log("當前應用的包名是: " + packageName);
});
"""def message(message, data):if message['type'] == 'send':print(f"[*] {message['payload']}")else:print(message)# 遠程連接服務端
device = frida.get_device_manager().add_remote_device('127.0.0.1:8881')
# 附著到已運行的應用
process = device.attach('com.trs.xxx.newsclient')
script = process.create_script(jsCode)
script.on("message",message)
script.load()