【问题标题】:Is there any way to determine if a program uses a specific Windows API functions?有什么方法可以确定程序是否使用特定的 Windows API 函数?
【发布时间】:2020-06-21 16:54:41
【问题描述】:

好吧,解释起来可能有点困难:

假设某人创建了一个 Windows 应用程序(使用 C# 或任何其他语言),该应用程序使用 user32.dll 上的 GetDesktopWindow() 函数来捕获屏幕截图,然后将此图像发送到任何在线服务。

由于它是定制的应用程序,没有防病毒软件能够确定它是病毒,因为它仍然是一个未知的应用程序。此外,此类 API 也有合法用途,因此不一定是病毒,它可以是无害的窗口捕获工具或某种间谍工具。

我想知道的是:有没有办法查看特定的 EXE 文件对 Windows 功能的作用?我可以知道“myapp.exe”是否使用GetDesktopWindow()user32.dll

这只是一个例子。还有很多其他 Windows 端点我想知道它们何时被任何应用程序使用。

有没有办法做到这一点?

【问题讨论】:

  • Dependency Walker 出现在我的脑海中,正在阅读您的问题。

标签: windows user32 virus-scanning


【解决方案1】:

这取决于你想要做多长时间。它本质上是一场猫捉老鼠的游戏——坏人会试图通过跳过一些晦涩难懂的圈子来寻找新的方法来规避你的检测,你将为这些技巧添加更复杂的检测方法,他们会想出新的技巧,等等。

此外,这取决于您是要静态还是动态确定,以及您是否真的想知道是否调用了 GetDesktopWindow 或者“程序获取桌面窗口的句柄”(可以在其他方式)。

这里是一个非详尽的想法列表:

  • 您可以通过查看导入目录来静态确定函数是否被导入。研究 PE 文件结构以了解更多信息。 This article may help.
    • 通过使用LoadLibraryGetProcAddress动态导入函数,可以轻松绕过这种检测方法。
  • 您可以扫描文件中的字符串GetDesktopWindow 以检测动态导入的可能用途。
    • 可以通过打包、加密或以其他方式混淆动态导入函数的名称来轻松绕过这种检测方法。
  • 您可以通过注册AppInit_DLL 或注入到每个新进程中的全局挂钩来动态观察GetDesktopWindow 函数是否被调用,并通过用覆盖其第一个字节来从进程内部挂钩GetDesktopWindow 函数跳转到您自己的代码,以某种方式通知您的检测组件,执行原始字节并返回。 (Microsoft Detours 可以提供帮助。)
    • 如果目标注意到钩子并在调用之前将其删除,则可以绕过这种检测方法,因为它在自己的进程空间中。 (您还可以像调试器一样做一些技巧,并在GetDesktopWindow 的第一条指令上设置硬件断点,但由于目标也可以修改调试寄存器,因此仍有办法检测或规避它。)
    • 您可以构建一个从内核模式执行此操作的驱动程序,但现在我们已经深入了解了。

请注意,到目前为止,我们专注于 user32.dll 中的实际 GetDesktopWindow 函数。但是,如果目标只是使用不同的方式来实现获取桌面窗口句柄的目标呢?

  • 当前线程的桌面窗口句柄存储在 TIB(线程信息块)中,可从用户模式通过fs:[18] 访问。您可以在GetDesktopWindow source code of ReactOS 中看到这一点,这与 Microsoft 的实际实现相比非常准确(您可以通过在调试器中查看它来验证)。因此,目标可以直接访问 TIB 并提取此值,甚至根本不需要调用 GetDesktopWindow
  • 目标可以只使用一个已知的顶级窗口,例如外壳的隐藏兼容性窗口,您可以通过 GetShellWindow() 或 - 为了避免检测到 GetShellWindow - 例如 FindWindow(NULL, "Program Manager")(甚至是新创建的窗口!)并在其上调用GetAncestor(hWnd, GA_PARENT) 以获取桌面窗口句柄。
  • 我敢肯定,只要有一些创造力,你的对手会想出比这些更聪明的想法。

此外,如果我们更进一步,看看截屏的最终目标,还有其他方法可以实现这一目标。想到的第一个例子:他们可以使用keybd_event 模拟按下 PrnSc 键,然后从剪贴板数据中读取屏幕截图。

所以这完全取决于你想走多远。

顺便说一句,您可能会发现 drltrace 项目很有趣 - 它是一个库调用跟踪器。

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2012-06-18
    相关资源
    最近更新 更多