首先,对不起那些不太明确的标题感到抱歉,我只是不知道怎么写,所以我会在这里解释一下。
目前,我正在使用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, ®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); */
}
}
谢谢! (我希望它很清楚,而不是我的母语:/)