前言:

  在动手尝试MBE系列课程第一天中的小程序时,遇到了一个ptrace反调试的问题,当然简单的做一次patch也是可以的。但是本着打破沙锅问到底的精神,到网上查看了一些资料,整理到这里。

  分别转载自 如何调试加入了ptrace的程序 以及 玩转ptrace。 

  以及,一下内容我并未亲自尝试。难免会有不足之处,后面会慢慢补充,有错之处请大家指出,谢谢分享。

 

ptrace 简介:

  你想过怎么实现对系统调用的拦截吗?你尝试过通过改变系统调用的参数来愚弄你的系统kernel吗?你想过调试器是如何使运行中的进程暂停并且控制它吗?

  你可能会开始考虑怎么使用复杂的kernel编程来达到目的,那么,你错了。实际上Linux提供了一种优雅的机制来完成这些:ptrace系统函数。 ptrace提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪。

  使用ptrace,你可以在用户层拦截和修改系统调用(sys call),修改它的参数,插入代码给正在运行的程序以及偷窥和篡改进程的寄存器和数据段。

  具体的使用暂不深究,有兴趣的同学可以点进上方链接去学习学习;

 

  ptrace函数原型

  ptrace 反调试

  request:请求执行的行为

  pid:目标进程标识。
  addr:执行peek和poke操作的目标地址。 
  data:对于poke操作,存放数据的地方。对于peek操作,获取数据的地方。

  其中request有如下选择:

#define PT_TRACE_ME 0 /* child declares it's being traced */

#define PT_READ_I 1 /* read word in child's I space */

#define PT_READ_D 2 /* read word in child's D space */

#define PT_READ_U 3 /* read word in child's user structure */

#define PT_WRITE_I 4 /* write word in child's I space */

#define PT_WRITE_D 5 /* write word in child's D space */

#define PT_WRITE_U 6 /* write word in child's user structure */

#define PT_CONTINUE 7 /* continue the child */

#define PT_KILL 8 /* kill the child process */

#define PT_STEP 9 /* single step the child */

#define PT_ATTACH 10 /* trace some running process */

#define PT_DETACH 11 /* stop tracing a process */

#define PT_SIGEXC 12 /* signals as exceptions for current_proc */

#define PT_THUPDATE 13 /* signal for thread# */

#define PT_ATTACHEXC 14 /* attach to running process with signal exception */


#define PT_FORCEQUOTA 30 /* Enforce quota for root */

#define PT_DENY_ATTACH 31

#define PT_FIRSTMACH 32 /* for machine-specific requests */
View Code

相关文章: