• Добро пожаловать на сайт - Forumteam.bet !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

Учимся анализировать и взламывать .NET приложения

Benzema

Публикатор
Команда форума
Регистрация
27.01.18
Веб-сайт
netysaita.com
TG
@@qq
Внимание! Данный материал несёт исключительно научный характер! Любые попытки реального взлома могут караться по 272 ст. УК РФ. Вся ответственность лежит только на Вас. Приятного чтения.
Здравствуй дорогой читатель!
В этой статье я познакомлю тебя с таки прекрасным инструментом как dnSpy (ссылка на GitHub). Это отладчик с возможностью редактирования IL. Собственно тут мы посмотрим как можно произвести декомпиляцию .Net программы и произвести разного рода манипуляции. Установка программы происходит путём простого переноса файлов из архива в любое удобное место. dnSpy поставляется в 2х версиях: x86 и x64. Думаю не имеет смысла расковать почему так и какую версию нам надо запускать. Так же рекомендуется всегда запускать dnSpy от имени администратора.

Начнём с того что нам нужна цель взлома. Для наглядности я написал простенькое приложение, которое проверяет ключ по простой хеш-функции. Логика этой хэш-функции в том что сумма всех символов должна быть больше или равняться 1117. Под суммой символов подразумевается не то что мы видим на экране, а код из таблици кодировки символа, тип данных char.

C#:
internal class Program
{
    private static void Main(string[] args)
    {
        if (args.Length == 1)
        {
            if (CheckKey(args[0]))
            {
                Console.WriteLine("Введён верный ключ активации");
            }
            else
            {
                Console.WriteLine("Введён не верный ключ активации");
            }
        }
        else
        {
            Console.WriteLine("Ошибка! Не указан ключ активации");
        }
    }

    private static bool CheckKey(string key)
    {
        return key.OfType<char>().Sum(x => x) >= 1117;
    }
}

И так начнём. Есть уйма способов обойти подобную защиту: сделать инжект своей хэш-функции, обойти вызов проверки ключа, сделать свой кейген и т.д. Попробуем несколько подходов. Открываем dnSpy и загружаем нашу программу.


Отлично! Мы видим что программа спокойно открылась и все её зависимости загрузились. Так же тут видны все подробности нашей сборки. Теперь ищем наш класс Program.

Ух ты! Это наш исходный код, но он какой-то не такой.... Но тут стоит сделать ремарку. Это не совсем наш исходный код. Это программно составленный C# основанный на IL коде. Подробней об этом моно почитать в тут. И так начнём с простого, попробуем обойти вызов функции CheckKey(). Для этого нам нужно изменить конструкцию IL кода. Нажимаем в 17 строке ПКМ по условию if и выбираем "Изменить конструкции IL..." и попадаем в недра IL кода.


Видим в 15 строке вызов команды ldloc.1, её нужно заменить на ldc.i4.1. Это действие произведёт подмену переменной flag2 на True, idc.i4.1 это установка значения типа Int4 (int32) в значение 1, другими словами True.


Жмём OK и о чудо!

Независимо от результата выполнения функции CheckKey() программа всегда будет думать что она была активирована ключом. Давайте теперь проверим нашу взломанную программу. Для этого в меню dnSpy нажибаем "Файл" -> "Сохранить модуль". По умолчанию файл кладётся в тот же каталог что и оригинальный файл с тем же именем, будьте внимательны. Для начала проверим оригинальную версию программы.


Всё работает как надо. А теперь проверим нашу взломанную версию.


Это первый вариант решения задачи. Так же можно было поменять содержимое функции CheckKey(), зашить свой ключ и т.д. и т.п. вариантов очень много. А теперь попробуем другую ситуацию. Нам нужно что бы файлы программы были оригинальные, так как некоторые библиотеки могут обновляться. Тут нам понадобится сделать свой кейген. Так как в просе изучения мы нашли функцию проверки ключа и увидели её логику, то у нас есть все необходимые данные для написания кейгена.

C#:
internal class Program
{
    private static void Main(string[] args)
    {
        var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        var rnd = new Random();
        var key = string.Empty;

        while (key.OfType<char>().Sum(x => x) < 1117)
        {
            key += chars[rnd.Next(0, chars.Length)];
        }

        Console.WriteLine($"key: {key}");
    }
}

Запускаем и смотрим.

А теперь проверяем на оригинальной сборке.

Как мы видим ключ подошел и программа в неизменном виде теперь работает.

В настоящих проектах логика проверки ключа куда сложнее и запутаннее но принципы и подходы те же, что и в этой статье. Так же существуют способы защиты от такого редактирования коды, например, обфускация. Очень популярная тема в JS фрейморках. Что касаемо генерации ключа, то тут тоже уйма подводных камней. Исходя из моей практики ключ это набор байт обёрнутый Base64 и он хранит в себе следящее: принадлежность к изданию (обычная версия, PRO, MAX и т.д.), срок годности, привязка к версии программы и многое другое. Так же встречаются программы которые могут использовать сертификаты зашитые в ключах, это вообще отдельные случаи. Конечно мы не исключаем возможности когда программа подключается к серверу лицензий и тогда приходится обходить и такие проверки. Короче говоря существует целый винегрет и возможных защит. В любом случае dnSpy является мощным инструментом для реверс-инжиниринга. Конечно без знаний программирования и работы .NET тут не обойтись.
Спасибо что прочитали статью, надеюсь она была вам понятна. И не нарушайте законы)))
 
Telegram
@qq

Artificial Intelligence

Отвечаю на ваши вопросы
Forum Team Bot
Регистрация
17.03.23
Данная статья представляет собой научное рассуждение о программе dnSpy, которая имеет возможности декомпиляции и редактирования IL кода программ на .NET. В статье приведен пример взлома программы с использованием этого инструмента. Автор также указывает на возможные последствия реального взлома, подчеркивая, что ответственность лежит только на читателе. Он также предупреждает о необходимости иметь знания программирования и работы с .NET для использования этого инструмента. Автор также отмечает, что существуют способы защиты от такого взлома, например, обфускация кода.
 
Сверху Снизу