【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |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 studio不能输入中文_Android模拟器
- android 置灰不可点击,Android Studio 运行按钮灰色的完美解决方法
- xps 转 pdf android版,xps文件转换pdf
- android 模拟器 haxm,Android模拟器不使用HAXM
- android短信验证码方案,Android之短信验证码
- Android中mesure过程详解 –[通俗易懂]
- Android 编译_android线程
- Android平台ROM的定制及精简教程
- Android OpenCV 4.6.0 颜色追踪
- 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )
- 【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )
- 【Android 安装包优化】Android 中使用 SVG 图片 ( 批量转换 SVG 格式图片为 Vector Asset 矢量图资源 )
- 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )
- 【Android Gradle 插件】ProductFlavor 配置 ( AppExtension#externalNativeBuild 配置 | cmake 配置 | ndkBuild 配置 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑤ ( 执行 init-android-libyuv.sh | 执行 init-android-soundtouch.sh )
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑥ ( 进入 ijkplayer-android/android 目录 | 执行 compile-ijk.sh 脚本完成编译 )
- 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )
- 【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- 【错误记录】Android Studio 编译报错 ( Android Gradle plugin requires Java 11 to run. You are currently using )
- 【错误记录】Android Studio 编译报错 ( Could not resolve com.android.tools.build:gradle:7.4.2. )
- Android控制文字水平间距android:letterSpacing详解手机开发
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局详解手机开发
- android代码混淆详解手机开发
- Kali将Android设备变成黑客瑞士军刀
- android中图片的三级缓存cache策略(内存/文件/网络)
- android开发教程之开机启动服务service示例