hook框架-frida簡單使用模板以及frida相關接口


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相關接口

一、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是針對運行時對象的實例,相當於動態調試過程中獲取信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM