Frida Hook So 一些操作說明
Native方法第一個參數是 JNIEnv *env 如何在Frida中獲取 JNIEnv 對象呢?
Java.vm.getEnv();
如何將string類型轉換jstring類型呢?
let jstring = Java.vm.getEnv().newStringUtf(str);
如何將jstring類型轉string類型呢?
aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
Hook So 導出函數
let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method01');
Hook So 非導出函數
let so_addr = Module.findBaseAddress('libxiaowei.so');
// 需要去so中找到非導出函數的地址
let encrypt_addr = so_addr.add(0x42B0);
如何在so中定義一個字符串
let cstring = Memory.allocUtf8String("xiaoweigege");
如何將c中的字符串轉成js string?
ptr(result).readCString()
將函數地址定義成一個函數能在js中進行調用
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x42B0);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);
在任意apk中加載so文件
var load_model = Module.load('/data/local/tmp/libxiaowei.so');
這樣操作就可以在任意地方調用so中的方法,那么我們就可以脫離apk 比如 hook 系統中 設置 來調用我們的so文件方法,達到脫離本身APK
使用示例
var load_model = Module.load('/data/local/tmp/libxiaowei.so');
function hook_method1(str) {
let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method01');
let method1_fun = new NativeFunction(method1_addr, 'pointer', ['pointer', 'pointer', 'pointer']);
let aes_value = null
Java.perform(function () {
// Java.vm.getEnv() JNIEnv 對象獲取
let jstring = Java.vm.getEnv().newStringUtf(str);
let result = method1_fun(Java.vm.getEnv(), jstring, jstring);
aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
})
return aes_value;
}
function hook_method2(str) {
let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method02');
let method1_fun = new NativeFunction(method1_addr, 'pointer', ['pointer', 'pointer', 'pointer']);
let aes_value = null
Java.perform(function () {
let jstring = Java.vm.getEnv().newStringUtf(str);
let result = method1_fun(Java.vm.getEnv(), jstring, jstring);
aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
})
return aes_value;
}
function hook_encrypt(str) {
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x42B0);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);
console.log(ptr(result).readCString())
}
function hook_decrypt(str) {
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x4538);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);
console.log(ptr(result).readCString())
}
function main() {
let value = hook_method1('xiaoweigege')
hook_method2(value)
}
setImmediate(main)