Android 逆向代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )相关的知识,希望对你有一定的参考价值。
一、等待进程状态改变
上一篇博客 【Android 逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 ) 中 , 介绍了 attach 被调试进程 ;
之后需要 等待 被调试 进程的状态改变 , 如果进入处于被调试的状态下 , 其进程的状态会发生变化 ;
被调试进程一旦进程处于被调试状态 , 就会处于 WUNTRACED 状态 , WUNTRACED 是宏定义 值为 2 ;
attach 进程完整源码 : 开发的程序就是用于调试另外一个程序的代码 ;
int CPtrace::attachProc(pid_t nPid)
{
// 调用 ptrace 函数 attach 被调试进程
if (ptrace(PTRACE_ATTACH, nPid, NULL, 0) < 0) {
LOGE("error[%d][%s]", errno, strerror(errno));
return PTERR_ATTACH_FAILED;
}
// 被调试进程的 PID 进程号
m_nPid = nPid;
// 用于保存进程状态
int status = 0;
// 等待进程状态
// 如果进入处于被调试的状态下 , 其进程的状态会发生变化
// 一旦进程处于被调试状态 , 就会处于 WUNTRACED 状态 , WUNTRACED 是宏定义 值为 2
waitpid(nPid, &status, WUNTRACED);
return PTERR_SUCCESS;
}
需要状态返回变化时 , 才需要调用 waitpid()
方法 , 等待进程状态改变 ;
二、detach 脱离进程调试 PTRACE_DETACH
如果需要 detach 脱离调试进程 , 停止调试 , 调用 ptrace 方法 , 传入 PTRACE_DETACH 参数 ;
ptrace(PTRACE_DETACH, m_nPid, NULL, 0)
参数含义参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;
detach 调试进程 完整代码 :
int CPtrace::detachProc()
{
// 如果当前没有被调试的进程 , 直接返回
if (m_nPid == 0)return PTERR_SUCCESS;
// detach 调试进程 , 如果脱离成功 , 直接返回
if (ptrace(PTRACE_DETACH, m_nPid, NULL, 0) < 0) {
return PTERR_DETACH_FAILED;
}
// 收尾操作
m_nPid = 0;
return PTERR_SUCCESS;
}
需要状态返回变化时 , 才需要调用 waitpid()
方法 , 等待进程状态改变 ;
本操作不需要等待 被调试进程 状态返回变化 ;
三、调试中继续运行程序 PTRACE_CONT
调试过程中 , 如果需要被调试进程继续运行 , 运行到下一个断点或者运行一行代码 ,
调用 ptrace 方法 , 传入 PTRACE_CONT 参数 , 可以让被调试进程继续执行 ;
ptrace(PTRACE_CONT, m_nPid, NULL, 0)
调试中继续运行程序完整代码 :
int CPtrace::contProc()
{
if (ptrace(PTRACE_CONT, m_nPid, NULL, 0) < 0) {
LOGE("%d %s %d", errno, strerror(errno), m_nPid);
return PTERR_CONTINUE_FAILED;
}
return PTERR_SUCCESS;
}
需要状态返回变化时 , 才需要调用 waitpid()
方法 , 等待进程状态改变 ;
本操作不需要等待 被调试进程 状态返回变化 ;
以上是关于Android 逆向代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向代码调试器开发 ( ptrace 函数 | 向进程内存写出数据 )
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )
Android 逆向代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )