文章目录

  • 一、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 函数地址 并 通过 远程调用 执行该函数 )相关推荐

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

    文章目录 一.dlopen 函数简介 二.获取 目标进程 linker 中的 dlopen 函数地址 三.远程调用 目标进程 linker 中的 dlopen 函数 一.dlopen 函数简介 dlo ...

  2. 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

    文章目录 一.Android 进程注入工具开发系列博客 二.Android 进程注入工具 源码下载编译 三.逆向环境搭建 四.使用注入工具进行逆向操作 1.获取远程进程号 2.注入工具准备 3.注入动 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )

    文章目录 一.dlclose 函数简介 二.关闭注入的 libbridge.so 动态库 三.恢复寄存器 四.脱离远程调试附着 一.dlclose 函数简介 dlclose 函数的作用是 卸载一个 指 ...

  4. 【Android 逆向】Android 进程注入工具开发 ( SO 进程注入环境及 root 权限获取 | 进程注入时序分析 )

    文章目录 一.SO 进程注入环境及 root 权限获取 二.进程注入时序分析 一.SO 进程注入环境及 root 权限获取 SO 注入的前提必须有 root 权限 , 有了 root 权限后 , 才能 ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )

    文章目录 前言 一.加载 libnattive.so 动态库 二. libnattive.so 动态库启动 三. pthread_create 线程开发 四. 线程执行函数 前言 libbridge. ...

  6. 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

    文章目录 前言 一.x86 架构的返回值获取 二.ARM 架构远程调用 前言 在之前的博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  8. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...

  9. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )

    文章目录 一.调试进程 ATTACH 附着目标进程 二.读取目标函数寄存器值并存档 1.主要操作流程 2.ptrace 函数 PTRACE_GETREGS 读取寄存器值 一.调试进程 ATTACH 附 ...

最新文章

  1. RedHat 年度报告:只索取不贡献的开源消费“大户”不受待见
  2. 数据中心运维认证中的管理要求
  3. 实战案例丨小型企业如何从IPv4迁移至IPv6
  4. 推荐几个出论文的好方向
  5. foreach、qAsConst用法总结
  6. 【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码
  7. SQL嵌套语句执行顺序
  8. cmd炫酷代码_基本操作!在VS 代码中如何使用Jupyter Notebook
  9. Android:使用SharedPreferences进行数据存储
  10. redis windows下使用及redis命令
  11. 项目合作需求、数据集合作需求
  12. STC学习:定时器和中断
  13. 方舟无限资源服务器,方舟生存进化怎么无限资源
  14. buctoj2021年ACM竞赛班训练(四)全题解
  15. oppo计算机找不到,oppo手机照片在电脑显示不出来怎么办啊
  16. 数学之美(Beauty Of Mathematics)
  17. Assignment写作选题及诀窍怎么分析?
  18. 深入理解 RPC 之序列化篇 --Kryo
  19. 基于Qt的ui图形化界面进行的界面设计
  20. NVIDIA嵌入式开发板Jetson TX1教程

热门文章

  1. 毕业设计记录(三)mysql的SQL语句
  2. 汇编学习心得(二)关于字符的处理
  3. char,TCHAR,WCHAR区别
  4. Blend学习资料总结
  5. 人的一生,有三件事情不能等
  6. java中后端拼接字符串返回前台页面换行显示
  7. 2018总结及2019计划
  8. WEB框架原理(socket)
  9. python与mysql数据库连接中常见错误
  10. java 工厂的变形模拟的各种应用