Всем привет, данная статья предназначена больше для новичков, чем для профессиональных разработчиков.
Появилась нужда написать коммерческий софт на C#, но мой основной ЯП C++...
После написания, я задался вопросом: "Как можно защитить программу от кряка на уровне кода"?
VMP, Termida, .net reactor не подходит, тк хотелось сделать именно на уровне кода...
Но они тут тоже будут (нет, мне лень) .
Для начала разберем детект дебагеров и прочую шалупонь.
Решил взять первый попавшийся сурс на GH:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
.Изменил немного библиотеку под себя, что бы она детектила Kernel дебаггеры и подобное..
Сделал bool триггер, который отрабатывает, если запущен дебаггер.
Получается примерно такой код:
Как говорит @X-Shar:
Парсится логин и пароль с полей, далее идёт проверка (в оригинале не так, написал это как пример для статьи).
Если триггер не активирован и пароль верный, то переходим на main форму.
Сделал это по той причине, что бы с ходу не было понятно что дебагер задетекчен. (Да, смысла от этого мало, но от первого школьника спасет.)
Далее решил немного "потроллить" реверсера, добавил счетчик попыток ввода и функцию которая вызывает BSOD.
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);
}
Теперь при вводе неверного пароля 4 раза, вызывается бсод.
Так-же, советую добавить VMP.
Но гайда по настройке не будет, тк я сам долго разбирался
Что добавил ещё?
Общение клиента с сервером через SSL.
Через сокеты сделал проверку на суспенд процесса. (Если после соединения с сервером, клиент не отсылает запрос в течении 3х секунд, соединение прерывается, тоже смысла мало, но лишним не будет) *происходит в цикле.
Парсинг шифрованных оффсетов с сервера и расшифровка их в клиенте.
Динамический ключ шифрования (пока приходится менять руками на стороне сервера, планирую автоматизировать).
Проверка на целостность клиента, в случае если она нарушена, сервер будет отсылать рандомные данные. (Что бы это не было очевидным).
Что ещё можно реализовать?
Динамическую обфускацию файла, каждый скаченный билд с сайта, будет уникальным.
На этом всё, защита получилась посредственная, но Васю с 7Б остановит.
Было реализовано:
Защита от подделки сервера авторизации.
Защита от дампа (VMP).
Обнаружение дебаггеров.
Шифрование запросов.
Лишний раз убеждаюсь, что шарп не подходит для моих целей, а защитить его на уровне кода, не используя доп средств крайне сложно.
Попытка авторизации при запущенном xdbg (логин и пароль введены верно):
Последнее редактирование: