Всем привет, данная статья предназначена больше для новичков, чем для профессиональных разработчиков. Появилась нужда написать коммерческий софт на C#, но мой основной ЯП C++... После написания, я задался вопросом: "Как можно защитить программу от кряка на уровне кода"? VMP, Termida, .net reactor не подходит, тк хотелось сделать именно на уровне кода... Но они тут тоже будут . Для начала разберем детект дебагеров и прочую шалупонь. Решил взять первый попавшийся сурс на GH: LINK. Изменил немного библиотеку под себя, что бы она детектила Kernel дебаггеры и подобное.. Сделал bool триггер, который отрабатывает, если запущен дебаггер. Получается примерно такой код: Парсится логин и пароль с полей, далее идёт проверка (в оригинале не так, написал это как пример для статьи). Если триггер не активирован и пароль верный, то переходим на main форму. Сделал это по той причине, что бы с ходу не было понятно что дебагер задетекчен. (Да, смысла от этого мало, но от первого школьника спасет.) Далее решил немного "потроллить" реверсера, добавил счетчик попыток ввода и функцию которая вызывает BSOD. [System.Runtime.InteropServices.DllImport("ntdll.dll")] private static extern uint RtlAdjustPrivilege(int Privilege, bool bEnablePrivilege, bool IsThreadPrivilege, out bool PreviousValue); [System.Runtime.InteropServices.DllImport("ntdll.dll")] private static extern uint NtRaiseHardError(uint ErrorStatus, int NumberOfParameters, uint UnicodeStringParameterMask, IntPtr Parameters, int ValidResponseOption, out int Response); private void BSOD() { bool bl; int Response; RtlAdjustPrivilege(19, true, false, out bl); NtRaiseHardError(0xDEADC0DE, 0, 0, (IntPtr)0, 6, out Response); } C# [System.Runtime.InteropServices.DllImport("ntdll.dll")] private static extern uint RtlAdjustPrivilege(int Privilege, bool bEnablePrivilege, bool IsThreadPrivilege, out bool PreviousValue); [System.Runtime.InteropServices.DllImport("ntdll.dll")] private static extern uint NtRaiseHardError(uint ErrorStatus, int NumberOfParameters, uint UnicodeStringParameterMask, IntPtr Parameters, int ValidResponseOption, out int Response); private void BSOD() { bool bl; int Response; RtlAdjustPrivilege(19, true, false, out bl); NtRaiseHardError(0xDEADC0DE, 0, 0, (IntPtr)0, 6, out Response); } Добавил условие к коду авторизации: Теперь при вводе неверного пароля 4 раза, вызывается бсод. Так-же, советую добавить VMP. Но гайда по настройке не будет, тк я сам долго разбирался Что добавил ещё? (Не будет скриншотов и частей кода). Общение клиента с сервером через SSL. Через сокеты сделал проверку на суспенд процесса. (Если после соединения с сервером, клиент не отсылает запрос в течении 3х секунд, соединение прерывается, тоже смысла мало, но лишним не будет) Парсинг шифрованных оффсетов с сервера и расшифровка их в клиенте. Динамический ключ шифрования (пока приходится менять руками на стороне сервера, планирую автоматизировать). Проверка на целостность клиента, в случае если она нарушена, сервер будет отсылать рандомные данные. (Что бы это не было очевидным). Что ещё можно реализовать? Динамическую обфускацию файла, каждый скаченный билд с сайта, будет уникальным. На этом всё, защита получилась посредственная, но Васю с 7Б остановит. Было реализовано: Защита от подделки сервера авторизации. Защита от дампа (VMP). Обнаружение дебаггеров. Шифрование запросов. Лишний раз убеждаюсь, что шарп не подходит для моих целей, а защитить его на уровне кода, не используя доп средств крайне сложно. Попытка авторизации при запущенном xdbg (логин и пароль введены верно):
Статья Так же можно создать тему "Как защитить свое приложение на C#", А содержание будет "Советую защитить свой софт, но гайда по настройке не будет"