我最近研究了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;
欢迎任何建议。
答案 0 :(得分:0)
如果您的“安全应用程序”确实使用IAT挂钩来阻止截屏,那么它可能会挂钩bitblt
然后才会使用桌面DC和/或复制整个屏幕区域 - 否则bitblt
的所有正常“合法”用途也会中断。他们似乎不太可能通过相当微不足道的额外工作,如果你走那条路线的话,也可以挂钩GetProcAddress
来返回bitblt
的钩子版本。
在任何情况下,IAT挂钩只会阻止/改变从应用程序本身调用的功能,因此使用Windows Snipping Tool或(Alt)PrtScn
之类的内容不会受此影响。
如果您怀疑他们使用了IAT挂钩并且不挂钩GetProcAddress
那么它只是从该指针获取bitblt
指针并使用它而不是静态导入的函数指针。