APP逆向過程中,需要對dex文件和elf文件進行分析,又因現在各APP都有各種代碼保護手法,因此都需要進行動態(tài)分析。
今天就分享下對elf文件也就是so文件中動態(tài)分析so文件中JNI函數的方案。
jnitrace它是基于frida基礎上的一個工具,它是一個動態(tài)分析追蹤SO文件中的JNI API調用的工具,它可以進行指定SO文件進行跟蹤JNI調用。
基礎知識
1、JavaVM 和 JNIEnv
JNI 它定義了兩個關鍵數據結構:JavaVM和JNIEnv。它們本質上都是指向函數表的二級指針。(在 C++ 版本中,它們是一些類,這些類具有指向函數表的指針,并具有每個通過該函數表間接調用的 JNI 函數的成員函數。)JavaVM 提供“調用接口”函數,可以利用此類來函數創(chuàng)建和銷毀 JavaVM。
JNIEnv 提供了大部分 JNI 函數, so中的原生函數都會收到 JNIEnv 作為第一個參數。該 JNIEnv 將用于線程本地存儲。因此無法在線程之間共享 JNIEnv。如果一段代碼無法通過其他方法獲取自己的 JNIEnv,應該共享相應 JavaVM,然后使用 GetEnv 發(fā)現線程的 JNIEnv。

JNIEnv 和 JavaVM 的 C 聲明與 C++ 聲明不同。"jni.h" include 文件會提供不同的類型定義符,具體取決于該文件是包含在 C 還是 C++ 中。因此不建議在這兩種語言包含的頭文件中添加 NIEnv 參數。
2、spawn和attach注入區(qū)別
Frida支持spawn和attach兩種啟動方式。
attach模式下,Frida會附加到當前的目標進程中,即需要App處于啟動狀態(tài),這也意味著它只能從當前時機往后Hook;
spawn模式下,Frida會自行啟動并注入進目標App,Hook的時機非常早,好處在于不會錯過App中相對較早(比如App啟動時產生的參數),缺點是假如想要Hook的時機點偏后,則會帶來大量干擾信息,嚴重甚至會導致server崩潰。
attach注入:APP啟動后再 hook,不能 hook APP的啟動階段。
spawn注入 :重啟 APP,適合 hook APP啟動階段。
基本操作
jnitrace使用需要配合python環(huán)境和frida工具(版本需要配套好)

這個jnitrace安裝后主要核心的實現功能都在jnitrace.py和jnitrace.js


下圖是jnitrace.py中主要功能:首先判斷連接設備的方式 是以remote_device還是usb_device,接著默認采用spawn的注入方式,在去執(zhí)行jnitrace.js文件中的hook功能,最后在輸出執(zhí)行后的數據。

下圖是jnitrace.js的關鍵功能點,注入后實際功能還是調用到底層的dlopen。

實踐分析
Frida啟動后會往要hook的進程中注入frida的so文件

下圖是所有功能組成的解析

通過jnitrace -l libxxx.so com.xxx.xxx 可以打印輸出so中的jni函數,以及這些jni函數的調用獲取數據



通過 jnitrace -l libxxx.so com.xxx.xxx -i RegisterNatives 可以查看到so中的所有動態(tài)注冊的函數。

審核編輯:劉清
-
JAVA
+關注
關注
20文章
3001瀏覽量
116419 -
C++語言
+關注
關注
0文章
147瀏覽量
7682 -
python
+關注
關注
57文章
4876瀏覽量
90022
原文標題:App逆向之so分析方法
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
android中的surface
Linux系統(tǒng)動態(tài)庫與靜態(tài)庫函數的使用介紹
Linux系統(tǒng)動態(tài)庫與靜態(tài)庫函數的使用介紹
Linux系統(tǒng)動態(tài)庫與靜態(tài)庫函數的使用介紹
芯靈思SinlinxA33開發(fā)板的安卓控制LED-2-JNI基礎
如何在普通的鴻蒙工程中使用編譯好的SO庫文件
請問C++項目如何編譯成可在OpenHarmony3.1環(huán)境下使用的動態(tài)so文件?
JNI java調用so動態(tài)庫方法
RSA算法的JNI封裝步驟
Android下的DEX文件和SO文件梳理總結
Vivado ML版中動態(tài)函數交換的技術進步
動態(tài)分析so文件中的JNI函數
評論