【问题标题】:How to intercept each trying to use API function in C#?如何拦截每个尝试在 C# 中使用 API 函数?
【发布时间】:2014-02-27 15:03:06
【问题描述】:

我需要阻止计算机上的任何屏幕捕获软件进行屏幕截图。由于它们都在标准 API 函数上工作,我想我可以监控和阻止它们。 我需要使用 C#。 我所发现的只是如何在某个程序(屏幕捕获程序)中监视和阻止它们。他们正在程序中寻找一个函数,然后他们在我的函数地址上更改它的地址。 但是,如果我没有任何特定的程序,我该怎么做呢?我需要阻止任何试图截屏的人。

【问题讨论】:

  • 你有没有想过捕获按键事件?
  • 出于兴趣,他们为什么要这样做?至于挂钩,您将如何可靠地区分合法的操作系统服务调用,例如 bitblt(或截屏过程中的任何其他入口点)与某个未知的任意第三方应用程序进行的调用?有关的; stackoverflow.com/questions/455623/…
  • @AlexK。 - 很好的链接,关于这是一场与任何有一点技巧(或只是一个真正的相机)的用户的一场失败的战斗!
  • 我需要它,因为我正在为电子图书馆写一个查看器,人们不应该能够复制书籍。为什么系统进程会调用截图功能?
  • 您担心人们使用屏幕截图处理整本书?那将是一项壮举!我希望您保护高度私密、“机密”或危险的材料。

标签: c# winapi hook intercept


【解决方案1】:

我不知道您的最终目标是否可行,但对于挂钩 API 部分,我可以为您提供帮助。

我过去曾多次使用库EasyHook,这将使您可以相当轻松地从C#代码中挂钩和拦截系统函数调用。只需阅读the PDF tutorial 以获取设置说明。

为了真正找到 API,我推荐 Rohitab's API Monitor,它仍处于 Alpha 阶段,但它工作得非常好并且是免费的。您只需将它连接到一个进程,它就会告诉您它进行的每个外部 DLL 调用(如果您有 DLL 的 xml 定义文件,则使用它传递的参数,该程序带有几乎所有 Windows API dll 的预定义) .

EasyHook 和 API Monitor 的组合是一个很好的 1-2 打击与其他程序的调用。

【讨论】:

  • EasyHook 是否适用于 Windows 8?特别是在地铁风格的应用程序中?我浏览了文档并找不到。
  • @EkoostikMartin 我不知道,我可以说挂钩应用程序很可能必须是非地铁应用程序,但我看不出有任何理由非地铁应用程序不会能够挂钩 Metro 风格的应用程序。您可能需要使用测试版,查看他们最近所做的一些 Windows 8 x64 特定修复的更新日志。 (见底部change log。)
【解决方案2】:

无法阻止截屏。由于 DWM(桌面窗口管理器),这场战斗已经失败。它比 Win32 和设备上下文低。

如果您想保护程序中的文本,有比截屏和 OCR 更简单的方法来提取它。 TextOut 和/或 Direct2D 挂钩和可访问性 API。

如果您的程序中有很多 IP。然后不要让它全部在屏幕上可用。确保在 GUI 中爬取文本很乏味,而且很难自动化。并且不要将整个文本加载到程序的内存中。

可能的解决方案: 1. 防止文字复制。将文本绘制为图像。 2. 为了防止可访问性技术,如屏幕阅读器 - 在您的控件中覆盖 WndProc,处理并忽略窗口消息 WM_GETOBJECT。 3. 如果他们尝试使用 OCR,则更难。在文本后面绘制图形。人类可读,但机器更难解释。

这些方法都不是对用户的侵入性。

** 一个非常具有侵略性的建议**: 如果您真的很想防止任何人“窃取”您的内容。

  1. 实现鼠标和键盘挂钩。过滤掉典型的复制快捷方式。防止鼠标离开应用程序的边界。
  2. 允许您的应用程序仅在操作系统运行众所周知的进程和服务时运行。 如果任何您不认识的进程启动,请关闭应用程序并通知用户,并要求用户关闭它。并且 ofc 确保有人不只是在欺骗一个众所周知的过程。
  3. 按照您自己的建议监控剪贴板。

您可以根据应用程序的上下文软化其中的一些建议。

【讨论】:

  • 谢谢。你说了很多IP im teh porgramm。 IP是什么意思?也许我可以以某种方式阻止剪贴板,因为所有的截图程序都可能使用它?我意识到我无法完全阻止它,但我必须至少降低安全性。
  • 我可以在每次失去焦点时将窗口绘制为黑色,并在窗口处于活动状态时保护 PrintScreen 按钮。但这会让用户感到不舒服。
  • @user2976256 你真的不能做任何事情来阻止屏幕截图,永远。没有什么可以阻止另一个程序捕获您的窗口,即使只有您的窗口有焦点。它就像获取设备上下文一样简单,并对内容进行位块传输。我会选择最常用的方法,甚至在线使用。 人类可读,但机器难以阅读。像capcha这样的东西。 en.wikipedia.org/wiki/Capcha
  • 谢谢!我已经将文档显示为图像。如果我每次在其中找到位图时监视剪贴板并清除它,这不是一个解决方案吗?另外我可能会在文本后面画出用户ID,这样我就可以知道是谁偷了它。而且,当焦点丢失时,仍然是黑色矩形。以及您针对屏幕阅读器的第二个解决方案。至少是医疗安全吗?
  • @user2976256 你怎么知道有人想截取你的应用程序?按 PrintScreen 用于桌面使用。有人试图截取您的应用程序屏幕截图的唯一确定情况是,当您的程序处于焦点时按下 ALT+PrintScreen。但指责他们偷窃?那是完全错误的。当您的应用程序具有焦点时,制作一个可以从您的应用程序中转储图像的程序很容易。这也不需要剪贴板上的任何按键或中间存储。
【解决方案3】:

正如 Scott 刚刚发布的那样,很可能可以通过 API 挂钩防止看到绘制事件只发送到桌面绑定句柄而不是其他句柄,否则拒绝绘制。但是,您需要考虑以下情况,看看它们是否对您的方法构成相关威胁:

您的软件可能在 VMWare 等虚拟机中运行。此类软件具有在“虚拟硬件”级别捕获屏幕的功能,而您的 API 挂钩将无法识别它 - 如果我想绕过您的保护,这将是最简单的方法。

作为post suggests here,没有什么能阻止有人将显示器电缆插入另一台计算机的采集卡,然后以这种方式截取屏幕截图。同样,你的钩子在这里将无能为力。

底线,你可以让它更难做,但绕过这样的保护可能是非常微不足道的事情。

  • 我的 2c。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2021-12-07
    相关资源
    最近更新 更多