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

问题描述 投票:0回答:5

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

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

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

delphi debugging delphi-2007 testing
5个回答
11
投票

您可以检查启动您的应用程序的父进程。 使用

CreateToolhelp32Snapshot
/
Process32First
/
Process32Next
获取应用程序 PID 的父 PID(
PROCESSENTRY32.th32ParentProcessID
TProcessEntry32.th32ParentProcessID
)。然后获取父 PID 的文件名,以便与您要检查的应用程序进行比较,例如 SilkTest。

查看本文了解代码使用情况。

除了

IsDebuggerPresent
CheckRemoteDebuggerPresent
之外,还可以查询
PEB.BeingDebugged
(PEB是Process Environment Block,要获取PEB必须查询TEB,即Thread Enviroment Block)。


4
投票

您可能正在寻找

IsDebuggerPresent
功能。


1
投票

要检测 SilkTest,您可以尝试附加到仅由 SilkTest 使用的 DLL,以检测其存在。例如,如果 Open Agent 附加到进程,则会出现

Win32HookDll_x86.dll
Win32HookDll_amd64.dll
(可以使用 Process Explorer 等工具轻松找到这些名称。


0
投票

下面给出了一种检测 WinIce、SoftIce 等的方法

http://www.delphifan.com/forum/Thread-Anti-CRACK-Functions

{$IF Defined(MSWINDOWS)}
function MeltIceDetected: Boolean;
const
  ICE_FILES: array[0..3] of PChar = ('\\.\SICE', '\\.\NTICE', '\\.\SIWVID', '\\.\FROGICE');
begin
  // Description: Detect the presence of SoftIce and many other memory resident
  // tools by attempting to load SoftIce related devices such its display
  // driver, or its access driver. Devices such as SICE, NTICE, SIWVID, FROGICE.
  Result := False;
  for var dwCount := 0 to High(ICE_FILES) do
  begin
    var HIce := CreateFile(ICE_FILES[dwCount], GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
    if HIce <> INVALID_HANDLE_VALUE then
    begin
      CloseHandle(HIce);
      Result := True;
      Break;
    end;
  end;
end;
{$ENDIF}

-1
投票

你也可以做

if DebugHook <> 0 then ...
© www.soinside.com 2019 - 2024. All rights reserved.