前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ptrace使用

Ptrace使用

作者头像
Wilbur-L
修改2021-02-05 18:01:02
2K0
修改2021-02-05 18:01:02
举报
文章被收录于专栏:iOS底层原理

ptrace共有四个参数: long ptrace(enum __ptrace_request request,pid_t pid,void *addr,void *data); 其中第一个参数可以取如下内容:

代码语言:javascript
复制
PTRACE_TRACEME,   本进程被其父进程所跟踪。其父进程应该希望跟踪子进程
PTRACE_PEEKTEXT,  从内存地址中读取一个字节,内存地址由addr给出
PTRACE_PEEKDATA,  同上
PTRACE_PEEKUSER,  可以检查用户态内存区域(USER area),从USER区域中读取一个字节,偏移量为addr
PTRACE_POKETEXT,  往内存地址中写入一个字节。内存地址由addr给出
PTRACE_POKEDATA,  往内存地址中写入一个字节。内存地址由addr给出
PTRACE_POKEUSER,  往USER区域中写入一个字节,偏移量为addr
PTRACE_GETREGS,    读取寄存器
PTRACE_GETFPREGS,  读取浮点寄存器
PTRACE_SETREGS,  设置寄存器
PTRACE_SETFPREGS,  设置浮点寄存器
PTRACE_CONT,    重新运行
PTRACE_SYSCALL,  重新运行
PTRACE_SINGLESTEP,  设置单步执行标志
PTRACE_ATTACH,追踪指定pid的进程
PTRACE_DETACH,  结束追踪
具体用法:
  1. PTRACE_TRACEME ptrace(PTRACE_TRACEME,0 ,0 ,0) 本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。
  2. PTRACE_PEEKTEXT, PTRACE_PEEKDATA ptrace(PTRACE_PEEKTEXT, pid, addr, data) ptrace(PTRACE_PEEKDATA, pid, addr, data) 从内存地址中读取一个字节,pid表示被跟踪的子进程,内存地址由addr给出,data为用户变量地址用于返回读到的数据。在Linux(i386)中用户代码段与用户数据段重合所以读取代码段和数据段数据处理是一样的。
  3. PTRACE_POKETEXT, PTRACE_POKEDATA ptrace(PTRACE_POKETEXT, pid, addr, data) ptrace(PTRACE_POKEDATA, pid, addr, data) 往内存地址中写入一个字节。pid表示被跟踪的子进程,内存地址由addr给出,data为所要写入的数据。
  4. PTRACE_PEEKUSR ptrace(PTRACE_PEEKUSR, pid, addr, data) 从USER区域中读取一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,data为用户变量地址用于返回读到的数据。USER结构为core文件的前面一部分,它描述了进程中止时的一些状态,如:寄存器值,代码、数据段大小,代码、数据段开始地址等。在Linux(i386)中通过PTRACE_PEEKUSER和PTRACE_POKEUSR可以访问USER结构的数据有寄存器和调试寄存器。
  5. PTRACE_POKEUSR ptrace(PTRACE_POKEUSR, pid, addr, data) 往USER区域中写入一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,data为需写入的数据。
  6. PTRACE_CONT ptrace(PTRACE_CONT, pid, 0, signal) 继续执行。pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。
  7. PTRACE_SYSCALL ptrace(PTRACE_SYS, pid, 0, signal) 继续执行。pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。与PTRACE_CONT不同的是进行系统调用跟踪。在被跟踪进程继续运行直到调用系统调用开始或结束时,被跟踪进程被中止,并通知父进程。
  8. PTRACE_KILL ptrace(PTRACE_KILL,pid) 杀掉子进程,使它退出。pid表示被跟踪的子进程。
  9. PTRACE_SINGLESTEP ptrace(PTRACE_KILL, pid, 0, signle) 设置单步执行标志,单步执行一条指令。pid表示被跟踪的子进程。signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。当被跟踪进程单步执行完一个指令后,被跟踪进程被中止,并通知父进程。
  10. PTRACE_ATTACH ptrace(PTRACE_ATTACH,pid) 跟踪指定pid 进程。pid表示被跟踪进程。被跟踪进程将成为当前进程的子进程,并进入中止状态。
  11. PTRACE_DETACH ptrace(PTRACE_DETACH,pid) 结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。
  12. PTRACE_GETREGS ptrace(PTRACE_GETREGS, pid, 0, data) 读取寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有17个基本寄存器的值。
  13. PTRACE_SETREGS ptrace(PTRACE_SETREGS, pid, 0, data) 设置寄存器值,pid表示被跟踪的子进程,data为用户数据地址。此功能将设置所有17个基本寄存器的值。
  14. PTRACE_GETFPREGS ptrace(PTRACE_GETFPREGS, pid, 0, data) 读取浮点寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有浮点协处理器387的所有寄存器的值。
  15. PTRACE_SETFPREGS ptrace(PTRACE_SETREGS, pid, 0, data) 设置浮点寄存器值,pid表示被跟踪的子进程,data为用户数据地址。此功能将设置所有浮点协处理器387的所有寄存器的值。

ptrace(PT_DENY_ATTACH,0,0,0); 防护特点:

1.重签名Xcode运行之后闪退

2.手动打开正常

3.无法通过Debug附加

效果图:

debug
debug

可以很明显看到debugserver 无法使用直接断开连接

但是无法防止cycript调试

cycript
cycript

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 具体用法:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档