日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

發布時間:2025/6/17 Android 22 豆豆

文章目錄

  • 一、dlsym 函數簡介
  • 二、獲取 目標進程 linker 中的 dlsym 函數地址
  • 三、遠程調用 目標進程 linker 中的 dlsym 函數 獲取 注入的 libbridge.so 動態庫中的 load 函數地址
  • 四、遠程調用 目標進程 中的 libbridge.so 動態庫中的 load 函數





一、dlsym 函數簡介



dlsym 是 Dynamic Library Symbol 的縮寫 , 該函數的作用是 根據 動態鏈接庫 句柄 和 符號 , 返回對應 符號的地址 , 這個符號可以是方法名 , 也可以是變量名 ;


包含頭文件 :

#include<dlfcn.h>

函數原型 :

void* dlsym(void* handle, constchar* symbol)

參數說明 :

① void* handle : dlopen 打開 動態鏈接庫 的返回值;

② constchar* symbol : 函數名稱 / 全局變量名稱 ;


void* 返回值 : 返回對應 函數 / 變量 地址 ;





二、獲取 目標進程 linker 中的 dlsym 函數地址



獲取 某個動態庫 / 可執行文件 中的某個方法的地址 , 參考 【Android 逆向】Android 進程注入工具開發 ( 注入代碼分析 | 獲取 遠程 目標進程 中的 /system/lib/libc.so 動態庫中的 mmap 函數地址 ) 博客 ;


獲取 遠程 目標進程 中的 動態庫中的 函數地址流程 :

① 獲取 本地進程 動態庫 地址 ;

② 獲取 遠程進程 動態庫 地址 ;

③ 計算 本地進程 與 遠程進程 的 動態庫 地址 偏移量 ;

④ 獲取 本地進程 函數地址 ;

⑤ 根據 本地進程 函數地址 + 本地進程 與 遠程進程 的 動態庫 地址 偏移量 , 計算出 遠程進程 動態庫 的 函數地址 ;





三、遠程調用 目標進程 linker 中的 dlsym 函數 獲取 注入的 libbridge.so 動態庫中的 load 函數地址



參考 【Android 逆向】Android 進程注入工具開發 ( 注入代碼分析 | 遠程調用 目標進程中 libc.so 動態庫中的 mmap 函數 二 | 準備參數 | 遠程調用 mmap 函數 ) 博客 , 通過

  • 設置 EIP 寄存器 , 設置要執行的函數指令地址 ;
  • 設置 ESP 寄存器 , 設置要執行的函數參數的棧內存 ;

可以遠程調用執行指定的方法 ;





四、遠程調用 目標進程 中的 libbridge.so 動態庫中的 load 函數



下面是 libbridge.so 動態庫的代碼 , 在該換行代碼中 , 只是調用 dlopen 函數加載了真正的 libnative.so 動態庫 , 這個動態庫是進行逆向操作的主要的庫 , 執行核心邏輯 ;


先遠程注入 libbridge.so 動態庫 , 然后遠程調用 libbridge.so 中的 load 函數 , 將真正的 libnative.so 加載到目標進程中 ;

使用修改寄存器的方法 強行加載 libbridge.so 動態庫 , 會影響目標進程的布局 , 因此這個動態庫越小越好 , 并且 使用完畢后 , 馬上關閉該動態庫 , libbridge.so 動態庫只起一個敲門的作用 , libnative.so 加載完成后 , 直接將 libbridge.so 動態庫干掉 , 過河拆橋 ;


#include <unistd.h> #include <jni.h> #include <dlfcn.h>#include <android/log.h> #define LOG_TAG "DongNao" #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))int load() {LOGW("%s(%d):%s\n", __FILE__, __LINE__, __FUNCTION__);void* handle = dlopen("/data/system/debug/libnative.so", RTLD_GLOBAL);LOGW("%s(%d):%s handle=%p\n", __FILE__, __LINE__, __FUNCTION__, handle);void* invoke = dlsym(handle, "invoke");LOGW("%s(%d):%s invoke=%p\n", __FILE__, __LINE__, __FUNCTION__, invoke);((void(*)())invoke)();return 0; }

總結

以上是生活随笔為你收集整理的【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。