0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

動(dòng)態(tài)分析so文件中的JNI函數(shù)

哆啦安全 ? 來(lái)源:編碼安全 ? 2023-04-10 11:18 ? 次閱讀

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。

a28c0bfe-d6bf-11ed-bfe3-dac502259ad0.png

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工具(版本需要配套好)

a2a35d0e-d6bf-11ed-bfe3-dac502259ad0.png

這個(gè)jnitrace安裝后主要核心的實(shí)現(xiàn)功能都在jnitrace.py和jnitrace.js

a2c041ee-d6bf-11ed-bfe3-dac502259ad0.png

a2e5642e-d6bf-11ed-bfe3-dac502259ad0.png

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

a2f24004-d6bf-11ed-bfe3-dac502259ad0.png

下圖是jnitrace.js的關(guān)鍵功能點(diǎn),注入后實(shí)際功能還是調(diào)用到底層的dlopen。

a30e7bde-d6bf-11ed-bfe3-dac502259ad0.png

實(shí)踐分析

Frida啟動(dòng)后會(huì)往要hook的進(jìn)程中注入frida的so文件

a31d83cc-d6bf-11ed-bfe3-dac502259ad0.png

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

a3401018-d6bf-11ed-bfe3-dac502259ad0.png

通過(guò)jnitrace -l libxxx.so com.xxx.xxx 可以打印輸出so中的jni函數(shù),以及這些jni函數(shù)的調(diào)用獲取數(shù)據(jù)

a356c6f0-d6bf-11ed-bfe3-dac502259ad0.png

a372e272-d6bf-11ed-bfe3-dac502259ad0.png

a396db5a-d6bf-11ed-bfe3-dac502259ad0.png

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

