Delphi Anti Cheat (активировать любую отключенную кнопку)

В моем приложении есть несколько кнопок, которые я по какой-то причине отключил. Но эти кнопки легко включаются TNTEnforcer.

Есть ли простой способ предотвратить это?

Пытался упаковать с пакером / обфускатором, но все же можно включить.

Что такое TNTEnforcer

3 ответа

Решение

Элементы управления VCL поддерживаются элементами управления Win32, и они изначально небезопасны. Вы не можете ограничить доступ к их свойствам и состоянию. Внешние программы могут легко изменять состояние, нажимать кнопки и т. Д.

Вы можете испытать желание запустить таймер, который сбрасывает состояние пользовательского интерфейса с высокой частотой. Это может сделать это немного сложнее для взломщика. Но все же не особенно сложно, и какой ценой для вашей программы и кода?

Поэтому, на мой взгляд, вы не должны пытаться остановить внешние программы, мешающие состоянию пользовательского интерфейса. Вместо этого вы можете добавить проверки и защиты к OnClick обработчики и другой код позади пользовательского интерфейса. Это тоже идеально подходит для взлома, но требует, по крайней мере, немного больше эффекта от взломщика.

Вы могли бы написать:

button.Enabled := False;
button.OnClick := nil;

когда вы отключаете кнопку. Когда вы снова включите его, вы можете написать:

button.Enabled := True;
button.OnClick := MyOnClickHandler;

Это довольно грубый способ сделать это. Может быть предпочтительнее нажать проверку вниз по цепочке вызовов, в OnClick Сам обработчик, или, что еще лучше, дальше в вашей бизнес-логике. Таким образом, независимо от того, как код достигнет бизнес-логики, его нужно будет заблокировать.

Если злоумышленник не имеет глубоких знаний о внутренней работе конкретной версии VCL, которую использует ваше приложение, чтобы он мог напрямую манипулировать внутренней памятью VCL, лучшее, что он может сделать, - это использовать стандартные Win32 API для манипулирования общедоступными HWND ваше приложение, например, с помощью EnableWindow() с последующим BM_CLICK,

Таким образом, одной простой защитой было бы удалить вектор атаки, который вы хотите защитить - в этом случае, заменив TButton с TSpeedButton, TButton это TWinControl потомок, поэтому у него есть HWND. TSpeedButton это TGraphicControl потомок, поэтому он не имеет HWND и, следовательно, не доступен для внешних процессов, потому что это пользовательский элемент управления, управляемый исключительно VCL, а не ОС.

Если ваше приложение использует традиционный компонент TButton (от StdCtrls.pas), кнопка является стандартным элементом управления Windows. Любой, кто знает дескриптор управления, может получить к нему доступ. Злоумышленник TNTEnforcer можно перебрать окна и найти дескриптор кнопки. После этого вредоносная программа может активировать вашу кнопку и симулировать щелчки мышью.

Решение 1. Поскольку отключенные кнопки не активируются, моей первой идеей является перехват CM_ENABLECHANGED (Дэвид упомянул WS_DISABLE), чтобы вредоносная программа не смогла изменить состояние включения кнопки. Решение похоже на Дэвида, но слишком сложное. Как упоминал Дэвид, мы можем удалить OnClick Обработчик временно, когда мы намерены отключить кнопку.

Решение 2. Другая идея - защитить ручку кнопки от поиска. Вы можете преобразовать ваше традиционное приложение на основе Vcl в кроссплатформенное приложение на основе FireMonkey. Поскольку FMX сам рисует компоненты, TNTEnforcer не может атаковать по-старому вообще. Я никогда не делал этого раньше. Усилие преобразования может быть высоким.

Другие вопросы по тегам