我已经在这个代码上工作了几个小时而且我的想法不合时宜。可能是我使用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
答案 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);
}