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 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )

Android 逆向代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )