APP逆向過(guò)程中,需要對(duì)dex文件和elf文件進(jìn)行分析,又因現(xiàn)在各APP都有各種代碼保護(hù)手法,因此都需要進(jìn)行動(dòng)態(tài)分析。
今天就分享下對(duì)elf文件也就是so文件中動(dòng)態(tài)分析so文件中JNI函數(shù)的方案。
jnitrace它是基于frida基礎(chǔ)上的一個(gè)工具,它是一個(gè)動(dòng)態(tài)分析追蹤SO文件中的JNI API調(diào)用的工具,它可以進(jìn)行指定SO文件進(jìn)行跟蹤JNI調(diào)用。
基礎(chǔ)知識(shí)
1、JavaVM 和 JNIEnv
JNI 它定義了兩個(gè)關(guān)鍵數(shù)據(jù)結(jié)構(gòu):JavaVM和JNIEnv。它們本質(zhì)上都是指向函數(shù)表的二級(jí)指針。(在 C++ 版本中,它們是一些類(lèi),這些類(lèi)具有指向函數(shù)表的指針,并具有每個(gè)通過(guò)該函數(shù)表間接調(diào)用的 JNI 函數(shù)的成員函數(shù)。)JavaVM 提供“調(diào)用接口”函數(shù),可以利用此類(lèi)來(lái)函數(shù)創(chuàng)建和銷(xiāo)毀 JavaVM。
JNIEnv 提供了大部分 JNI 函數(shù), so中的原生函數(shù)都會(huì)收到 JNIEnv 作為第一個(gè)參數(shù)。該 JNIEnv 將用于線程本地存儲(chǔ)。因此無(wú)法在線程之間共享 JNIEnv。如果一段代碼無(wú)法通過(guò)其他方法獲取自己的 JNIEnv,應(yīng)該共享相應(yīng) JavaVM,然后使用 GetEnv 發(fā)現(xiàn)線程的 JNIEnv。
JNIEnv 和 JavaVM 的 C 聲明與 C++ 聲明不同。"jni.h" include 文件會(huì)提供不同的類(lèi)型定義符,具體取決于該文件是包含在 C 還是 C++ 中。因此不建議在這兩種語(yǔ)言包含的頭文件中添加 NIEnv 參數(shù)。
2、spawn和attach注入?yún)^(qū)別
Frida支持spawn和attach兩種啟動(dòng)方式。
attach模式下,F(xiàn)rida會(huì)附加到當(dāng)前的目標(biāo)進(jìn)程中,即需要App處于啟動(dòng)狀態(tài),這也意味著它只能從當(dāng)前時(shí)機(jī)往后Hook;
spawn模式下,F(xiàn)rida會(huì)自行啟動(dòng)并注入進(jìn)目標(biāo)App,Hook的時(shí)機(jī)非常早,好處在于不會(huì)錯(cuò)過(guò)App中相對(duì)較早(比如App啟動(dòng)時(shí)產(chǎn)生的參數(shù)),缺點(diǎn)是假如想要Hook的時(shí)機(jī)點(diǎn)偏后,則會(huì)帶來(lái)大量干擾信息,嚴(yán)重甚至?xí)?dǎo)致server崩潰。
attach注入:APP啟動(dòng)后再 hook,不能 hook APP的啟動(dòng)階段。
spawn注入 :重啟 APP,適合 hook APP啟動(dòng)階段。
基本操作
jnitrace使用需要配合python環(huán)境和frida工具(版本需要配套好)
這個(gè)jnitrace安裝后主要核心的實(shí)現(xiàn)功能都在jnitrace.py和jnitrace.js
下圖是jnitrace.py中主要功能:首先判斷連接設(shè)備的方式 是以remote_device還是usb_device,接著默認(rèn)采用spawn的注入方式,在去執(zhí)行jnitrace.js文件中的hook功能,最后在輸出執(zhí)行后的數(shù)據(jù)。
下圖是jnitrace.js的關(guān)鍵功能點(diǎn),注入后實(shí)際功能還是調(diào)用到底層的dlopen。
實(shí)踐分析
Frida啟動(dòng)后會(huì)往要hook的進(jìn)程中注入frida的so文件
下圖是所有功能組成的解析
通過(guò)jnitrace -l libxxx.so com.xxx.xxx 可以打印輸出so中的jni函數(shù),以及這些jni函數(shù)的調(diào)用獲取數(shù)據(jù)
通過(guò) jnitrace -l libxxx.so com.xxx.xxx -i RegisterNatives 可以查看到so中的所有動(dòng)態(tài)注冊(cè)的函數(shù)。
審核編輯:劉清
-
JAVA
+關(guān)注
關(guān)注
19文章
2952瀏覽量
104477 -
C++語(yǔ)言
+關(guān)注
關(guān)注
0文章
147瀏覽量
6951 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375
原文標(biāo)題:App逆向之so分析方法
文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論