hook so 常用工具
frida方式hook材料準備
目標:
通過靜態分析,學會使用frida對so 函數的hook,替換或更改返回值。
靜態分析
jadx打開heibaobao.apk
jadx打開heibaobao.apk
myJNI中check聲明
可以看到myJNI->check 實現在libJniTest.so中
public native String check(Object obj, String str, String str2);
ida打開libJniTest.so(解壓apk中得到)
ida打開libJniTest.so.jpg
int __fastcall Java_demo2_jni_com_myapplication_myJNI_check(_JNIEnv *a1, int a2, int a3, int a4, int a5)
其實check函數包括了一下簽名校驗,如果籤名不一致,則殺死進程,不過我們這裡的目的不是採用回編譯修改so或修改arm指令方式過籤名校驗。
我們這裡其實就是想列印check方法的輸出參數;並修改返回值
frida hook 該函數
基本步驟
frida環境準備-pc+手機端(略)
ida查看其偏移地址
獲取libJniTest內存地址
獲取或計算Java_demo2_jni_com_myapplication_myJNI_check的絕對地址
ida 查看函數的偏移地址,並記錄在下來(text:00000EB8)備用
ida中查看check的偏移地址
fridia腳本
編寫hook_libJniTest_check.js腳本
function hook_myJNI_check(){ // 獲取 So 地址 var libJniTest_addr = Module.findBaseAddress(&34;); if (libJniTest_addr) { var myapplication_myJNI_check = Module.findExportByName(&34;, &34;); console.log(&34;, myapplication_myJNI_check); } send(&34; + libJniTest_addr); //未導出的函數我們需要手動的計算出函數地址,然後將其轉化成一個NativePointer的對象然後進行hook操作 // 函數地址 = so地址.add(偏移地址 + 1) // 是否+1 取決於cpu平臺型號 //thumb和arm指令的區分,地址最後一位的奇偶性來進行標誌,所以這裡還需加1 var myJNI_check = libJniTest_addr.add(0x0EB8+1) // 0x 代表 16進位 .text:00000EB8 send(&39;+myJNI_check) // hook 這個地址 // hook 函數不需要寫參數類型、參數個數 Interceptor.attach(myJNI_check, { // 進入函數前Hook onEnter: function(args){ console.log(&34;); // console.log(&34;, args[4],&34;); console.log(&34;, jstring2Str(args[3])); console.log(&34;, jstring2Str(args[4])); send(args[4]) }, // 完成函數hook, retval是返回值 onLeave: function(retval){ console.log(&34;); // //retval.replace(&34;); send(retval); console.log(&34;, jstring2Str(retval)); //構造env,然後調用env.newStringUtf創建jstring(想知道env有哪些js方法可調用,看查看frida-java-master/lib/env.js 源碼) var env = Java.vm.getEnv(); var jstring = env.newStringUtf(&34;); retval.replace(ptr(jstring));//修改返回值 console.log(&34;, jstring2Str(retval)); } });}function jstring2Str(jstring) { //從frida_common_funs.js中copy出來 var ret; Java.perform(function() { var String = Java.use(&34;); ret = Java.cast(jstring, String);//jstring->String }); return ret;}function main() { hook_myJNI_check();}setImmediate(main);
運行腳本
frida -U --no-pause -f demo2.jni.com.myapplication -l hook_libJniTest_check.js
frida hook so函數後的日誌與界面
frida 界面運行log
app結果提示
frida常用腳本
這裡僅提供截圖,大部分javascritpy腳本都來自github,可通過名字去github搜索