【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )
文章目錄
- 一、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 函数地址 并 通过 远程调用 执行该函数 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】Android
- 下一篇: 【Android 逆向】Android