如何检测调试器或其他可能分析我的软件的工具?

10

很简单的情况。我正在使用Delphi 2007开发一个应用程序,通常编译为“Release”版本,但仍在调试器下运行。有时它还会在SilkTest下运行,用于回归测试。虽然这非常有趣,但我想做一些特殊的事情...

我想检测我的应用程序是否在调试器/回归测试工具中运行,如果是这样,我希望应用程序知道使用的是哪个工具!(因此,当应用程序崩溃时,我可以在错误报告中报告此信息。)

有什么建议或解决方案吗?


1
你不是在写恶意软件,对吧...? - Mick
https://learn.microsoft.com/en-us/windows/desktop/debug/using-an-exception-handler - Gabriel
4个回答

11
你可以检查启动你的应用程序的父进程。 使用 CreateToolhelp32Snapshot/Process32First/Process32Next 获取你的应用程序 PID 的父 PID (PROCESSENTRY32.th32ParentProcessIDTProcessEntry32.th32ParentProcessID)。然后获取父 PID 的文件名以与你想要检查的应用程序进行比较,例如 SilkTest。
在这篇文章中查看代码使用:此文章
除了 IsDebuggerPresentCheckRemoteDebuggerPresent 之外,你还可以查询 PEB.BeingDebugged (PEB 是进程环境块,要获取 PEB,必须查询 TEB,即线程环境块)。

4

但它也能检测到 SilkTest 和其他测试软件吗?还是远程调试器? - Wim ten Brink
1
还有一个名为CheckRemoteDebuggerPresent的函数,听起来像是可以识别远程调试器。我不熟悉SilkTest,所以不知道它是否充当调试器。如果是,那么上面的方法就可以奏效。如果不是,那么你需要找到另一种技术。 - Greg Hewgill

1

为了检测SilkTest,您可以尝试附加到仅由SilkTest使用的DLL以便检测其存在。例如,如果打开代理附加到一个进程中,Win32HookDll_x86.dllWin32HookDll_amd64.dll将会存在(这些名称可以使用像Process Explorer这样的工具轻松找到)。


-1

你也可以这样做

if DebugHook <> 0 then ...

那仅在 Delphi IDE 内起作用,而不是其他调试器。此外,请记住应用程序是在“发布”模式下进行调试,而不是“调试”模式。 - Wim ten Brink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接