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

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

文章目录

一、等待进程状态改变

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


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


目录
相关文章
|
2月前
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
73 2
|
1月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
51 8
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
35 1
|
2月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
372 2
|
3月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
38 2
|
3月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
400 4
|
4月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
58 3
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)

相关实验场景

更多