Есть ли способ найти с помощью ptrace адрес, вызываемый при выполнении инструкции RET? - PullRequest
0 голосов
/ 11 мая 2018

Прежде всего, извините за название, которое не может быть менее явным, я просто не знал, как писать, поэтому я собираюсь объяснить это здесь.

В настоящее время я пишунебольшой инструмент отладки в 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, &regs);
                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); */
                }
        }

Спасибо!(Надеюсь, это было достаточно ясно, а не мой родной язык: /)

...