a3af5612-d6bf-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    在單片機(jī)上實(shí)現(xiàn)動(dòng)態(tài)加載功能

    本項(xiàng)目是一個(gè)在單片機(jī)(如:STM32)上實(shí)現(xiàn)動(dòng)態(tài)加載功能的函數(shù)庫(kù),與Windows的dll,Linuxso類(lèi)似,可以將代碼
    發(fā)表于 05-30 11:04 ?1788次閱讀

    android的surface

    使用libhgl.so庫(kù)。在libs/EGL/egl.cpp文件,選擇使用這兩個(gè)庫(kù)的一個(gè),主要操作在eglGetDisplay()函數(shù)
    發(fā)表于 03-04 15:54

    Linux系統(tǒng)動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)函數(shù)的使用介紹

    。相對(duì)于靜態(tài)函數(shù)庫(kù),動(dòng)態(tài)函數(shù)庫(kù)在編譯的時(shí)候并沒(méi)有被編譯進(jìn)目標(biāo)代碼,你的程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用該函數(shù)庫(kù)里的相應(yīng)
    發(fā)表于 04-02 16:21

    Linux系統(tǒng)動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)函數(shù)的使用介紹

    必須有。相對(duì)于靜態(tài)函數(shù)庫(kù),動(dòng)態(tài)函數(shù)庫(kù)在編譯的時(shí)候并沒(méi)有被編譯進(jìn)目標(biāo)代碼,你的程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用該函數(shù)庫(kù)里的相應(yīng)
    發(fā)表于 09-29 11:31

    8168的demos里如何加.so動(dòng)態(tài)鏈接庫(kù)

    8168的demos里如何加c++文件生成的 .so動(dòng)態(tài)鏈接庫(kù)
    發(fā)表于 06-21 11:56

    Linux系統(tǒng)動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)函數(shù)的使用介紹

    main.c調(diào)用了hello.c實(shí)現(xiàn)的函數(shù),使用靜態(tài)庫(kù)的方式編譯得到一個(gè)可執(zhí)行文件main_a 2、動(dòng)態(tài)庫(kù) 動(dòng)態(tài)庫(kù)的后綴為*.
    發(fā)表于 07-04 05:33

    芯靈思SinlinxA33開(kāi)發(fā)板的安卓控制LED-2-JNI基礎(chǔ)

    語(yǔ)句塊來(lái)加載動(dòng)態(tài)庫(kù)} } 程序?qū)崿F(xiàn)測(cè)試java代碼javah -jni Hello 生成Hello .h 打開(kāi)Hello .h 文件里面已經(jīng)寫(xiě)好C函數(shù)的名字C代碼將C
    發(fā)表于 02-22 16:55

    JNI類(lèi)的傳遞

    怎樣去創(chuàng)建JNI要傳遞的類(lèi)?從JNI得到返回類(lèi)的信息是什么?
    發(fā)表于 09-30 09:18

    如何在普通的鴻蒙工程中使用編譯好的SO庫(kù)文件

    DevEco Studio 默認(rèn)創(chuàng)建了libs目錄,所以將之前編譯好的SO文件直接拷貝到libs目錄即可。2.2 引入 JNITools 文件
    發(fā)表于 03-25 10:06

    請(qǐng)問(wèn)C++項(xiàng)目如何編譯成可在OpenHarmony3.1環(huán)境下使用的動(dòng)態(tài)so文件

    以前的Linux環(huán)境的C++項(xiàng)目,可以通過(guò)在CMakeList文件設(shè)置使用的工具鏈,編譯出各個(gè)開(kāi)發(fā)平臺(tái)下可以使用的so文件。請(qǐng)問(wèn),我現(xiàn)在在開(kāi)發(fā)平臺(tái)上,燒錄OpenHarmon V3.
    發(fā)表于 06-06 16:41

    ARM啟動(dòng)文件的__main, 介紹了C啟動(dòng)函數(shù)的設(shè)計(jì)

    ARM啟動(dòng)文件的__main, 介紹了C啟動(dòng)函數(shù)的設(shè)計(jì)
    發(fā)表于 09-20 09:34 ?9次下載
    ARM啟動(dòng)<b class='flag-5'>文件</b><b class='flag-5'>中</b>的__main, 介紹了C啟動(dòng)<b class='flag-5'>函數(shù)</b>的設(shè)計(jì)

    JNI java調(diào)用so動(dòng)態(tài)庫(kù)方法

    JNI Java調(diào)用so包相關(guān)問(wèn)題總結(jié),出現(xiàn)了很多問(wèn)題,按照操作應(yīng)該不會(huì)發(fā)生不到so包的錯(cuò)誤,其實(shí)最后出現(xiàn)的也是說(shuō)加載不到libpython2.7.x.so.1,我就納悶了,怎么和py
    發(fā)表于 11-28 13:13 ?3493次閱讀

    Android下的DEX文件SO文件梳理總結(jié)

    android逆向分析、脫殼破解分析過(guò)程免不了和android的各種文件格式打交道(so、dex、xml、art、oat等等)。
    的頭像 發(fā)表于 11-04 09:32 ?7078次閱讀

    Vivado ML版動(dòng)態(tài)函數(shù)交換的技術(shù)進(jìn)步

    電子發(fā)燒友網(wǎng)站提供《Vivado ML版動(dòng)態(tài)函數(shù)交換的技術(shù)進(jìn)步.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 09:32 ?0次下載
    Vivado ML版<b class='flag-5'>中</b><b class='flag-5'>動(dòng)態(tài)函數(shù)</b>交換的技術(shù)進(jìn)步

    在單片機(jī)上實(shí)現(xiàn)動(dòng)態(tài)加載功能的函數(shù)庫(kù)介紹

    本項(xiàng)目是一個(gè)在單片機(jī)(如:STM32)上實(shí)現(xiàn)動(dòng)態(tài)加載功能的函數(shù)庫(kù),與Windows的dll,Linuxso類(lèi)似,可以將代碼
    的頭像 發(fā)表于 11-09 10:55 ?1428次閱讀