【问题标题】:Bypass IAT hook on screen capture绕过屏幕捕获上的 IAT 挂钩
【发布时间】: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 中,但安全应用程序仍然阻止屏幕捕获。

标签: delphi api-hook


【解决方案1】:

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

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

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

【讨论】:

  • 这个安全应用程序是 IBM 的 Truster Rapport :-)。所以,使用 HookShark,你可以看到他只有 IAT 钩子。对于有一个概念,Team Viewer 软件,也受到此 IAT 挂钩的影响。
  • 是的,这是一个如何使用 GetProcAddress 的示例。
  • Delphi 中BitBlt 的定义是什么?我需要使用GetProcAddress 来实践这个想法:-)。或者,您也可以根据我留下的上述代码,使用代码示例编辑您的答案(如您所说,使用 GetProcAddress 代替 BitBlt
  • 与大多数其他 WINAPI 函数一样,BitBlt 在 Windows.pas 中定义。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
相关资源
最近更新 更多