Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #65, АПРЕЛЬ 2006 г.

штурм зимнего .net'а

N|M{INT3 TEAM} (NIM@INT3.RU)

Спецвыпуск: Хакер, номер #065, стр. 065-042-3


Несколько горе-упаковщиков, созданных также для защиты .NET, не тянут даже на средний уровень безопасности. Они бережно пакуют и криптуют .NET-программу, не подозревая о том, что нам достаточно лишь подождать распаковки ;). Ни о каких современных техниках защиты с применением драйверов не может быть и речи — это связано с архитектурными особенностями платформы .NET. Оригинальный (некриптованный/упакованный) модуль может потребоваться платформе в любой момент, например, если нужно определить некий атрибут кода или если программисты, решая свои прикладные задачи, используют пространство имен System.Reflection. Я уже не говорю о сериализации и ремоутинге, где рефлекция используется повсеместно. В заключение можно лишь сказать, что Microsoft сделала отличную современную платформу для разработки, которую, к сожалению, пока невозможно защитить ни в статике, ни в динамике :).

рассмотрим технику взлома

во всех ее тонкостях. Первый шаг — это дизассемблирование: ildasm MyApp.exe /out:MyApp.h. На выходе появится файл MyApp.h, в котором содержится IL-листинг программы. Почему *.h? Такие файлы понимает Visual Studio, она подсвечивает синтаксис и позволяет закомментировать сразу несколько строк кода. Удобство налицо. Комментарии в IL тоже представляют собой // и /* */. Забегая вперед, скажу, что после изучения и модификации кода необходимо сделать ассемблирование: ilasm MyApp.h.

Особо отмечу, что после дизассемблирования в каталоге, где находится MyApp.h, создаются и файлы ресурсов, поэтому при ассемблировании не нужно перечислять их в командной строке ilasm — уже перечислено в файле MyApp.h в виде атрибутов: .mresource public MyApp.Form1.resources. Если в файле присутствует SN, нужно убрать его из листинга, что делается простым удалением атрибутов .AssemblyKeyFileAttribute и .publickey (их пример см. выше).

Точка входа в программу — это метод, помеченный атрибутом .entrypoint, именно с него стоит начинать исследование. Также в каждом .NET-классе есть точка входа, помеченная атрибутом .ctor или .cctor (эти методы называют конструкторы). В 99,9% случаев код, интересный для реверсинга, находится именно в этих методах. Конструкторы вызываются в момент создания объекта из класса. Пример: newobj instance void MyApp.Form1::.ctor().

В отличие от .ctor, .cсtor — это статический конструктор, который инициализирует статические (помеченные атрибутом static) поля класса. Для отладки ставим команду break в теле метода .entrypoint, остальные брейки можно расставить непосредственно в отладчике. Затем компилируем с генерацией отладочных файлов *.pdb вот таким образом: ilasm MyApp.h /debug. Если у тебя установлена Visual Studio, после запуска программы появится окошко, предлагающее на выбор два отладчика: Microsoft CLR Debugger и стандартный отладчик Studio. Стандартный хорош тем, что подсвечивает синтаксис и позволяет редактировать текст во время отладки, однако плохо, что он воспринимает атрибуты антиотладки. Методы, классы или сборка целиком могут быть помечены атрибутом: <System.Diagnostics.DebuggerStepThrough()> или другими подобными, и благодаря этой пометке отладчик не будет отлаживать программу/часть программы.

Назад на стр. 065-042-2  Содержание  Вперед на стр. 065-042-4