hook框架-frida簡單使用模板以及frida相關接口
一、目錄結構
├── test.py #py腳本
└── test.js #js腳本
二、py腳本
test.py
import frida
import sys
#連接設備app
dev=frida.get_usb_device() # get_usb_device獲取設備
PACKAGE = 'cn.soulapp.android' # 包名
process = dev.attach(PACKAGE) # 獲取給定包名的app進程
#運行腳本
#獲取js腳本內容
with open('test.js', 'r') as fr:
js_test=fr.read()
script = process.create_script(js_test) # 這里是把你的js腳本給塞進了process
#可以獲取打印效果
def show(message,data):
print(message)
script.on("message",show)
# 加載腳本
script.load()
sys.stdin.read()
三、js腳本
Java.perform(function(){ //固定寫法所有腳本就要丟在里面
var c =Java.use('cn.soulapp.android.utils.j'); //Java.use獲取cn.soulapp.android.utils.j這個類
c.e.implementation =function(a){return false}; //類的方法復制
});
四、frida相關接口
返回值:空
用途:這是frida的main,所有的腳本必須放在這個里面
二、Java.use(類名)
返回值:類的對象
用途:動態獲取一個類的對象
拓展:$new()實例化對象, $dispose()銷毀對象
三、Java.available
返回值:boolean。
用途:確認當前進程的java虛擬機是否已經啟動,虛擬機包括Dalbik或者ART等。虛擬機沒有啟動的情況下不要喚醒其他java的屬性或者方法。
四、Java.enumerateLoadedClasses(callbacks)
返回值:
參數:回調函數
用途:列出當前已經加載的類,用回調函數處理
回調函數:
onMatch:function(className){ }
找到加載的每個類的時候被調用,參數就是類的名字,這個參數可以傳給java.use()來獲得一個js類包
onComplete: function ():
列出所有類之后被調用 ,也就是完成后做一些掃尾工作
五.Java.enumerateLoadedClassesSync()
返回值:所有已經加載的類的數組。
六.Java.scheduleOnMainThread(function(){}):
返回值:無
用途:在線程上運行指定的函數
七.Java.choose(className, callbacks):
用途:查找堆中指定類的實例。獲得實例后可以調用實例的函數
回調函數
onMatch: function (instance)
每次找到 指定類的實例后調用,
onComplete: function ()
完成時調用
八.Java.cast(handle, klass)
返回值:類的對象
參數:句柄(ptr),klass(use()的返回值)
用途:用來獲取 指定內存地址的類的實例 的對象。這個對象有類屬性,可以得到所屬類的對象。還有$className屬性過去類名的字符串。一個對象有可能有很多實例
例子:
var Activity = Java.use("android.app.Activity");
var activity = Java.cast(ptr("0x1234"), Activity);
總結
java接口的api中,perform是必須用,沒什么實際作用。use是最常用的,用來獲取類的對象,獲取對象后就可以替換具體方法的實現了,相當於修改源碼!!choose和cast是針對運行時對象的實例,相當於動態調試過程中獲取信息。