文章目录
一、代码调试器功能简介
二、Attach 进程
一、代码调试器功能简介
代码调试器功能 :
设置断点 : 无论什么类型的调试器 , 都必须可以设置断点 , 运行到断点处 , 挂起被调试进程 , 读取当前状态的 CPU 寄存器和内存数据 ;
arm 架构中 , 有一个单步调试标志位 , 将该标志位设置为 1 , 即可进行单步调试 ;
x86 架构中 , 主要是靠 int3 触发 , int3 对应 0xCC 机器码 , 将该机器码写入指令指定位置后 , 就会执行中断 , 调试器捕获该中断处理 , 就可以进入调试 ;
如果没有设置断点 , 想要调试程序 , 只能在系统调用时 , 触发中断 ; 如 : printf , 打印日志 , 文件改变 , 显示内容改变 等 ;
读写内存 : 可以读写 被调试进程 的内存数据 ;
读写寄存器 : 可以读写 被调试进程 的 CPU 寄存器数据 ; 如果有多个线程 , 默认读写主线程寄存器 ;
恢复运行 : 调试完毕后 , 还需要可以恢复运行 ; 调用 ptrace 函数 , 传入 PTRACE_CONT 参数 , 就可以继续进行 ;
上述所有操作 , 都是通过调用 ptrace 方法完成的 , 只是传入不同的参数 , 执行不同的操作 ;
参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;
二、Attach 进程
进程 A 调试 进程 B , 首先要 attach 进程 B , attach 操作需要指定 进程 B 的 进程号 PID ;
进程 ID 在当前系统运行时是唯一的 ; 进程 B 每次启动时 , 进程号是随机分配的 , 值并不固定 ;
PID 进程号的取值范围 0 ~ 32767 ; 上限是 65535 一半 ;
一般情况下 1000 以下的进程号 , 是系统进程使用的 ;
以 非 root 权限执行的进程 , 都是 1000 以上的进程号 ;
Attach 进程代码 : PTRACE_ATTACH 参数表示该函数操作是 Attach 被调试进程 , nPid 参数为 进程 PID ;
ptrace(PTRACE_ATTACH, nPid, NULL, 0)
ptrace 函数参考文档 : https://man7.org/linux/man-pages/man2/ptrace.2.html