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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux 系统调用号表

位置位于 /usr/include/asm/unistd.h 由于我是64位系统,所以有一些额外的东西。我的这个文件为下文#ifndef _ASM_X86_UNISTD_H #define _AS...

ptrace原理和应用

  • 2009-03-10 14:36
  • 778KB
  • 下载

ptrace分析

  • 2014-07-11 22:19
  • 498KB
  • 下载

Windows下的"ptrace"-父进程监视子进程Debugging API

原文地址:http://blog.csdn.net/ariesjzj/article/details/7226443  Linux下有功能强大ptrace,用于让父进程监视/修改/控制子进程的状态。...

linux下 玩转ptrace

译者序:在开发Hust Online Judge的过程中,查阅了不少资料,关于调试器技术的资料在网上是很少,即便是UNIX编程巨著《UNIX环境高级编程》中,相关内容也不多,直到我在 http:...

Linux源码分析(ptrace)

  • 2007-03-27 09:04
  • 778KB
  • 下载

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
  • 605

strace 和 ptrace 详解

学习, 转贴自: http://blog.csdn.net/Javadino/archive/2008/09/06/2891413.aspx http://blog.csdn.net/Javad...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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