【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )
一、调试进程 ATTACH 附着目标进程
在 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 ) 博客中 , 在 main 函数中获取了 进程号 PID , 下面开始将 SO 动态库注入该 PID 进程号对应的目标进程 ;
ptrace
函数调用的前提是 , 当前应用必须有 root 权限 , 否则调用会失败 ;
首先 , 调用
ptrace(PTRACE_ATTACH, pid, NULL, 0)
函数附着目标进程 , 获取目标进程的控制权 , 传入 PTRACE_ATTACH
参数 ;
具体的 ptrace 函数族的参数 , 参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;
之后 , 需要 阻塞等待 被调试 的 目标进程返回 , 如果目标进程状态变为 WUNTRACED
被调试状态 , 就可以执行下一步的操作 ;
int status = 0;
/* 等待关联进程结果返回 , 目标进程状态变为 WUNTRACED */
waitpid(pid, &status, WUNTRACED);
附着目标进程完整代码 :
/* 附着目标进程 */
int ptrace_attach(pid_t pid)
{
/* attach 关联 要调试的 目标进程 */
if (ptrace(PTRACE_ATTACH, pid, NULL, 0) < 0) {
perror("ptrace_attach");
return -1;
}
int status = 0;
/* 等待关联进程结果返回 , 目标进程状态变为 WUNTRACED */
waitpid(pid, &status, WUNTRACED);
return 0;
}
二、读取目标函数寄存器值并存档
1、主要操作流程
声明两个结构体 , 分别用于寄存器值操作 和 存档 , 存档的结构体一定不要写入数据 , 之后恢复寄存器值时需要用到 ;
/* regs 结构体 用于存储寄存器值
original_regs 结构体 用于存储寄存器值存档 */
struct pt_regs regs, original_regs;
之后 , 调用 ptrace_getregs
函数 , 读取目标进程的寄存器值 ;
/* 获取寄存器值 */
if (ptrace_getregs(target_pid, ®s) == -1)
goto exit;
最后 , 将寄存器的值存档 ,
/* save original registers 寄存器值存档 */
memcpy(&original_regs, ®s, sizeof(regs));
寄存器读取存档代码示例 :
/* regs 结构体 用于存储寄存器值
original_regs 结构体 用于存储寄存器值存档 */
struct pt_regs regs, original_regs;
/* 获取寄存器值 */
if (ptrace_getregs(target_pid, ®s) == -1)
goto exit;
/* save original registers 寄存器值存档 */
memcpy(&original_regs, ®s, sizeof(regs));
2、ptrace 函数 PTRACE_GETREGS 读取寄存器值
在 ptrace_getregs
函数中 , 调用
ptrace(PTRACE_GETREGS, pid, NULL, regs)
方法 , 获取目标进程的寄存器数据 , 传入 PTRACE_GETREGS
参数 ;
具体的 ptrace 函数族的参数 , 参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;
/* 获取寄存器值 */
int ptrace_getregs(pid_t pid, struct pt_regs* regs)
{
if (ptrace(PTRACE_GETREGS, pid, NULL, regs) < 0) {
perror("ptrace_getregs: Can not get register values");
return -1;
}
return 0;
}
相关文章
- 记一次msfconsole_android渗透实验
- android脚步--Relativelayout设置
- 【学习总结】IOS系统和Android系统的区别
- Android依赖注入:Google Guice on Android的使用及相关资源
- Android 11 静默安装和静默卸载
- android:Activity按返回键不销毁当前Activity
- Android【报错】. lang。android.app ClassCastException。SharedPreferencesImpl不能被强制转换为android.content.Shared
- Android 悬浮按钮 两种实现方法
- Android 实现点击按钮弹出日期选择器与时间选择器
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
- 【Android 逆向】Android 进程注入工具开发 ( SO 进程注入环境及 root 权限获取 | 进程注入时序分析 )
- 【Android 逆向】Android 进程注入工具开发 ( 系统调用 | Android NDK 中的系统调用示例 )
- 【Android 逆向】Android 进程注入工具开发 ( 远程调用总结 | 远程调用注意事项 )
- 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 命令行中获取要调试的应用进程的 PID | 进程注入调试进程内存的 so 库 )
- 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库解码 WebP 图片 )
- Android -> 怎样避免Handler引起内存泄露
- Android的第二次增加SurfaceView基本使用
- Android培训班(86)内核运行之前的引导程序
- 【Android入门】5、Broadcast 广播、Kotlin 的高阶函数、泛型、委托
- Android 11.0 Launcher3 folder文件夹文件居中显示的定制
- Android Studio第一个NDK程序
- 为Android安装BusyBox —— 完整的bash shell