【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开机画面
- android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」
- android 读取本地数据库db文件(Android sqlite)
- android退出app代码,Android应用退出代码各种方式
- mac 电脑android环境变量设置,mac上Android环境变量配置[通俗易懂]
- android定时器取消,Android定时器崩溃取消
- android短信验证码代码,Android短信验证码自动填写实现代码
- Android触摸事件_android设置按钮点击事件
- Android 编译_android线程
- android应用程序_chrome Android
- eclipse安卓项目_eclipse开发android
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
- 【Android 逆向】Android 进程代码注入原理 ( 注入本质 | 静态注入和动态注入 | 静态注入两种方式 | 修改动态库重打包 | 修改 /data/app/xx/libs 动态库 )
- 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | VS 自带的 Android 平台应用创建与配置 )
- 【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )
- 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★
- 【Android Gradle 插件】BuildType 编译类型配置 ⑥ ( BuildType#signingConfig 配置 )
- android Universal Image Loader for Android 说明文档 (1)详解手机开发
- android ViewPager+Fragment之懒加载详解手机开发
- android 超轻量级数据存储类详解编程语言
- android创建数据库(SQLite)保存图片示例
- 使用adb命令向Android模拟器中导入通讯录联系人的方法