有什么方法可以确定程序是否使用特定的Windows API函数?

丹尼尔·里贝罗

好的,可能有点难以解释:

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

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

我想知道的是:有没有办法查看特定的EXE文件对Windows功能的作用?我知道,如果“MyApp.exe将”用途GetDesktopWindow()user32.dll

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

有没有办法做到这一点?

樱桃DT

这取决于您要执行多长时间。从本质上讲,这是一种猫捉老鼠的游戏-坏演员会尝试通过跳过一些晦涩的箍来寻找新的方法来规避检测,为这些技巧添加更复杂的检测方法,他们会想到新的技巧,等等。

另外,还取决于您是否要静态和动态地确定它,以及您是否真正想知道是否GetDesktopWindow调用了该程序,或者是否是“程序获取了桌面窗口的句柄”(也可以通过其他方式实现)。

以下是一些详尽的想法:

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

请注意,到目前为止,我们只关注的实际GetDesktopWindow功能user32.dll但是,如果目标仅使用其他方式来实现获得桌面窗口句柄的目标,该怎么办?

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

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

因此,这一切都取决于您想走多远。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有什么方法可以从Java API中的特定偏移量开始使用kafka主题吗?

Windows API JNA函数GetVolumePathNamesForVolumeName

使用AWS API网关+ lambda函数+ RequestHandler

为什么不可能构建可以确定C ++函数是否会更改特定变量的值的编译器?

是否可以使用AWS API为Lambda函数设置AWS API Gateway端点?

有什么方法可以检测是否使用非虚拟基本析构函数正确删除了类?

确定函数是否具有输出的最佳方法?

是否可以从AWS Step函数调用API网关资源?

使用CPython API的生成器函数

有什么方法或函数可以从程序中隐藏硒的输出?

有什么方法可以允许通用函数使用专用函数?

使用嵌套函数作为Windows API函数的回调吗?

从Azure函数调用Web API的最佳方法

如何使按钮调用使用fetch API的函数

是否可以通过Azure函数使用Google Sheets API?

有什么方法可以使用sourceCpp()制作Infix函数

POST REST API使用参数调用函数

有什么方法可以在弹性搜索中使用cat API排除特定索引?

有什么方法可以通过Elasticsearch Java API使用multiprefix?

使用提取API发送函数参数

有什么方法可以确定从bash陷阱函数内部捕获的信号吗?

使用检测习惯用法确定类型是否具有带有特定签名的构造函数

从C API确定Lua函数的签名

有什么方法可以从javascript调用bigquery API函数吗?

有什么方法可以在普通函数中使用 await 吗?

如何使用 firebase 函数创建 api

使用shellcode调用windows API函数

如何在函数式 API keras 中使用定义的函数

如何使 .map 函数使用 API 工作