frida學習筆記3 之hook so中的方法

2020-09-10 牽手生活

hook so 常用工具

  • SubstrateCydia-需root
  • frida--需root
  • VA系列-非root(VA、VXP、SandVXposed)

frida方式hook材料準備

  1. heibaobao.apk
  2. jadx
  3. ida
  4. root手機(小米4- androdi6.0)
  5. frida環境

目標:

通過靜態分析,學會使用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搜索



分享是一種美德,牽手是一種生活方式。

最後感謝今日頭條提供的分享平臺,你覺得有用可以收藏方便以後查閱

相關焦點

  • 安卓安全從零到一: FRIDA hook Native基礎
    __B7dnZ2xKBdXTNE_sklZg 提取碼:ljt1https://github.com/nickmyb/android_security_zero_to_one/blob/master/src/3_frida_hook_native/frida_hook_native_basic.md1.
  • 詳解Hook框架frida,讓你在逆向工作中效率成倍提升!
    一、frida簡介frida是一款基於python + javascript 的hook框架,可運行在androidioslinuxwinosx等各平臺,主要使用動態二進位插樁技術。本期「安仔課堂」,ISEC實驗室的彭老師為大家詳解frida,認真讀完這篇文章會讓你在逆向工作中效率成倍提升哦!
  • Frida進階-API
    在前面的文章中介紹了Frida基本API的使用,在這篇文章中介紹一些更加強大的API。同時簡單介紹下HOOK 系統函數的利器frida-trace。內存,內存還是內存。無論想對so層亦或java層進行攔截,通常都須編Java.perform。
  • Frida全平臺使用
    在不同平臺下編寫hook代碼是一件很痛苦的事情,Windows下,必須要熟悉窗口、消息傳遞機制的,而在Linux下hook底層的消息還需要重新編寫內核模塊,在Android平臺要而Frida的出現,讓一切變得簡單了,只需要會Python,會JavaScript就能夠hook任何想hook的內容。Frida is so great!
  • 安卓逆向——Frida hook java層
    各位愛好安卓逆向的大佬們早上好,今天呢小弟不才在這裡拙劣的給大家講解一下咱們frida hook編寫hook代碼編寫hook代碼的時候,我們此處列舉了:A、普通方法B、構造方法註:填寫包名、類名、方法名、參數列表、參數類型等我們上面這些步驟都完成以後呢,我們就可以輸入我們的hook命令,然後啟動程序觸發,hook成功顯示,我們來分析目標程序,這裡我打開jadx-gui工具,在我們的onClick點擊事件裡面,發現了5個分支,這五個分支就是走5個不同邏輯,但是這5個分支都在調用的時候,用了一個
  • 當Frida來「敲」門
    而且frida還是開源的。啟動APP,並加載腳本的命令如下:frida -U -f com.x.x -l js-scriptsjs腳本編寫可以看官方文檔:https://frida.re/docs/javascript-api///hook傳入值,ObjC: args[0] = self
  • Frida腳本教程
    x,因此這裡切換到3的版本。在二進位漏洞中,exploit使用的基本都是Python2.7。Frida腳本FRIDA腳本就是利用FRIDA動態插樁框架,使用FRIDA導出的API和方法,對內存空間裡的對象方法進行監視、修改或者替換的一段代碼。
  • ida-so-基礎調試步驟-筆記
    準備工作ida7.0jdk8android6手機-小米4(請用真機模擬器會有你想不到的問題)ddmsso的加載過程.init->->.init array->->JNI_Onload->->java_com_XXX;脫殼的過程中會在一些系統級的.so中下斷點比如:fopen,fget,dvmdexfileopen,等等而.init以及.init_array一般會作為殼的入口地方,那我們索性叫它外殼級的
  • Frida使用之資料庫
    資料庫Android大部分使用的資料庫都是SQLite3。SQLite是一個軟體庫,實現了自給自足的、無伺服器的、零配置的、事務性的 SQL 資料庫引擎。3、卸載過程介紹:卸載過程:刪除安裝過程中在上述三個目錄下創建的文件及目錄。
  • Frida API進階
    stringmodule: module name as a stringaddress: absolute address as a NativePointerslot: memory location where the import is stored, as a NativePointer //枚舉模塊中所有中的所有導入表
  • Frida之文件操作
    在前面的文章中介紹了資料庫的操作,這篇文章主要介紹文件的操作。當你在使用程序的時候,可以動態修改程序的文件操作,其實是很恐怖的,比如,本來是往文件中寫入100元錢,但是經過動態修改後變成了0元,據此可以腦洞大開一下。
  • 筆記在英語學習中的重要性與記筆記的方法
    記筆記是學生在學習過程中養成的良好習慣。它不僅在平時的研究中起著重要的作用,而且在複習階段也起著重要的作用。那麼,如果筆記學習風格,在英語學習中使用,會起到什麼作用呢?學生在做筆記時,應該注意什麼?接下來,我會詳細解釋給你聽。一、筆記在英語學習中的重要性1.它有助於提高課堂學習的注意力和動手習慣。聽和不記得可能會分散學生的學習注意力。
  • 花裡胡哨之突破安卓某APP低層加密
    ,那隻好去分析這個名為native-lib 的so 文件了,解壓目標 apk 獲取到了如下圖這些文件:第1處和2處分別是目標函數的地址,滑鼠點到目標函數處,ida左下角會顯示,加1是為何,只記得大學時候學過彙編語言講到段地址,偏移地址,物理地址這些,猜測和這些知識有關,還需研究,這裡先這樣用,第3處的寫法是當這個參數為字符串時的寫法
  • Frida進階內存漫遊
    於是有大佬將各種常見、常用的功能整合進一個工具,供我們直接在命令行中使用,這個工具便是objection。objection基本整合了常用的各種hook功能,在逆向apk、Hook代碼、查看內存信息的時候為我們提供極大的方便。
  • 說唱hook是什麼意思 hook使用方法一覽
    說唱hook的這個詞也是最近很受關注的,據說是在節目中被鄧紫棋使用的,這個熱詞的含義和使用方法不是太清楚,小編整理了最新的資料和大家分享下吧!中國新說唱hook什麼意思中國新說唱hook是副歌的意思,一首rap裡面除了rap部分還可以有旋律,hook就是副歌部分的旋律,這是鄧紫棋使用頻率最高的一個詞,只要有自己喜歡的選手,鄧紫棋就會說我幫你hook。最近,網友被一句「我可以幫你唱hook」給洗腦了,究竟是怎麼了呢?
  • Frida API之網絡
    @[toc] 在聊天系統開發(1) 的文章中,對TCP/IP相關的網絡編程進行了介紹。在Frida API進階-文件 對文件描述符、輸入輸出流進行了介紹。本篇文章集於此介紹Frida中網絡相關的API。
  • 鉤子:by hook or by crook
    I want that vintage Triumph motorcycle and I am going to make sure I get it, by hook or by crook.   通過例句我們看出 這個短語的意思就是千方百計,不折手段的意思   但是英語中跟hook有關的用語還真不少!!!