一个非常简单的情况。我正在 Delphi 2007 中开发一个应用程序,该应用程序通常编译为“Release”,但仍然在调试器下运行。有时它也会在 SilkTest 下运行,以进行回归测试。虽然这很有趣,但我想做一些特别的事情......
我想检测我的应用程序是否在调试器/回归测试器中运行,如果是这样,我希望应用程序知道使用了哪个工具! (因此,当应用程序崩溃时,我可以在错误报告中报告此信息。)
有什么建议、解决方案吗?
您可以检查启动您的应用程序的父进程。 使用
CreateToolhelp32Snapshot
/Process32First
/Process32Next
获取应用程序 PID 的父 PID(PROCESSENTRY32.th32ParentProcessID
或 TProcessEntry32.th32ParentProcessID
)。然后获取父 PID 的文件名,以便与您要检查的应用程序进行比较,例如 SilkTest。
查看本文了解代码使用情况。
除了
IsDebuggerPresent
和CheckRemoteDebuggerPresent
之外,还可以查询PEB.BeingDebugged
(PEB是Process Environment Block,要获取PEB必须查询TEB,即Thread Enviroment Block)。
要检测 SilkTest,您可以尝试附加到仅由 SilkTest 使用的 DLL,以检测其存在。例如,如果 Open Agent 附加到进程,则会出现
Win32HookDll_x86.dll
或 Win32HookDll_amd64.dll
(可以使用 Process Explorer 等工具轻松找到这些名称。
下面给出了一种检测 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}
你也可以做
if DebugHook <> 0 then ...