91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

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

哆啦安全 ? 來源:編碼安全 ? 2023-04-10 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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。

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

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

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

這個jnitrace安裝后主要核心的實現功能都在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í)行后的數據。

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

下圖是jnitrace.js的關鍵功能點,注入后實際功能還是調用到底層的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函數,以及這些jni函數的調用獲取數據

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)注冊的函數。

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






審核編輯:劉清

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

    關注

    20

    文章

    3001

    瀏覽量

    116419
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7682
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90022

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    android的surface

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

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

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

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

    必須有。相對于靜態(tài)函數庫,動態(tài)函數庫在編譯的時候并沒有被編譯進目標代碼,你的程序執(zhí)行到相關函數時才調用該函數庫里的相應
    發(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)庫函數的使用介紹

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

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

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

    JNI類的傳遞

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

    JNI是什么?如何配置JNI環(huán)境?

    JNI是什么?如何配置JNI環(huán)境?
    發(fā)表于 03-02 07:25

    如何在普通的鴻蒙工程中使用編譯好的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文件。請問,我現在在開發(fā)平臺上,燒錄OpenHarmon V3.
    發(fā)表于 06-06 16:41

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

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

    RSA算法的JNI封裝步驟

    要求較高的算法往往是基于C/C++語言(與硬件關聯性更強)實現的。如果應用程序需要基于JAVA編程實現時,這就會有一些矛盾。此時,通過JNI技術,Java開發(fā)者可以在不了解算法內容的情況下,方便快捷的使用C/C++加密算法的動態(tài)庫,實現跨語言調用。例如有如下的應用場景:嵌
    的頭像 發(fā)表于 06-04 17:45 ?2805次閱讀
    RSA算法的<b class='flag-5'>JNI</b>封裝步驟

    Android下的DEX文件SO文件梳理總結

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

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

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

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

    本項目是一個在單片機(如:STM32)上實現動態(tài)加載功能的函數庫,與Windows的dll,Linuxso類似,可以將代碼
    的頭像 發(fā)表于 11-09 10:55 ?2804次閱讀