【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )
文章目錄
- 一、dlsym 函數(shù)簡(jiǎn)介
- 二、獲取 目標(biāo)進(jìn)程 linker 中的 dlsym 函數(shù)地址
- 三、遠(yuǎn)程調(diào)用 目標(biāo)進(jìn)程 linker 中的 dlsym 函數(shù) 獲取 注入的 libbridge.so 動(dòng)態(tài)庫(kù)中的 load 函數(shù)地址
- 四、遠(yuǎn)程調(diào)用 目標(biāo)進(jìn)程 中的 libbridge.so 動(dòng)態(tài)庫(kù)中的 load 函數(shù)
一、dlsym 函數(shù)簡(jiǎn)介
dlsym 是 Dynamic Library Symbol 的縮寫 , 該函數(shù)的作用是 根據(jù) 動(dòng)態(tài)鏈接庫(kù) 句柄 和 符號(hào) , 返回對(duì)應(yīng) 符號(hào)的地址 , 這個(gè)符號(hào)可以是方法名 , 也可以是變量名 ;
包含頭文件 :
#include<dlfcn.h>函數(shù)原型 :
void* dlsym(void* handle, constchar* symbol)參數(shù)說明 :
① void* handle : dlopen 打開 動(dòng)態(tài)鏈接庫(kù) 的返回值;
② constchar* symbol : 函數(shù)名稱 / 全局變量名稱 ;
void* 返回值 : 返回對(duì)應(yīng) 函數(shù) / 變量 地址 ;
二、獲取 目標(biāo)進(jìn)程 linker 中的 dlsym 函數(shù)地址
獲取 某個(gè)動(dòng)態(tài)庫(kù) / 可執(zhí)行文件 中的某個(gè)方法的地址 , 參考 【Android 逆向】Android 進(jìn)程注入工具開發(fā) ( 注入代碼分析 | 獲取 遠(yuǎn)程 目標(biāo)進(jìn)程 中的 /system/lib/libc.so 動(dòng)態(tài)庫(kù)中的 mmap 函數(shù)地址 ) 博客 ;
獲取 遠(yuǎn)程 目標(biāo)進(jìn)程 中的 動(dòng)態(tài)庫(kù)中的 函數(shù)地址流程 :
① 獲取 本地進(jìn)程 動(dòng)態(tài)庫(kù) 地址 ;
② 獲取 遠(yuǎn)程進(jìn)程 動(dòng)態(tài)庫(kù) 地址 ;
③ 計(jì)算 本地進(jìn)程 與 遠(yuǎn)程進(jìn)程 的 動(dòng)態(tài)庫(kù) 地址 偏移量 ;
④ 獲取 本地進(jìn)程 函數(shù)地址 ;
⑤ 根據(jù) 本地進(jìn)程 函數(shù)地址 + 本地進(jìn)程 與 遠(yuǎn)程進(jìn)程 的 動(dòng)態(tài)庫(kù) 地址 偏移量 , 計(jì)算出 遠(yuǎn)程進(jìn)程 動(dòng)態(tài)庫(kù) 的 函數(shù)地址 ;
三、遠(yuǎn)程調(diào)用 目標(biāo)進(jìn)程 linker 中的 dlsym 函數(shù) 獲取 注入的 libbridge.so 動(dòng)態(tài)庫(kù)中的 load 函數(shù)地址
參考 【Android 逆向】Android 進(jìn)程注入工具開發(fā) ( 注入代碼分析 | 遠(yuǎn)程調(diào)用 目標(biāo)進(jìn)程中 libc.so 動(dòng)態(tài)庫(kù)中的 mmap 函數(shù) 二 | 準(zhǔn)備參數(shù) | 遠(yuǎn)程調(diào)用 mmap 函數(shù) ) 博客 , 通過
- 設(shè)置 EIP 寄存器 , 設(shè)置要執(zhí)行的函數(shù)指令地址 ;
- 設(shè)置 ESP 寄存器 , 設(shè)置要執(zhí)行的函數(shù)參數(shù)的棧內(nèi)存 ;
可以遠(yuǎn)程調(diào)用執(zhí)行指定的方法 ;
四、遠(yuǎn)程調(diào)用 目標(biāo)進(jìn)程 中的 libbridge.so 動(dòng)態(tài)庫(kù)中的 load 函數(shù)
下面是 libbridge.so 動(dòng)態(tài)庫(kù)的代碼 , 在該換行代碼中 , 只是調(diào)用 dlopen 函數(shù)加載了真正的 libnative.so 動(dòng)態(tài)庫(kù) , 這個(gè)動(dòng)態(tài)庫(kù)是進(jìn)行逆向操作的主要的庫(kù) , 執(zhí)行核心邏輯 ;
先遠(yuǎn)程注入 libbridge.so 動(dòng)態(tài)庫(kù) , 然后遠(yuǎn)程調(diào)用 libbridge.so 中的 load 函數(shù) , 將真正的 libnative.so 加載到目標(biāo)進(jìn)程中 ;
使用修改寄存器的方法 強(qiáng)行加載 libbridge.so 動(dòng)態(tài)庫(kù) , 會(huì)影響目標(biāo)進(jìn)程的布局 , 因此這個(gè)動(dòng)態(tài)庫(kù)越小越好 , 并且 使用完畢后 , 馬上關(guān)閉該動(dòng)態(tài)庫(kù) , libbridge.so 動(dòng)態(tài)庫(kù)只起一個(gè)敲門的作用 , libnative.so 加載完成后 , 直接將 libbridge.so 動(dòng)態(tài)庫(kù)干掉 , 過河拆橋 ;
#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; }
總結(jié)
以上是生活随笔為你收集整理的【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】Android
- 下一篇: 【Android 逆向】Android