小编典典

如何检测GDB是否正在运行当前进程?

linux

标准方法如下:

if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
  printf("traced!\n");

在这种情况下,如果跟踪当前进程(例如,使用gdb运行或附加到该进程),则ptrace返回错误。

但这有一个严重的问题:如果调用成功返回,则gdb稍后可能不会附加到它。这是一个问题,因为我没有尝试实现反调试的东西。我的目的是在满足条件(即断言失败)并且gdb正在运行时发出“
int 3”(否则,我会得到SIGTRAP来停止应用程序)。

禁用SIGTRAP并每次发出’int
3’并不是一个很好的解决方案,因为我正在测试的应用程序可能出于其他其他目的使用SIGTRAP(在这种情况下,我还是被搞砸了,所以没关系,但这是事情的原理:))

谢谢


阅读 583

收藏
2020-06-07

共1个答案

小编典典

以前作为注释:您可以派生一个将尝试与PTRACE_ATTACH其父对象(然后在必要时分离)的孩子并将结果传达回去。看起来确实有点不雅。

如您所述,这是非常昂贵的。我认为断言不定期失败并不太糟。也许值得一个长期运行的孩子来做这件事-
在父母与孩子之间共享两个管道,孩子在读取字节后会进行检查,然后将状态发送回字节。

2020-06-07