-2

我最近开始研究api hook方法,现在我的主要研究对象是IAT hook方法,这是因为我发现了一个安全应用程序,其中只有这种hook方法用于防止间谍软件。

然后,在这个安全应用程序中存在的几个资源之间,有屏幕捕获锁定,通常导致白屏捕获,这是因为 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;

欢迎任何建议。

4

1 回答 1

0

如果您的“安全应用程序”确实使用 IAT 挂钩来防止截取屏幕截图,那么它可能会被挂钩bitblt,并且只有在使用桌面 DC 和/或正在复制全屏区域时 - 否则所有正常的“合法”的用途bitblt也会中断。他们似乎不太可能没有完成相当微不足道的额外工作,如果你走那条路,还挂钩GetProcAddress返回挂钩版本。bitblt

在任何情况下,IAT 挂钩只会阻止/更改从应用程序本身调用的功能,因此使用 Windows 截图工具之类的工具或(Alt)PrtScn不会受此影响。

如果您怀疑他们使用了 IAT 挂钩并且也没有挂钩GetProcAddress,那么只需bitblt从中获取一个指针并使用它而不是静态导入的函数指针。

于 2016-02-14T23:27:22.407 回答