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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )相关的知识,希望对你有一定的参考价值。





一、dlopen 函数简介



dlopen 函数的作用是 打开一个 so 动态库 , 并返回该 so 的句柄 ;


包含头文件 :

#include<dlfcn.h>

函数原型 :

void * dlopen( const char * pathname, int mode);

参数说明 :

const char * pathname : 动态库的路径 , android 系统文件的绝对路径 ;

int mode : 动态库的打开法方式 ;


void* 返回值 : 动态库句柄





二、获取 目标进程 linker 中的 dlopen 函数地址



获取 某个动态库 / 可执行文件 中的某个方法的地址 , 参考 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 ) 博客 ;


获取 远程 目标进程 中的 动态库中的 函数地址流程 :

① 获取 本地进程 动态库 地址 ;

② 获取 远程进程 动态库 地址 ;

③ 计算 本地进程 与 远程进程 的 动态库 地址 偏移量 ;

④ 获取 本地进程 函数地址 ;

⑤ 根据 本地进程 函数地址 + 本地进程 与 远程进程 的 动态库 地址 偏移量 , 计算出 远程进程 动态库 的 函数地址 ;





三、远程调用 目标进程 linker 中的 dlopen 函数



dlopen 函数参数准备 : 将字符串 "/data/system/debug/libbridge.so" 写出到远程进程内存中 , 然后获取地址 , 该地址可以作为 char* 类型字符串使用 ;

	/* 向 目标进程 内存 写出 "/data/system/debug/libbridge.so" 数据 */
	ptrace_writedata(target_pid, map_base, (uint8_t*)library_path, strlen(library_path) + 1);

	parameters[0] = (long)map_base;
	parameters[1] = RTLD_NOW | RTLD_GLOBAL;

调用 dlopen 方法 :

	/* 调用 目标进程 的 dlopen 函数 , dlopen_addr 是 libbridge.so 的地址 , 注意分析 dlopen 参数含义
	   此处就是 注入 libbridge.so 动态库 */
	if (ptrace_call_wrapper(target_pid, "dlopen", dlopen_addr, parameters, 2, &regs) == -1)

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

  • 设置 EIP 寄存器 , 设置要执行的函数指令地址 ;
  • 设置 ESP 寄存器 , 设置要执行的函数参数的栈内存 ;

可以远程调用执行指定的方法 ;

以上是关于Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 )

Android 逆向Android 进程注入工具开发 ( 远程调用总结 | 远程调用注意事项 )

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

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

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

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