如何检测gdb是否正在运行当前进程 [英] How to detect if the current process is being run by GDB
本文介绍了如何检测gdb是否正在运行当前进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
标准方式如下:
if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
printf("traced!
");
在这种情况下,如果跟踪当前进程(例如,使用gdb运行它或附加到它),ptrace将返回错误。
但这有一个严重的问题:如果调用成功返回,gdb以后可能不会附加到它。这是一个问题,因为我没有尝试实现反调试的东西。我的目的是在满足条件时发出‘int 3’(例如,断言失败),并且gdb正在运行(否则我会得到一个停止应用程序的SIGTRAP)。
禁用SIGTRAP并每次都发出‘int 3’不是一个好的解决方案,因为我正在测试的应用程序可能正在将SIGTRAP用于其他目的(在这种情况下,我仍然失败,所以这并不重要,但这是事情的原则:)
推荐答案
您可以派生尝试PTRACE_ATTACH
其父对象(然后在必要时分离)的子项,并将结果传回。不过,这看起来确实有点不雅观。
正如您所提到的,这是相当昂贵的。我想如果断言没有规律地失败也不是太糟糕。或许值得保留一个长期运行的子节点来执行此操作-在父节点和子节点之间共享两个管道,子节点在读取一个字节时进行检查,然后将一个字节与状态一起发回。
这篇关于如何检测gdb是否正在运行当前进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文