Chinaunix首页 | 论坛 | 博客
  • 博客访问: 383022
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-24 16:18
个人简介

为啥不能追求自己的爱好一辈子呢

文章分类

全部博文(80)

文章存档

2017年(1)

2015年(2)

2014年(18)

2013年(59)

分类: LINUX

2013-12-11 15:32:28

今天突然想看看ltrace或者是strace是怎么实现的,突发奇想就这么办吧

点击(此处)折叠或打开

  1. strace ltrace ls
     看到里面或多调用ptrace就研究了一下ptrace。man了一下,然后去网上看了一个例子,函数原型
#include
     long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

其中request可以是
PTRACE_PEEKUSER   操作系统在调用系统函数的时候会看一下是不是被挂载,
                                    如果被挂载的话会把当前调用系统的寄存器的值放在一个叫做user 的区域,这个结构定义在sys/usr.h
                                    ,我们通过传递需要取得的 寄存器在该结构的偏移量。

PTRACE_PEEKTEXT    获取指定地址的数据。
PTRACE_POKETEXT    填充制定地址的数据
。。。
自己稍微试试了下我的是x86_64 操作系统

点击(此处)折叠或打开

  1. #include <sys/ptrace.h>
  2. #include <sys/types.h>
  3. #include <sys/wait.h>
  4. #include <unistd.h>
  5. #include <sys/reg.h> /*在32位机器上linux/user.h可以自己搜索 */
  6. int main()
  7. { pid_t child;
  8.     long orig_rax;
  9.     child = fork();
  10.     if(child == 0) {
  11.    //表明该进程会被父进程监视,如果触发了任何信号,改进程就会停止,父进程会通过wait得知
  12.         ptrace(PTRACE_TRACEME, 0, NULL, NULL);

  13.         execl("/bin/ls", "ls", NULL);
  14.     }
  15.     else {
  16.         wait(NULL);
  17.         orig_rax = ptrace(PTRACE_PEEKUSER,
  18.                           child, 8 * ORIG_RAX,//因为64位机器unsigned long 是8 byte,32位的话是4* ORIG_EAX
  19.                           NULL);
  20.         printf("The child made a "
  21.                "system call %ld\n", orig_rax);
  22.         ptrace(PTRACE_CONT, child, NULL, NULL);
  23.     }
  24.     return 0;
  25. }
运行成功,我们可以通过ptrace做很过别的事情。

阅读(1228) | 评论(0) | 转发(0) |
2

上一篇:fork debug

下一篇:ubuntu-desktop 安装不了

给主人留下些什么吧!~~