文章目录
一、等待进程状态改变
二、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() 方法 , 等待进程状态改变 ;
本操作不需要等待 被调试进程 状态返回变化 ;