好的,可能有点难以解释:
假设有人创建一个Windows应用程序(使用C#或任何其他语言),该应用程序使用上的GetDesktopWindow()
功能user32.dll
捕获屏幕截图,然后将此图像发送到任何在线服务。
由于它是定制应用程序,因此任何防病毒软件都无法确定它是病毒,因为它仍然是未知应用程序。而且,此类API有合法用途,因此它不一定是病毒,它可以是无害的窗口捕获工具或某种间谍工具。
我想知道的是:有没有办法查看特定的EXE文件对Windows功能的作用?我知道,如果“MyApp.exe将”用途GetDesktopWindow()
的user32.dll
?
这只是一个例子。我想知道许多其他Windows端点何时被任何应用程序使用。
有没有办法做到这一点?
这取决于您要执行多长时间。从本质上讲,这是一种猫捉老鼠的游戏-坏演员会尝试通过跳过一些晦涩的箍来寻找新的方法来规避检测,为这些技巧添加更复杂的检测方法,他们会想到新的技巧,等等。
另外,还取决于您是否要静态和动态地确定它,以及您是否真正想知道是否GetDesktopWindow
调用了该程序,或者是否是“程序获取了桌面窗口的句柄”(也可以通过其他方式实现)。
以下是一些详尽的想法:
LoadLibrary
和动态导入函数,可以轻松地规避这种检测方法GetProcAddress
。GetDesktopWindow
以检测动态导入的可能用法。
GetDesktopWindow
通过注册AppInit_DLL
注入到每个新进程中的全局钩子或全局钩子来动态观察函数是否被调用,并GetDesktopWindow
通过跳转到自己的代码来覆盖函数的第一个字节,从而以某种方式通知检测组件,从而从进程内部钩住函数,执行原始字节然后跳回。(Microsoft Detours可以为您提供帮助。)
GetDesktopWindow
,但又有一些技巧,因为目标也可以修改调试寄存器,因此还是有一种方法可以检测或规避该方法。)请注意,到目前为止,我们只关注的实际GetDesktopWindow
功能user32.dll
。但是,如果目标仅使用其他方式来实现获得桌面窗口句柄的目标,该怎么办?
fs:[18]
用户模式进行访问。您可以在GetDesktopWindow
ReactOS的源代码中看到这一点,该代码与Microsoft的实际实现相比非常准确(您可以通过在调试器中查看它来进行验证)。因此,目标甚至GetDesktopWindow
可以根本不调用就访问TIB并提取该值。GetShellWindow()
或(为避免检测到)外壳的隐藏兼容窗口(GetShellWindow
例如FindWindow(NULL, "Program Manager")
,甚至是一个新创建的窗口!),然后调用GetAncestor(hWnd, GA_PARENT)
它来获取桌面窗口句柄。另外,如果我们进一步迈出这一步,并看一看截取屏幕截图的最终目标,那么还有其他方法可以实现这一目标。我想到的第一个示例:他们可以keybd_event
用来模拟按下PrnSc键,然后从剪贴板数据中读取屏幕截图。
因此,这一切都取决于您想走多远。
顺便说一下,您可能会发现一个drltrace
有趣的项目,它是一个库调用跟踪器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句