【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )

2023-03-29 20:20:55 浏览数 (1)

文章目录

  • 一、等待进程状态改变
  • 二、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() 方法 , 等待进程状态改变 ;

本操作不需要等待 被调试进程 状态返回变化 ;

0 人点赞