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

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

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

РЕВЕРСИНГ .NET FRAMEWORK-ПРИЛОЖЕНИЙ И КОМПОНЕНТОВ

ЧЕМ ЖЕ ОТЛИЧАЕТСЯ РЕВЕРСИНГ .NET FRAMEWORK-ПРИЛОЖЕНИЙ И КОМПОНЕНТОВ (ДАЛЕЕ ПРОСТО «.NET») ОТ ОБЫЧНЫХ ПРОГРАММ, НАПРИМЕР, СКОМПИЛИРОВАННЫХ КОМПИЛЯТОРОМ CC++ (ДАЛЕЕ «NATIVE»)? ЧТОБЫ ОТВЕТИТЬ НА ЭТОТ ВОПРОС, НЕМНОГО ПОКОПАЕМСЯ В ТЕОРИИ

Программы, написанные для платформы .NET, компилируются в первую очередь не в native, а в некий псевдокод, названный MSIL (MicroSoft Intermediate Language). Чтобы преуспеть во взломе .NET, крэкер должен быть знаком с этим языком — здесь, пожалуй, кроется основная сложность.

Кстати, хотя я употребил термин «псевдокод», я совсем не пытался сказать, что IL выполняет некий интерпретатор (как в программах VB6, откомпилированных с ключом P-CODE). IL-код программы компилируется перед запуском (точнее, компилируется метод, помеченный атрибутом .entrypoint), остальной код — перед его использованием. Эта технология называется JIT (just in time) — «компиляция во время выполнения», но, несмотря на название, возможно осуществить ее и во время установки программы или даже вручную с помощью утилиты ngen (входит в дистрибутив .NET). IL немного похож на ассемблер тем, что каждая команда имеет не более двух операндов и присутствует работа со стеком. Стек .NET представляет собой типизированную реализацию стека в ассемблерном понимании, то есть в стек можно записывать и считывать объекты определенного типа (ясное дело, нельзя записать в стек dword, а считать из него — word :)). Если захочешь изучить IL подробнее, начни с чтения доки от создателя (http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/cpref/html/frlrfSystemReflectionEmitOpCodesMembersTopic.asp), а мы пока двинемся дальше.

метаданные в .NET имеют

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

На сегодня написано немало декомпиляторов, которые в точности показывают исходный код программы. Среди них, наверное, выделю только Reflector, который помогает быстро разобраться в логике программы на одном из .NET-языков. Для полного восстановления исходного кода используется плагин Reflector.FileDisassembler. Могу заверить, что выделить места для модификации с помощью Reflector'а и затем сделать патч в IL намного проще, чем добиваться компилируемости декомпилированных исходников. Декомпиляция в любом случае происходит неидеально, и возникает куча нюансов, которым необходимо уделить время.

strong key

(далее «SN») — это криптостойкая (RSA1024) цифровая подпись .NET-программ, которую разработчик может внедрить в свою программу. SN служит для удостоверения факта того, что программа не была модифицирована кем-либо. Если программа была подписана, то в дизассемблерном листинге, среди прочих атрибутов сборки, мы увидим следующее:

.custom instance void [mscorlib]System.Reflection.AssemblyKeyFileAttribute::.ctor(string) =

( 01 00 7B 43 3A 5C 44 6F 63 75 6D 65 6E 74 73 20 // ..{C:Documents

Содержание  Вперед на стр. 065-042-2
ttfb: 2.9170513153076 ms