文章目录

  • 一、ptrace 函数族
    • 1、进程附着
    • 2、进程脱离
    • 3、进程数据读写权限
    • 4、进程对应的主线程寄存器读写
    • 5、单步调试
    • 6、继续向后执行
  • 二、ptrace 函数族状态转换

一、ptrace 函数族


ptrace 函数原型 : ptrace 函数实际上是由一系列的函数组成 , 具体调用哪个函数 , 要根据第一个参数确定 ;

       #include <sys/ptrace.h>long ptrace(enum __ptrace_request request, pid_t pid,void *addr, void *data);

ptrace 函数参考文档 : https://man7.org/linux/man-pages/man2/ptrace.2.html

下面是 enum __ptrace_request request 参数的可能的取值 : 在上述文档中有详细的说明 ;

1、进程附着

PTRACE_ATTACH : 指明要附着的进程 ;

进程 A 要 调试进程 B , 在进程 A 中 先通过 ptrace 函数 附着进程 B , 传入 PTRACE_ATTACH 作为第一参数 ;
( 注意 : 进程 A 必须有 root 权限 )

调用 ptrace 函数时 , 会调用系统内核层 , 给进程 A 一个权限 , 将被调试进程 B 的控制权限交给 进程 A ;

进程 A 调试 进程 B 时 , 进程 B 被挂起 , 进程 B 的 CPU 和 内存信息 , 都会被保存到内存中 , 进程 B 处于休眠状态 , CPU 不会运行 进程 B 的任何指令 ;

2、进程脱离

PTRACE_DETACH : 要脱离的进程 ;

进程 A 如果调用 ptrace 函数 , 传入 PTRACE_DETACH , 就会释放权限 , 发出信号 , 进程 B 恢复运行 ;

3、进程数据读写权限

读取进程数据权限 : PTRACE_PEEKTEXT、PTRACE_PEEKDATA、PTRACE_PEEKUSER

写入进程数据权限 : PTRACE_POKETEXT、PTRACE_POKEDATA、PTRACE_POKEUSER

注意 : 读写内存时 , 尽量在进程挂起后读写 , 否则内存数据不可靠 ;

4、进程对应的主线程寄存器读写

读取寄存器 : PTRACE_GETREGS

写出寄存器 : PTRACE_SETREGS

同一个进程 , 可能有多个线程 , 不同线程可能会被分配到不同的 CPU , 进程读写的寄存器可能有多套 ;

上面的 PTRACE_GETREGS , PTRACE_SETREGS , 读写的寄存器 是 执行 主线程 的 CPU 的 寄存器 ;

5、单步调试

PTRACE_SYSCALL : 每当发生系统调用时, 被调试进程暂停 , 将控制权交还给调试进程 ;

PTRACE_SINGLESTEP : 每当执行一条指令时 , 被调试进程暂停 , 将控制权交还给调试进程 ; 单步调试 ;

6、继续向后执行

PTRACE_CONT : ptrace 调试进程 , 完毕之后 , 退出调试 , 程序继续向后执行 , 使用该 PTRACE_CONT 作为 ptrace 函数的 第一参数即可 ;

CONTINUE 继续执行 ;

二、ptrace 函数族状态转换


进程 A 调试 进程 B , 进程 A 先 调用 ptrace 函数 Attach 进程 B , 可以进行 数据读写 , 单步执行 , 等待系统调用 , 读写寄存器 等操作 , 执行完毕后 可以继续执行 ;

调试完毕后 , 进程 B 脱离 Detach 进程 A 的调试 ;

【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )相关推荐

  1. 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )

    文章目录 前言 一.刷新 CPU 高速缓存 二.处理拦截函数 1.桩函数 2.处理拦截函数 三.返回特定结果 四.相关完整代码 前言 [Android 逆向]函数拦截实例 ( 函数拦截流程 | ① 定 ...

  2. 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )

    文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...

  3. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

    文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...

  4. 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

    文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...

  5. 【Android 逆向】函数拦截 ( CPU 高速缓存机制 | CPU 高速缓存机制 导致 函数拦截失败 )

    文章目录 一.CPU 高速缓存机制 二.CPU 高速缓存机制 导致 函数拦截失败 一.CPU 高速缓存机制 CPU 架构模型中 , 指令 在开始时 , 存放在内存中 , 如 : /proc/pid/m ...

  6. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )

    文章目录 一.通过修改 GOT 全局偏移表拦截函数 二.通过在实际被调用的函数中添加跳转代码实现函数拦截 一.通过修改 GOT 全局偏移表拦截函数 使用 GOT 全局偏移表 拦截函数 , 只需要将 G ...

  7. 【Android 逆向】函数拦截 ( 使用 cache_flush 系统函数刷新 CPU 高速缓存 | 刷新 CPU 高速缓存弊端 | 函数拦截推荐时机 )

    文章目录 一.使用 cache_flush 系统函数刷新 CPU 高速缓存 二.使用 cache_flush 系统函数刷新 CPU 高速缓存的弊端 三.函数拦截推荐时机 一.使用 cache_flus ...

  8. 【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )

    文章目录 一.函数拦截流程 二.定位动态库及函数位置 一.函数拦截流程 函数拦截流程 : 定位动态库及函数位置 : 获取该动态库在内存中的位置 , 以便于 查找函数位置 ; 插桩 : 在函数的入口处插 ...

  9. 【Android 逆向】函数拦截原理 ( 可执行程序基本结构 | GOT 全局偏移表 | 可执行程序函数调用步骤 )

    文章目录 一.可执行程序基本结构 二.GOT 全局偏移表 三.可执行程序函数调用步骤 一.可执行程序基本结构 程序加载到内存中之后 , 会分为以下 333 个部分 : 可执行程序 自定义函数库 : L ...

最新文章

  1. java绘制统计直方图取平均_统计学——直方图解析 - osc_lv8qb16y的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. service-mesh
  3. 二叉树(中序遍历)非递归
  4. boost::replace相关的测试程序
  5. Navicat 提示 Access violation at address ***(771B7870) in module ‘ntdll.dll’. Read of address ***(220A
  6. ClickHouse之简单性能测试
  7. ueditor chrome bug
  8. Eclipse Plugin for Hadoop2.2.0
  9. PLSql不用安装Oracle客户端,实现远程连接
  10. 火车售票系统html模板,火车售票系统设计
  11. 微信应用开发简单示例,学生自助报道系统
  12. oracle同义词对象,oracle数据库对象-同义词
  13. 计算机软件高级职称有啥用,计算机软考高级职称有什么用
  14. BootDo架构-基于 Springboot 和 Mybatis 的后台管理系统
  15. 开源 | Objective-C Swift 最轻量级 Hook 方案
  16. 《C++ Primer》学习笔记
  17. koa +ts 搭建简单项目
  18. python基于百度智能云实现批量身份证信息识别(附完整代码,可直接使用)
  19. MATLAB 遗传算法
  20. ios 热更新jsPatch

热门文章

  1. Guava学习笔记:Preconditions优雅的检验参数
  2. 广东省广播电视网络股份有限公司佛山分公司BOSS系统容灾中心建设项目
  3. 学习Unix/Linux编程要学些什么
  4. 《潜伏》走红背后的心理原因
  5. mapreduce原理
  6. Id.exe和ld.exe: cannot open output file … : Permission denied问题。
  7. 一张图,一棵大树,六种人, 六载人生 ~
  8. DataGridView的单元格控制只能输入数字
  9. 提高你的Java代码质量吧:如果有必要,使用变长数组吧
  10. Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0