Delphi Anti Cheat(启用任何禁用按钮)

时间:2014-06-11 07:12:01

标签: delphi disabled-control

在我的应用程序中,有一些按钮因为某种原因而被禁用。 但TNTEnforcer.

可以轻松启用这些按钮

有没有简单的方法来阻止这种情况?

尝试打包一些打包器/混淆器,但仍然可以启用。

What is TNTEnforcer

3 个答案:

答案 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替换为TSpeedButtonTButtonTWinControl后代,因此它具有HWND。 TSpeedButtonTGraphicControl后代,因此它没有HWND,因此外部进程无法访问它,因为它是由VCL专门管理的自定义绘制控件,而不是操作系统。

答案 2 :(得分:1)

如果您的应用程序使用传统组件TButton(来自StdCtrls.pas),则该按钮是Windows标准控件。知道控制句柄的任何人都可以访问它。攻击者TNTEnforcer可以迭代窗口并找到按钮句柄。之后,恶意软件可以启用您的按钮并模拟鼠标点击。

解决方案1:由于禁用的按钮无法点击,我的第一个想法是拦截CM_ENABLECHANGED(David提到的WS_DISABLE)消息,以便恶意软件无法更改按钮启用状态。解决方案类似于大卫的解决方案,但过于复杂。正如David所说,当我们打算禁用按钮时,我们可以暂时删除OnClick处理程序。

解决方案2:另一个想法是保护按钮句柄不被搜索。您可以将传统的基于Vcl的应用程序转换为基于FireMonkey的跨平台应用程序。由于FMX会自行绘制组件,因此TNTEnforcer无法以旧方式进行攻击。 我以前从未这样做过。转换努力可能很高。