文章目录
前言
一、等待远程进程 mmap 函数执行完毕
二、从寄存器中获取进程返回值
前言
前置博客 :
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )
本博客进行收尾 , 远程调用 mmap 函数后 , 等待函数执行 , 获取该函数执行的返回值 ;
一、等待远程进程 mmap 函数执行完毕
调用
waitpid(pid, &stat, WUNTRACED)
方法 , 阻塞等待 远程进程 的 mmap 函数执行完毕 , 直到远程进程状态位 WUNTRACED 时 ;
完整代码如下 :
/* 等待远程调用执行完毕 */ int stat = 0; waitpid(pid, &stat, WUNTRACED); while (stat != 0xb7f) { if (ptrace_continue(pid) == -1) { printf("error\n"); return -1; } waitpid(pid, &stat, WUNTRACED); }
二、从寄存器中获取进程返回值
等待远程进程 mmap 函数执行完毕返回后 ,
先调用 ptrace_getregs 方法 ,
ptrace_getregs(target_pid, regs)
获取远程进程的 寄存器信息 ;
然后读取该寄存器数据中的 EAX 寄存器值 , 用于获取远程执行 dlopen 函数的返回值 , 返回的是 libbridge.so 动态库的首地址 ;
/* 读取寄存器返回值 */ long ptrace_retval(struct pt_regs* regs) { #if defined(__arm__) return regs->ARM_r0; #elif defined(__i386__) return regs->eax; #else #error "Not supported" #endif }