如何从linux内核获取当前用户堆栈帧的返回地址x86_64 [VMI]

时间:2018-04-11 17:05:30

标签: linux-kernel x86-64

我想获取当前用户堆栈帧的返回地址 使用基于VMI的方法从Linux x86_64 VM上的某些Linux内核结构开始。 我可以访问或多或少所有寄存器的内容,但仅限于此刻 上下文切换(CR3事件),所以像RBP或RSP这样的寄存器 指向内核堆栈而不是用户堆栈。

我的第一个方法是获取堆栈/基址指针并派生 从它到返回地址的偏移量。但是,访问 task_struct成员线程(类型为thread_struct)及其内部 成员sp或usersp不会产生所需的结果。会员 usersp确实指向用户堆栈中的某个区域,但最终却没有 保持用户堆栈指针的当前位置。我用了一些简单的东西 C程序,打印出每个函数内的堆栈指针,进行验证 usersp成员的有效性。

另一种方法是遵循包含成员ret的task_struct的ret_stack指针(类型ftrace_ret_stack)。该成员引用相同的值 作为上面的usersp成员。

然而,我可以通过访问字段start_stack来获得堆栈的顶部 来自嵌套在task_struct(指向它的指针)的结构mm_struct。这些信息似乎最接近实际的堆栈指针。但是,我不知道如何从中得到所需的返回地址。

我注意到task_struct中有一些名为stack的原始指针, 但无法弄清楚有关它的任何详细信息。

我知道Windows系统上的'trapframe'结构,但找不到 相当于Linux。

提前致谢。

0 个答案:

没有答案