ptrace的小例子

原创 2016年05月30日 10:34:06

#include <sys/ptrace.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <sys/user.h>

#include <errno.h>

#include <stdlib.h>

#include <stdio.h>

#include <signal.h>

#include <stddef.h>


static void* const break_addr = (void*)0x40074d;

static long text;


int main(int argc, char *argv[])

{
    pid_t pid;
    long err;

    struct user_regs_struct regs;


    pid = fork();
    if (pid == 0)
    {
        int i =0;
        sleep(1);
        printf("hello=%d\n",i++);
        printf("world=%d\n",i++);
    }
    else if (pid > 0)
    {
        err = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
        if (err == -1)
        {
            printf("attach err due to %d\n",errno);
        }
        waitpid(pid, NULL, 0);

        // set trap at breakpoint
        {
            text = ptrace(PTRACE_PEEKTEXT, pid, break_addr, NULL);
            if (text == -1)
            {
                printf("peek text err due to %d\n",errno);
            }

            long trap = (text & (~0xff)) | 0xcc;
            err = ptrace(PTRACE_POKETEXT, pid, break_addr, (void*)trap);
            if (err == -1)
            {
                printf("poke text err due to %d\n",errno);
            }

            ptrace(PTRACE_CONT, pid, NULL, NULL);
            waitpid(pid,NULL,0);
        }

        // restore at breakpoint
        {
            sleep(5);
            err = ptrace(PTRACE_GETREGS, pid, NULL, &regs);
            if (err == -1)
            {
                printf("get regs err due to %d\n",errno);
            }
#if 0
            for(i=0;i<sizeof(regs)/sizeof(unsigned long long int);i++)
            {
                unsigned long long int *p = (unsigned long long int *)&regs;
                printf("reg:%llx\n",p[i]);
            }
#endif
            regs.rip = (unsigned long long int)break_addr;
            err = ptrace(PTRACE_SETREGS, pid, NULL, &regs);
            if (err == -1)
            {
                printf("restore regs err due to %d\n",errno);
            }

            err = ptrace(PTRACE_POKETEXT, pid, break_addr, (void*)text);
            if (err == -1)
            {
                printf("restore text err due to %d\n",errno);
            }

            ptrace(PTRACE_CONT, pid, NULL, NULL);
        }

        waitpid(pid,NULL,0);
        printf("exit\n");
    }
    return 0;
}

linux3.5.4 ptrace源码分析二(系列二)

相比较于PTRACE_TRACEME,PTRACE_ATTACH则是一个进程(将要成为父进程)主动的去trace一个正在运行的进程(子进程)PTRACE_ATTACH的主要处理函数如下: static...

Linux源码分析(ptrace)

  • 2007年03月27日 09:04
  • 779KB
  • 下载

Linux上程序调试的基石(1)--ptrace

引子: 1.在Linux系统中,进程状态除了我们所熟知的TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_STOPPED等,还有一个TASK_TRACED。这表明这个进程处于什...

ptrace运行原理及使用详解

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

使用ptrace向已运行进程中注入.so并执行相关函数

1. 简介     使用ptrace向已运行进程中注入.so并执行相关函数,其中的“注入”二字的真正含义为:此.so被link到已运行进程(以下简称为:目标进程)空间中,从而.so中的函数在目标进程...

玩转ptrace(一) [转]

原文:http://blog.chinaunix.net/u/19651/showart_362901.html英文原文:http://www.linuxjournal.com/article/610...

linux下 玩转ptrace

by Pradeep Padala Created 2002-11-01 02:00 翻译: Magic.D E-mail: adamgic@163.com 译者序:在开发Hust Onl...
  • legan
  • legan
  • 2014年11月06日 15:49
  • 694

strace 和 ptrace 详解

学习, 转贴自: http://blog.csdn.net/Javadino/archive/2008/09/06/2891413.aspx http://blog.csdn.net/Javad...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ptrace的小例子
举报原因:
原因补充:

(最多只允许输入30个字)