衡阳派盒市场营销有限公司

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

哆啦安全 ? 來源:編碼安全 ? 2023-04-10 11:18 ? 次閱讀

APP逆向過程中,需要對dex文件和elf文件進行分析,又因現(xiàn)在各APP都有各種代碼保護手法,因此都需要進行動態(tài)分析。

今天就分享下對elf文件也就是so文件中動態(tài)分析so文件中JNI函數(shù)的方案。

jnitrace它是基于frida基礎上的一個工具,它是一個動態(tài)分析追蹤SO文件中的JNI API調(diào)用的工具,它可以進行指定SO文件進行跟蹤JNI調(diào)用。

基礎知識

1、JavaVM 和 JNIEnv

JNI 它定義了兩個關鍵數(shù)據(jù)結(jié)構(gòu):JavaVM和JNIEnv。它們本質(zhì)上都是指向函數(shù)表的二級指針。(在 C++ 版本中,它們是一些類,這些類具有指向函數(shù)表的指針,并具有每個通過該函數(shù)表間接調(diào)用的 JNI 函數(shù)的成員函數(shù)。)JavaVM 提供“調(diào)用接口”函數(shù),可以利用此類來函數(shù)創(chuàng)建和銷毀 JavaVM。

JNIEnv 提供了大部分 JNI 函數(shù), so中的原生函數(shù)都會收到 JNIEnv 作為第一個參數(shù)。該 JNIEnv 將用于線程本地存儲。因此無法在線程之間共享 JNIEnv。如果一段代碼無法通過其他方法獲取自己的 JNIEnv,應該共享相應 JavaVM,然后使用 GetEnv 發(fā)現(xiàn)線程的 JNIEnv。

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

JNIEnv 和 JavaVM 的 C 聲明與 C++ 聲明不同。"jni.h" include 文件會提供不同的類型定義符,具體取決于該文件是包含在 C 還是 C++ 中。因此不建議在這兩種語言包含的頭文件中添加 NIEnv 參數(shù)。

2、spawn和attach注入?yún)^(qū)別

Frida支持spawn和attach兩種啟動方式。

attach模式下,F(xiàn)rida會附加到當前的目標進程中,即需要App處于啟動狀態(tài),這也意味著它只能從當前時機往后Hook;

spawn模式下,F(xiàn)rida會自行啟動并注入進目標App,Hook的時機非常早,好處在于不會錯過App中相對較早(比如App啟動時產(chǎn)生的參數(shù)),缺點是假如想要Hook的時機點偏后,則會帶來大量干擾信息,嚴重甚至會導致server崩潰。

attach注入:APP啟動后再 hook,不能 hook APP的啟動階段。

spawn注入 :重啟 APP,適合 hook APP啟動階段。

基本操作

jnitrace使用需要配合python環(huán)境和frida工具(版本需要配套好)

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

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

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

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

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

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

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

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

實踐分析

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

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

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

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

通過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

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

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2975

    瀏覽量

    105149
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7027
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85039

原文標題:App逆向之so分析方法

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在單片機上實現(xiàn)動態(tài)加載功能

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

    android的surface

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

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

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

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

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

    8168的demos里如何加.so動態(tài)鏈接庫

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

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

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

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

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

    JNI類的傳遞

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

    如何在普通的鴻蒙工程中使用編譯好的SO文件

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

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

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

    ARM啟動文件的__main, 介紹了C啟動函數(shù)的設計

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

    JNI java調(diào)用so動態(tài)庫方法

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

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

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

    Vivado ML版動態(tài)函數(shù)交換的技術進步

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

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

    本項目是一個在單片機(如:STM32)上實現(xiàn)動態(tài)加載功能的函數(shù)庫,與Windows的dll,Linuxso類似,可以將代碼
    的頭像 發(fā)表于 11-09 10:55 ?1682次閱讀
    真人百家乐怎么对冲| 新澳博百家乐现金网| 合肥百家乐赌博机| 现金百家乐官网人气最高| 香港百家乐官网的玩法技巧和规则| 百家乐游戏机路法| 大发888免费送奖金| 百家乐官网真人游戏网| 百家乐官网赌博租| 百家乐英皇赌场娱乐网规则| 利记国际娱乐| 百家乐官网谋略| 百家乐双龙出海| 真人斗地主| 百家乐官网平点| 帝王百家乐的玩法技巧和规则| 赌球赔率| 千亿娱百家乐官网的玩法技巧和规则| 微信百家乐群二维码| 马牌百家乐官网娱乐城| 百家乐玩法守则| 大发888官方中文网址| 澳门百家乐官网先赢后输| 蓝盾百家乐具体玩法技巧| 2024年九运的房屋风水| 大发888娱乐城客户端lm0| 百家乐官网现金网平台排行榜| 百家乐赌博策略| 平陆县| 金臂百家乐开户送彩金| 万博网址| 博发百家乐游戏| 88娱乐城备用网址| 德州百家乐官网扑克牌| bet365官方网址| 百家乐官网发牌靴8| 大发扑克下载| 百家乐技巧发布| 时时博娱乐城| 百家乐游戏程序出售| 鼎丰娱乐城|