• Уменьшение отступа

    Обратная связь

    (info@ru-sfera.pw)

На заметку Как я пытался защитить проект C# от кряка.


MKII

Администратор
Администрация
Регистрация
03.10.2022
Сообщения
256
Репутация
182
1668832896770.png

Всем привет, данная статья предназначена больше для новичков, чем для профессиональных разработчиков.
Появилась нужда написать коммерческий софт на C#, но мой основной ЯП C++...
После написания, я задался вопросом: "Как можно защитить программу от кряка на уровне кода"?
VMP, Termida, .net reactor не подходит, тк хотелось сделать именно на уровне кода...
Но они тут тоже будут (нет, мне лень) :Mem1:.

Для начала разберем детект дебагеров и прочую шалупонь.
Решил взять первый попавшийся сурс на GH: .
Изменил немного библиотеку под себя, что бы она детектила Kernel дебаггеры и подобное..
Сделал bool триггер, который отрабатывает, если запущен дебаггер.
Получается примерно такой код:
1668832964476.png

Как говорит @X-Shar: Твоя защита х*ета!
1668833053600.png

Парсится логин и пароль с полей, далее идёт проверка (в оригинале не так, написал это как пример для статьи).
Если триггер не активирован и пароль верный, то переходим на 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);
        }
Добавил условие к коду авторизации:
1668832975072.png

Теперь при вводе неверного пароля 4 раза, вызывается бсод.

Так-же, советую добавить VMP.
Но гайда по настройке не будет, тк я сам долго разбирался :Mem1:

Что добавил ещё?
Общение клиента с сервером через SSL.
Через сокеты сделал проверку на суспенд процесса. (Если после соединения с сервером, клиент не отсылает запрос в течении 3х секунд, соединение прерывается, тоже смысла мало, но лишним не будет) *происходит в цикле.
Парсинг шифрованных оффсетов с сервера и расшифровка их в клиенте.
Динамический ключ шифрования (пока приходится менять руками на стороне сервера, планирую автоматизировать).
Проверка на целостность клиента, в случае если она нарушена, сервер будет отсылать рандомные данные. (Что бы это не было очевидным).

Что ещё можно реализовать?
Динамическую обфускацию файла, каждый скаченный билд с сайта, будет уникальным.

На этом всё, защита получилась посредственная, но Васю с 7Б остановит.

Было реализовано:
Защита от подделки сервера авторизации.
Защита от дампа (VMP).
Обнаружение дебаггеров.
Шифрование запросов.

Лишний раз убеждаюсь, что шарп не подходит для моих целей, а защитить его на уровне кода, не используя доп средств крайне сложно.

Попытка авторизации при запущенном xdbg (логин и пароль введены верно):
1668833953687.png
 
Последнее редактирование:

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
Интересная статья. Насчет бсода, не слишком ли жестоко? )))
Как говорил один известный C# разработчик, надо сделать так, чтобы хакер зае6ался. Вообще никаких уведомлений и окон об ошибках не посылать, чтобы взломщик думал, что он что-то делает не так. К примеру, если дебаггер присутствует, то берем имя нашего файла, меняем англ "a" на кириллическую "а", и если эта буква есть, то программа после отладчика вообще не запускается, просто return из main или Application.exit(). Вообщем, всё ограничивается фантазией
 

MKII

Администратор
Администрация
Регистрация
03.10.2022
Сообщения
256
Репутация
182
чтобы хакер зае6ался
Пока думаю как это сделать.)
На шарпе тяжелее, я больше с плюсами работаю, а тут просто программу с UI понадобилось сделать максимально быстро и красиво:)
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 176
Так Bsod, это для тех-кто будет пытаться сбрутить пароль ?)

Вообще и NtRaiseHardError тоже будет виден, если получится распаковать программу.
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 176
Как понимаю основная защита, это протекторы, если их кто-то обойдёт, то всё остальное тоже не проблема будет.)
 

MKII

Администратор
Администрация
Регистрация
03.10.2022
Сообщения
256
Репутация
182
Так Bsod, это для тех-кто будет пытаться сбрутить пароль ?)
Кто будет с дебаггером пытаться войти в аккаунт, что бы перехватить запрос авторизации или как-то подделать его, а для тех кто просто брутит отдельная защита, после 3 попыток входа блокируется ввод пароля.
 

MKII

Администратор
Администрация
Регистрация
03.10.2022
Сообщения
256
Репутация
182
Как понимаю основная защита, это протекторы, если их кто-то обойдёт, то всё остальное тоже не проблема будет.)
Тут ты прав, но вмп не сбросишь так, что бы было видно вызовы инструкций + там хороший анти дамп и он абузит (не помню что, но что-то абузит Отдыхай!!!)
 

MKII

Администратор
Администрация
Регистрация
03.10.2022
Сообщения
256
Репутация
182
Вообще и NtRaiseHardError тоже будет виден, если получится распаковать программу.
Тут опять-же про вмп, слишком сложно распаковывать из за каких-то там абузов, вот.)
+ она хорошо детектит дебаггеры в usermode и kernelmode.
 

MKII

Администратор
Администрация
Регистрация
03.10.2022
Сообщения
256
Репутация
182
Тут опять-же про вмп, слишком сложно распаковывать из за каких-то там абузов, вот.)
+ она хорошо детектит дебаггеры в usermode и kernelmode.
То есть, защита от Васи из 7Б на хорошем уровне.)
 

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
Так Bsod, это для тех-кто будет пытаться сбрутить пароль ?)

Вообще и NtRaiseHardError тоже будет виден, если получится распаковать программу.
можно помечать свою программу как критический процесс и принудительно завершить этот процесс. А можно ещё проще: вызывать powershell с аргументом wininit.
 
Верх Низ