使用ptrace从c中的另一个进程读取一块内存

时间:2015-02-24 00:59:23

标签: c

我已经在这个代码上工作了几个小时而且我的想法不合时宜。可能是我使用read()函数的方式,但是程序的输出总是一样的。

  

输出:   !“#$%&安培;'()* +, - / 0123456789:;?< => @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [] ^ _`ABCDEFGHIJKLMNOPQRSTUVWXYZ {|}

落后于一些垃圾字符

我的编码中可能存在一些愚蠢的错误,在今天之前已经有近两年没有用c编码了......

无论如何,如果有人能够指出我做错了什么,那将非常感激。

int attach(int start, int pid)
{
    long ret;

    if ( start == 1 )
    {
        ret = ptrace (PTRACE_ATTACH, pid, NULL, NULL);
    }else{
        ret = ptrace (PTRACE_DETACH, pid, NULL, NULL);
    }

    if ( ret < 0 )
    {
        printf("Could not attach to pid\n"); exit(-1);
    }

    waitpid(pid, NULL, WUNTRACED);

    return(ret);
}

int dump(int pid, unsigned long long addr, unsigned long long endaddr, char *outfile)
{
    int output;
    int mem_fd;
    char mem_file_name[2048];
    unsigned long long size = endaddr - addr;
void *buf=malloc(size);
memset(buf,0,size);

    // attach
    attach(1,pid);

    // open the memory
    sprintf(mem_file_name, "/proc/%d/mem", pid);
    mem_fd = open(mem_file_name,O_RDONLY);
    lseek(mem_fd,addr,SEEK_SET);
    read(mem_fd,buf,size);

    // Cleanup
    attach(0,pid);
    close(mem_fd);
    free(buf);
}
编辑:我也是通过shell脚本从/ proc / $ pid / maps传递地址......他们似乎正在计算正确的开始和结束地址。

ptrace附加到流程并停止..

EDIT2:还检查它是否正在读取缓冲区中正确的字节数,它是......并且报告它正在寻找正确的地址....这对于内存地址来说似乎是一个相当高的数字。 ...

EDIT3:这让我觉得/ proc / $ pid / maps中的十六进制地址是颠倒顺序或者是在4字节标记处交换...系统结束...

EDIT4:刚刚意识到地址长度只有6个字节......但仍然没有使用它

EDIT5:我有来自这些论坛的python程序,我已经重复了c中的步骤,但我的程序失败了....检查了python程序,它正在读取与我的程序完全相同的地址....让我的程序运行并行调用python调用,但仍然无法读取正确的内存...链接到python示例here

1 个答案:

答案 0 :(得分:2)

感谢Severin Pappadeux指出我出错的地方,贝洛是最后的工作代码。

#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/ptrace.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <malloc.h>
#include <fcntl.h>

int dump(int pid, long long, long long, char *outfile);

int main(int argc, char *argv[])
{
    if ( argc < 5 )
        return(-1);

    int pid=strtol(argv[1],NULL,10);
    long long addr=strtoll(argv[2],NULL,16);
    long long endaddr=strtoll(argv[3],NULL,16);

#if DEBUG   
    printf("Accessing pid memory %d from %llu to %llu\n",pid,addr,endaddr);
#endif

    dump(pid,addr,endaddr,argv[4]);

    return(0);
}

int attach(int start, int pid)
{
    long ret;

    if ( start == 1 )
    {
        ret = ptrace (PTRACE_ATTACH, pid, NULL, NULL);
    }else{
        ret = ptrace (PTRACE_DETACH, pid, NULL, NULL);
    }

#if DEBUG
    if ( ret < 0 )
    {
        printf("Could not attach to pid\n"); exit(-1);
    }
#endif

    waitpid(pid, NULL, WUNTRACED);


    return(ret);
}

int dump(int pid, long long addr, long long endaddr, char *outfile)
{
    int output;
    int mem_fd;
    char mem_file_name[2048];
    long long size = endaddr - addr;
    void *buf=malloc(size);
    memset(buf,0,size);
    long long readErr,writeErr,seekErr;

    // attach
    attach(1,pid);

    // open the memory
    sprintf(mem_file_name, "/proc/%d/mem", pid);
    mem_fd = open64(mem_file_name,O_RDONLY);
    output = open64(outfile,O_WRONLY|O_CREAT);
    seekErr=lseek64(mem_fd,addr,SEEK_SET);
    readErr=read(mem_fd,buf,size);
    writeErr=write(output,buf,size);

#if DEBUG
    printf("Allocated %lu usable bytes\n",malloc_usable_size(buf));
    printf("File %s block size is %llu bytes\n",mem_file_name,size);
    printf("Memory file value %d\n",mem_fd);
    printf("Seeked %llu Bytes\n",seekErr);
    printf("Read %llu Bytes\n",readErr);
    printf("Wrote %llu Bytes\n",writeErr);
    printf("\n\n");
#endif

    // Cleanup
    attach(0,pid);
    close(mem_fd);
    close(output);
    free(buf);
}