【发布时间】:2016-02-14 22:41:17
【问题描述】:
我最近在研究api钩子方法,现在我的主要研究对象是IAT钩子方法,这是因为我发现了一个安全应用程序,其中只有这种钩子方法用于防止间谍软件。
然后,在此安全应用程序中存在的几个资源之间,通常会出现屏幕捕获锁定导致白屏捕获,这是因为 IAT 钩子方法已经覆盖了表上的地址指向原始功能的地址,对于包含锁定屏幕捕获的代码的“假函数”。
所以,我在网上阅读了很多关于 IAT 钩子的内容,发现有两个网站说绕过这个钩子方法的方法是:
iC0de.org 在对 IAT 挂钩源代码的回答中。
和
MalwareTech 在解释 IAT 钩子的文字上。
对我来说调用注意的绕过方法是使用GetProcAddress函数获取原始函数的真实地址。
因此,仅出于教学目的,我想知道如何为下面的屏幕捕获功能实现GetProcAdress,并最终绕过此安全应用程序中实现的 IAT 钩子:
procedure Print;
var
DCDesk: HDC;
bmp: TBitmap;
begin
bmp := TBitmap.Create;
bmp.Height := Screen.Height;
bmp.Width := Screen.Width;
DCDesk := GetWindowDC(GetDesktopWindow);
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DCDesk, 0, 0, SRCCOPY);
bmp.SaveToFile('ScreenShot' + '.bmp');
ReleaseDC(GetDesktopWindow, DCDesk);
bmp.Free;
end;
欢迎提出任何建议。
【问题讨论】:
-
GetProcAddress用于获取 DLL 或可执行文件中导出的过程或函数的地址。除非您导出Print,否则它不会有太大用处。如果您已经研究过这些钩子,我无法想象您以前从未导出过 dll 函数。 -
@GolezTrol,上面的这个函数,停留在一个在确定的进程中注入的 dll 中,但安全应用程序仍然阻止屏幕捕获。