如何检测gdb是否正在运行当前进程 [英] How to detect if the current process is being run by GDB

查看:37
本文介绍了如何检测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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