Прежде всего, извините за название, которое не может быть менее явным, я просто не знал, как писать, поэтому я собираюсь объяснить это здесь.
В настоящее время я пишунебольшой инструмент отладки в C с использованием ptrace ().Прямо сейчас программа обнаруживает все функции, вызываемые процессом tracee, и печатает ее имя и адрес на выходе.
Например: «Ввод функции my_function at 0xADDR»
Now,Мне нужно найти способ обнаружить и распечатать, когда трассировка покидает функцию.Я успешно обнаружил код операции RET, но не могу найти, как «связать» его с функцией.
Я пытался, когда обнаружен RET, читал все регистры с надеждой найти адресфункции, которая была вызвана CALL.
Я не знаю, достаточно ли она явна, поэтому вот небольшой пример:
main:
call my_function
// rest of the program
my_function:
//do things
ret
Учитывая тот факт, что я знаю адрес my_function,Есть ли способ, при наступлении RET, найти адрес my_function?
Вот фрагмент кода в цикле трассировки:
struct user_regs_struct regs;
unsigned ins;
unsigned char prim;
int status;
printf("Entering function main at %#lx\n", get_func_addr(lsm, "main"));
while (1) {
ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);
wait(&status);
if (WIFEXITED(status))
break;
ptrace(PTRACE_GETREGS, child, NULL, ®s);
ins = ptrace(PTRACE_PEEKTEXT, child, regs.rip, NULL);
prim = (unsigned)0xFF & ins;
if (prim == 0xE8) // call found, find_relative_call will check the address called an\
d retreive the name of the function called
find_relative_call(child, lsm);
else if (prim == 0xC3) { // ret found, stuck here
long f_rip = ptrace(PTRACE_PEEKTEXT, child, regs.rsp, 0);
printf("ret %#lx\n", f_rip);
/* printf("rip %#llx\n", regs.rip); */
/* find_relative_ret(child, lsm); */
}
}
Спасибо!(Надеюсь, это было достаточно ясно, а не мой родной язык: /)