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

一目錄結構

├── test.py  #py腳本
└── test.js  #js腳本

一.py腳本

test.pyjava

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(){}):

返回值:空python

用途:這是frida的main,全部的腳本必須放在這個裏面android

二. Java.use(類名)

返回值:類的對象api

用途:動態獲取一個類的對象數組

拓展:$new()實例化對象$dispose()銷燬對象app

三.Java.available

返回值:boolean。函數

用途:確認當前進程的java虛擬機是否已經啓動,虛擬機包括Dalbik或者ART等。虛擬機沒有啓動的狀況下不要喚醒其餘java的屬性或者方法。線程

四.Java.enumerateLoadedClasses(callbacks)

返回值:無調試

參數:回調函數code

用途:列出當前已經加載的類,用回調函數處理

回調函數:

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

相關文章
相關標籤/搜索