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


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


目录
相关文章
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
2226 2
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
964 2
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
748 4
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
902 4
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
1033 0
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
1252 4
|
数据采集 监控 API
如何监控一个程序的运行情况,然后视情况将进程杀死并重启
这篇文章介绍了如何使用Python的psutil和subprocess库监控程序运行情况,并在程序异常时自动重启,包括多进程通信和使用日志文件进行断点重续的方法。
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
290 3
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
405 1
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
540 0

热门文章

最新文章