Введение в Реверс-Инжиниринг .NET – часть 1
Обратно же, статья в моем стиле максимально информативно и лаконично.
Вступление
Доброго времени суток, уважаемые форумчане! Листая наш прекрасный форум, я наткнулся на статью Что такое реверс-инжиниринг + пару полезных книгВдохновившись, я решил написать похожую статью, только мы будем проводить реверс-инжиниринг файлов, написанных на языке C#.
Инструменты
dnSpy –https://github.com/dnSpy/dnSpy
(отладчик и редактор сборок .NET; позволяет редактировать и отлаживать сборки без исходного кода)
JetBrains DotPeek – https://www.jetbrains.com/decompiler (декомпилятор)
Различие .NET и нативных x86 приложений
Нативные приложения:
Исходный код (C/C++ и другие) проходит через препроцессор, компилятор и компоновщик.
В результате получаем исполняемый файл с инструкциями, специфичными для архитектуры и ОС.- Код выполняется напрямую процессором без промежуточных виртуальных машин.
.NET приложения:
Код на C# компилируется в IL (Intermediate Language).
IL выполняется в управляемой среде CLR (Common Language Runtime) или её аналогах (JVM для Java).
В последних версиях .NET появилась опция Enable native AOT publish.
Практика: сборка и реверс без Native AOT
Создадим простую программу с проверкой пароля (
Code:
PasswordCheckerLIMB
Code:
private static void Main()
{
Console.WriteLine(Watermark);
bool loopLIMB = true;
while (loopLIMB)
{
Console.Write("Enter password: ");
string inputLIMB = Console.ReadLine();
loopLIMB = CheckPasswordLIMB(inputLIMB);
Console.WriteLine(Watermark);
}
}
private static bool CheckPasswordLIMB(string pwdLIMB)
{
if (string.IsNullOrEmpty(pwdLIMB))
{
Console.WriteLine("Password cannot be empty");
return true;
}
if (pwdLIMB == CorrectPasswordLIMB)
{
Console.WriteLine("Access granted");
return false;
}
Console.WriteLine("Access denied");
return true;
}
}
Программа запрашивает пароль и выводит либо Access granted, либо Access denied. Компилируем через MSVC.
При запуске через CMD может возникнуть ошибка о пропавшей DLL (testdutt.dll). Теперь у нас два пути:
Перетащить DLL из папки
в папку с EXE и запустить.C:\Users<имя ПК>\source\repos<проэкт>\bin\Release\net8.0
Собрать самодостаточный EXE без внешних DLL (Native AOT).
Исследование сборок в dnSpy
- Открываем EXE в DetectItEasy – это пустой файл с .NET-лоадером.
- Загружаем EXE в dnSpy – видим только структуру PE файла.
- Загружаем саму DLL в dnSpy и нажимаем правой кнопкой мыши по файлу и нажимаем на Go To Entry Point – попадаем в наш код, видим константу пароля и метод CheckPasswordLIMB.
Native AOT
Скомпилировав с Native AOT, мы получим аналогичный результат, лишь без внешних зависимостей. Подробности опустим до части 2.Защита приложения
Для минимальной защиты рекомендую использовать .NET Reactor (последняя версия) или скачать его с моего сайта asm.rest:
В окне Main Assembly перетаскиваете скомпилированную DLL.
Выбираете функции защиты и жмёте PROTECT.- В папке появится _Secure с защищёнными файлами – переносите туда EXE и запускаете.
Это базовая защита, о продвинутых методах – во второй части.
Практика: анализ чужой ВРЕДОНОСНОЙ сборки
Ищем кряк любого читы на форумах или YouTube (пример: https://www.youtube.com/watch?v=UWXIkobGbu4]UWXIkobGbu4[/URL]). После скачивания запускаем DetectItEasy – видим VB.NET.Загружаем в dnSpy – множество запутанных классов.
Для упрощённого анализа используем онлайн-сканер, например https://www.uncoverit.org/]UncoverIT[/URL]:
- Результат: SheetRat – вредоносный RAT на C# с C2 https://pastebin.com/raw/ASKidwEn
На этом статья подходит к концу: мы научились реверсить чистые .NET-приложения, собирать их и минимально защищать. Во второй части разберём углублённые техники и антивм-защиты.
Книги и материал по C# смотрите на форуме - asm.rest
👍22
😮6
😢2
LIMB