有没有办法用ptrace查找在RET指令

时间:2018-05-11 16:22:12

标签: c assembly call ptrace

首先,对不起那些不太明确的标题感到抱歉,我只是不知道怎么写,所以我会在这里解释一下。

目前,我正在使用ptrace()在C中编写一个小型调试工具。现在,程序检测到tracee进程调用的所有函数,并在输出中打印其名称和地址。

例如:“在0xADDR输入功能my_function”

现在,我需要找到一种在tracee离开函数时检测和打印的方法。我成功检测到操作码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); */
                }
        }

谢谢! (我希望它很清楚,而不是我的母语:/)

0 个答案:

没有答案