我正在开发一种有时会劫持应用程序执行的工具,包括在不同的堆栈中工作。
我试图让内核在执行某些系统调用时始终看到应用程序堆栈,以便它将 [stack] 限定符打印在/proc/pid/maps 中的正确位置。
但是,仅仅修改系统调用周围的 esp 似乎还不够。当我在"cat/proc/self/stat"上使用我的工具时,我看到 kstkesp(此处的条目 29)有时具有我想要的值,但有时具有不同的值,对应于我的备用堆栈。
我试图理解:
- 如何确定/proc/self/stat:29 中反映的值?
- 我可以修改它以使其可靠地具有适当的值吗?
- 如果 2 很难回答,您会建议我在哪里查看以了解为什么该值间歇性不正确?
看起来它的定义例如在 409 行中 http://lxr.free-electrons.com/source/fs/proc/array.c?v=3.16 对我来说。
在过去几年中,关于相关宏观KSTK_ESP的讨论很多,例如:https://github.com/davet321/rpi-linux/commit/32effd19f64908551f8eff87e7975435edd16624
和
http://lists.openwall.net/linux-kernel/2015/01/04/140
从我收集的关于间歇性奇怪之处的信息来看,NMI 或其他中断有时会在内核内部命中,然后在这种情况下它无法正确遍历堆栈。