gpt4 book ai didi

c - 使用 ptrace 读取字符串 (linux)

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:38 24 4
gpt4 key购买 nike

我是堆栈的新手,也是 C 的新手。我尝试使用 ptrace 从另一个进程读取进程内存。到目前为止,我设法从另一个进程读取和更改数字。但是对于字符串我找不到办法。这是我的代码:

int errno;
//the string we want to read is 8 bytes long
long len = 8;
const int buflen = (len / sizeof(long)) + 1;
void *buffer;
long *base;
char *data;
int i;
//the process pid i want to track
pid_t pid = 2984;
//the address that the string we want to read resides
void *addr = (unsigned long int*) 0x7ffe03f6e088 ;

buffer = calloc(buflen, sizeof(long));
if (NULL == buffer)
{
perror("Fault at allocation: ");
}

base = (long *) buffer;

ptrace(PTRACE_ATTACH, pid, NULL, NULL);

for (i = 0; i < buflen; i++) {
if(ptrace(PTRACE_PEEKDATA, pid , addr + (sizeof(long) * i),NULL) != -1)
{
*(base + i) = ptrace(PTRACE_PEEKDATA, pid , addr + (sizeof(long) * i),
NULL);
}else
{
fprintf(stderr, "Value of errno: %s\n", strerror(errno));
}
}

ptrace(PTRACE_DETACH, pid, NULL, NULL);

/* Pop a null at the end, since we're printing this string. */
*((char *) buffer + len) = '\0';

data = (char *)buffer;

printf("%p[\"%s\"]\n",addr, data);
free(buffer);

输出:

errno的值:没有这样的进程
errno的值:没有这样的进程
0x7ffe03f6e088[""]

但是进程 ID 是正确的,本地址指向一个数字时,类似的代码可以工作。请帮助我。

[编辑]
下面是tracee进程代码:

char *a = "lala";
pid_t child;
printf("Char length: %ld\n", strlen(a));
printf("Char value: %s\n", a);
//the address I use to read variable
printf("Char address: %p\n", &a);
//make the process sleep so I can halt it manually
sleep(3);

最佳答案

您的 tracee 进程正在打印 char* 指针本身的地址,而不是字符串开头的地址。

这里有两个选择:(1) 让跟踪打印 printf("Char address: %p\n", a); 并按原样运行跟踪代码 (2) 保留按原样跟踪代码并修改您的跟踪器进程,以便它从目标中读取 sizeof(char *) 字节,存储该结果(如果您需要使用多个 ptrace 请求来读取它,则在适当的数字转换后all in) 在 addr 中,然后按原样继续。

– 马克·普洛特尼克

关于c - 使用 ptrace 读取字符串 (linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34371783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com