delphi7 准确检测窗口是否被OD注入,写一个DEMO
时间: 2024-09-22 19:08:31 浏览: 36
Delphi 7本身并不提供一种直接的方式来准确地检测一个窗口是否被调试器(例如OllyDbg、SoftICE等)注入。这是因为操作系统层面的保护机制使得这种检测变得复杂且不可靠。然而,有一些间接的手段可以尝试评估:
1. **检查系统钩子**:
可以尝试检查是否有可疑的系统钩子存在,比如键盘事件处理器或Windows消息传递中的修改。不过,这依赖于对API的深入了解,并且可能会误报。
```pascal
uses SysUtils, Messages;
function IsHooked(hWnd: HWND): Boolean;
var
hookProc: LongInt;
begin
Result := False;
// 检查某个特定的消息钩子,这里以WM_KEYDOWN为例
GetWindowLong(hWnd, GWL_WNDPROC, pointer(@hookProc));
// 如果钩子函数不是系统的默认值,则可能被注入
if hookProc <> GetWindowLong(HWND_BROADCAST, GWL_WNDPROC) then
Result := True;
// 注意:这只是一个示例,实际的钩子检测可能涉及到更复杂的逻辑和更多的系统钩点
end;
```
2. **检查异常状况**:
被调试时,应用程序的行为可能不稳定,比如频繁的异常或崩溃。可以在关键部分添加try-catch块来观察是否出现这类异常。
```pascal
procedure SomeSensitiveFunction;
var
ExceptionInfo: TExceptionInfo;
begin
try
// ... 你的代码 ...
except
on E: Exception do
if ExceptionInfo.ThreadId <> GetCurrentThreadId then
// 如果异常来自另一个线程,可能是调试器触发的
Result := True;
end;
end;
```
这些方法都不能保证100%准确,因为调试器的技术也在不断进步。通常来说,更推荐的是避免敏感操作,而非试图防止调试。如果你的目标是保护商业秘密,考虑采用更成熟的加密技术和代码混淆策略会更有意义。