答案 0 :(得分:7)
VCL控件由Win32控件支持,这些控制本质上是不安全的。您无法限制对其属性和状态的访问。外部程序可以轻松修改状态,按下按钮等。
您可能想要运行一个以高频率重置UI状态的计时器。这可能会使饼干更难一点。但是仍然不是特别难,你的程序和代码会花多少钱?
因此,在我看来,你不应该试图阻止外部程序干扰UI状态。相反,您可以向OnClick
处理程序和UI后面的其他代码添加检查和防御。这也是完全可裂缝的,但它确实至少需要来自饼干的更多效果。
你可以写:
button.Enabled := False;
button.OnClick := nil;
禁用按钮时。当你重新启用它时,你可以写:
button.Enabled := True;
button.OnClick := MyOnClickHandler;
这是一种相当粗略的方式。最好是将检查链向下推入OnClick
处理程序本身,或者甚至更好,进一步深入到业务逻辑中。这样,无论代码如何到达业务逻辑,如果需要被阻止,它都将是。
答案 1 :(得分:4)
除非攻击者对您的应用程序正在使用的特定VCL版本的内部工作方式有深入的了解,以便它可以直接操作VCL的内部内存,否则它可以做的最好是使用标准的Win32 API来公开操作您应用的可访问HWND,例如使用EnableWindow()
后跟BM_CLICK
。
因此,一个简单的防御措施是删除您要保护的攻击媒介 - 在这种情况下,将TButton
替换为TSpeedButton
。 TButton
是TWinControl
后代,因此它具有HWND。 TSpeedButton
是TGraphicControl
后代,因此它没有HWND,因此外部进程无法访问它,因为它是由VCL专门管理的自定义绘制控件,而不是操作系统。
答案 2 :(得分:1)
如果您的应用程序使用传统组件TButton
(来自StdCtrls.pas
),则该按钮是Windows标准控件。知道控制句柄的任何人都可以访问它。攻击者TNTEnforcer
可以迭代窗口并找到按钮句柄。之后,恶意软件可以启用您的按钮并模拟鼠标点击。
解决方案1:由于禁用的按钮无法点击,我的第一个想法是拦截CM_ENABLECHANGED
(David提到的WS_DISABLE
)消息,以便恶意软件无法更改按钮启用状态。解决方案类似于大卫的解决方案,但过于复杂。正如David所说,当我们打算禁用按钮时,我们可以暂时删除OnClick
处理程序。
解决方案2:另一个想法是保护按钮句柄不被搜索。您可以将传统的基于Vcl的应用程序转换为基于FireMonkey的跨平台应用程序。由于FMX会自行绘制组件,因此TNTEnforcer
无法以旧方式进行攻击。 我以前从未这样做过。转换努力可能很高。