在屏幕捕获上绕过IAT挂钩

时间:2016-02-14 22:41:18

标签: delphi api-hook

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

然后,在这个安全应用程序中存在的几个资源之间,有锁定的屏幕捕获通常会导致白屏捕获,这是因为IAT挂钩方法已经覆盖了表上的地址,指向原始函数的地址, “假函数”,包含锁定屏幕捕获的代码。

所以,我已经阅读了很多关于网络上IAT钩子的内容,并发现有两个网站可以说绕过这种钩子方法的方法是:

iC0de.org回答IAT钩子源代码。

MalwareTech关于IAT钩子的解释。

为我调用注意的旁路方法是使用GetProcAddress函数来获取原始函数的实际地址。

所以,只有对于那些经验丰富的pruporse,我想知道如何在下面的屏幕捕获函数中实现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;

欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

如果您的“安全应用程序”确实使用IAT挂钩来阻止截屏,那么它可能会挂钩bitblt然后才会使用桌面DC和/或复制整个屏幕区域 - 否则bitblt的所有正常“合法”用途也会中断。他们似乎不太可能通过相当微不足道的额外工作,如果你走那条路线的话,也可以挂钩GetProcAddress来返回bitblt的钩子版本。

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

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