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

.NET секретам

 

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


ДОБЫЧА ИСХОДНОГО КОДА ПРИЛОЖЕНИЙ

ЭТА СТАТЬЯ ПОСВЯЩАЕТСЯ ТЕХНИКЕ ВОССТАНОВЛЕНИЯ ИСХОДНОГО КОДА .NET-ПРОГРАММ. РАЗБЕРЕМ И ПРОБЛЕМЫ, ВОЗНИКАЮЩИЕ ПОСЛЕ ВОССТАНОВЛЕНИЯ ИСХОДНОГО КОДА, — НЕРЕДКО ВОССТАНОВЛЕННЫЙ КОД ИМЕЕТ ОШИБКИ КОМПИЛЯЦИИ. В МОИХ СТАТЬЯХ (СМ. ПРЕДЫДУЩИЙ СПЕЦ) ОБ ЭТОМ УПОМИНАЕТСЯ

Зачем нужно восстанавливать исходный код? Есть две основные причины. Первая — это промышленный шпионаж. К примеру, на мировом рынке имеется около десятка компаний, производящих Grid control. На сегодняшний день три-четыре компании, то есть тройка лидеров, активно борются за покупателей, привнося в свой Grid control что-то новое. Если ноу-хау начинает пользоваться успехом и один из конкурентов получает серьезные преимущества на этом рынке, то и возникает ситуация, которая соблазняет конкурентов проникнуть в дебри технологии, чтобы внедрить ее в свой продукт.

Итак, первая причина — это восстановление исходного кода для кражи технологий.

Вторая причина — кража самого продукта ради уклонения от его оплаты. На данный момент мораль басни такова, что, поменяв названия классов и namespace'ов, можно с легкостью утверждать: «Компонент был написан кем-то другим ;). Настоящие разработчики не смогут доказать своих авторских прав». И почему же существуют эти причины? Если отбросить этическую и законную стороны вопроса, придем к выводу о том, что кража чужого труда приносит большую экономическую выгоду — экономим время и деньги. Конечно, мы с тобой — не сторонники незаконных дел, поэтому будем знакомиться с данной технологией в чисто образовательных целях.

[восстановление исходного кода] достигается благодаря анализу исполняемого файла. Цель анализа — найти языковые конструкции исходного кода, характерные для данного участка исполняемого кода (так называемая технология «декомпиляция»). Однако декомпиляция обычно идет в два прохода. При первом происходит дизассемблирование анализатора — чтобы первоначально разобрать исполняемый файл и составить структуры для дальнейшего анализа кода. Дизассемблирование — это перевод исполняемого кода в код неких абстрактных команд. Не смешивать понятия дизассемблирования и декомпиляции! В .NET дизассемблирование выдает листинг IL-команд, а декомпиляция — исходный код на одном из .NET-языков высокого уровня (ЯВУ).

Посмотрим, как обычно происходит декомпиляция. Для этого воспользуемся Reflector’ом (www.aisto.com/roeder/dotnet) и плагином Reflector.FileDisassembler (www.denisbauer.com/NETTools), который позволяет сохранять классы в отдельные файлы, конвертировать ресурсы в формат *.resx и создавать файл проекта.

[первым примером] восстановления исходного кода выступит замечательный красивый контрол nicepanel. Его можно скачать с www.purecomponents.com/products/nicepanel. Будем декомпилировать его в C#, поскольку на нем он и был написан. Декомпилировать в другой ЯВУ как-то проблематично, так как существует разница в синтаксических конструкциях языков. Например, в VB.Net не учитывается регистр символов имени классов, методов и т.д., а в C# одинаковые буквы в разных регистрах считаются разными названиями. Reflector не учитывает этого, поэтому при декомпиляции C#'ного кода в VB.Net мы получим кучу ошибок.

Содержание  Вперед на стр. 066-058-2