文章目录
- 一、等待进程状态改变
- 二、detach 脱离进程调试 PTRACE_DETACH
- 三、调试中继续运行程序 PTRACE_CONT
一、等待进程状态改变
上一篇博客 【Android 逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 ) 中 , 介绍了 attach 被调试进程 ;
之后需要 等待 被调试 进程的状态改变 , 如果进入处于被调试的状态下 , 其进程的状态会发生变化 ;
被调试进程一旦进程处于被调试状态 , 就会处于 WUNTRACED 状态 , WUNTRACED 是宏定义 值为 2 ;
attach 进程完整源码 : 开发的程序就是用于调试另外一个程序的代码 ;
代码语言:javascript复制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 参数 ;
代码语言:javascript复制ptrace(PTRACE_DETACH, m_nPid, NULL, 0)
参数含义参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;
detach 调试进程 完整代码 :
代码语言:javascript复制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 参数 , 可以让被调试进程继续执行 ;
代码语言:javascript复制ptrace(PTRACE_CONT, m_nPid, NULL, 0)
调试中继续运行程序完整代码 :
代码语言:javascript复制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()
方法 , 等待进程状态改变 ;
本操作不需要等待 被调试进程 状态返回变化 ;