- Автор темы
- #1
Внимание! Данный материал несёт исключительно научный характер! Любые попытки реального взлома могут караться по 272 ст. УК РФ. Вся ответственность лежит только на Вас. Приятного чтения.
Здравствуй дорогой читатель!
В этой статье я познакомлю тебя с таки прекрасным инструментом как dnSpy (ссылка на GitHub). Это отладчик с возможностью редактирования IL. Собственно тут мы посмотрим как можно произвести декомпиляцию .Net программы и произвести разного рода манипуляции. Установка программы происходит путём простого переноса файлов из архива в любое удобное место. dnSpy поставляется в 2х версиях: x86 и x64. Думаю не имеет смысла расковать почему так и какую версию нам надо запускать. Так же рекомендуется всегда запускать dnSpy от имени администратора.
Начнём с того что нам нужна цель взлома. Для наглядности я написал простенькое приложение, которое проверяет ключ по простой хеш-функции. Логика этой хэш-функции в том что сумма всех символов должна быть больше или равняться 1117. Под суммой символов подразумевается не то что мы видим на экране, а код из таблици кодировки символа, тип данных char.
И так начнём. Есть уйма способов обойти подобную защиту: сделать инжект своей хэш-функции, обойти вызов проверки ключа, сделать свой кейген и т.д. Попробуем несколько подходов. Открываем 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(), зашить свой ключ и т.д. и т.п. вариантов очень много. А теперь попробуем другую ситуацию. Нам нужно что бы файлы программы были оригинальные, так как некоторые библиотеки могут обновляться. Тут нам понадобится сделать свой кейген. Так как в просе изучения мы нашли функцию проверки ключа и увидели её логику, то у нас есть все необходимые данные для написания кейгена.
Запускаем и смотрим.
А теперь проверяем на оригинальной сборке.
Как мы видим ключ подошел и программа в неизменном виде теперь работает.
В настоящих проектах логика проверки ключа куда сложнее и запутаннее но принципы и подходы те же, что и в этой статье. Так же существуют способы защиты от такого редактирования коды, например, обфускация. Очень популярная тема в JS фрейморках. Что касаемо генерации ключа, то тут тоже уйма подводных камней. Исходя из моей практики ключ это набор байт обёрнутый Base64 и он хранит в себе следящее: принадлежность к изданию (обычная версия, PRO, MAX и т.д.), срок годности, привязка к версии программы и многое другое. Так же встречаются программы которые могут использовать сертификаты зашитые в ключах, это вообще отдельные случаи. Конечно мы не исключаем возможности когда программа подключается к серверу лицензий и тогда приходится обходить и такие проверки. Короче говоря существует целый винегрет и возможных защит. В любом случае dnSpy является мощным инструментом для реверс-инжиниринга. Конечно без знаний программирования и работы .NET тут не обойтись.
Спасибо что прочитали статью, надеюсь она была вам понятна. И не нарушайте законы)))
Здравствуй дорогой читатель!
В этой статье я познакомлю тебя с таки прекрасным инструментом как 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
