一目錄結構
├── 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相關介面
一.Java.perform(function(){}):
回傳值:空
用途:這是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是針對運行時物件的實體,相當于動態除錯程序中獲取資訊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122689.html
標籤:Python
下一篇:04.DRF-開發REST 介面
