Как получить чар * с помощью ptrace
В настоящее время я разрабатываю инструмент, в котором мне нужно отследить программу, чтобы узнать его системные вызовы. На данный момент я могу получить числовые параметры системных вызовов, но не могу правильно обратиться к строкам.
Вот как я продолжаю:
long addr = ptrace(PTRACE_PEEKDATA, pid, regs.ebx, NULL);
printf("%s", (char *) &addr);
С этим фрагментом кода я могу получить начало строки (3 или 4 первых символа), но конец поврежден, я не знаю почему.
У вас есть какое-нибудь решение? Спасибо.
3 ответа
Вы уверены, что не хотите этого вместо этого?
printf("%lX", addr);
char *read_string (int child, unsigned long addr) {
char *val = malloc(4096);
if (!val)
return NULL;
int allocated = 4096, read = 0;
unsigned long tmp =0;
while(1) {
if (read + sizeof (tmp) > allocated) {
allocated *= 2;
char *temp_val = realloc (val, allocated);
if (!temp_val) {
free(val);
return NULL;
}
val = temp_val;
}
tmp = ptrace(PTRACE_PEEKDATA, child, addr + read);
if(errno != 0) {
val[read] = 0;
break;
}
memcpy(val + read, &tmp, sizeof tmp);
if (memchr(&tmp, 0, sizeof tmp) != NULL) break;
read += sizeof tmp;
}
return val;
} // Don't forget to free the returned val.
Попробуйте использовать следующую функцию, это было частью того, что я написал в моем приложении:
reg_val[1] = ptrace (PTRACE_PEEKUSER, child, 4 * EBX, NULL);
char *filepath = read_string(child, reg_val[1]);
Child - это pid дочернего процесса, который я отслеживаю. Если это не работает, скажите мне?
С вашим размещенным кодом вы читаете только 4 байта данных (т.е. 4 символа) с вызовом ptrace. Вам нужно прочитать весь буфер из процесса отладки, прежде чем вы сможете распечатать строку в родительском процессе. т. е. после того, как вы прочитали адрес, вам нужно выполнить цикл
ptrace(PTRACE_PEEKTEXT, child, addr, NULL)
addr+=4;
пока вы не прочитаете полную строку.
Затем вы можете распечатать его с помощью printf()