27.11.2014 Views

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

взлом<br />

CRACKME ОТЧАЯННО<br />

СОПРОТИВЛЯЕТСЯ<br />

ШИФРУЕМ СБОРКУ<br />

Microsoft он носит название MSIL (Microsoft<br />

Intermediate Language), а после стандартизации<br />

все называют его просто CIL (Common<br />

Intermediate Language) или, еще круче, — IL.<br />

CLR (Common Language Runtime) отвечает за<br />

компиляцию байт-кода в нативный, обеспечивая<br />

его выполнение на целевой системе. При этом<br />

используется подход JIT (Just-In-Time), согласно<br />

которому компиляция производится оперативно<br />

по мере необходимости.<br />

Посмотрим, что представляет собой .NET-приложение<br />

глазами Ольги. Для этого создадим<br />

простенькое приложение Windows.Forms, содержащее<br />

одну кнопку и вызывающее MessageBox<br />

с сообщением «Hello, World» при ее нажатии. Не<br />

правда ли, очень оригинально?<br />

Создал? Тогда грузи сборку в Ольгу и наслаждайся<br />

результатом. Приложение загрузилось, а в<br />

окне дизассемблера — пусто. Обидно до соплей.<br />

Точку входа не поймали и чего дальше делать —<br />

непонятно. Жмем паузу и переходим к отладке<br />

программы. Ставим условную точку останова на<br />

TranslateMessage для перехвата нажатий левой<br />

кнопки мыши (WM_LBUTTONUP: MSG == 202).<br />

Кликаем и погружаемся в транс — казалось бы,<br />

элементарный вызов MessageBox заставляет Ольгу<br />

совершать кучу действий и не дает никакого понимания<br />

логики работы программы. Наверное, не все<br />

так уж и ужасно, но сей факт заставляет задуматься<br />

о целесообразности использования классического<br />

отладчика для работы с .NET-сборками. Итак,<br />

продолжим поиск новых друзей-отладчиков.<br />

БРАТЬЯ-БЛИЗНЕЦЫ:<br />

ILASM И ILDASM<br />

Динамическое компилирование делает<br />

процедуру отладки практически невозможной<br />

для сложных приложений. Но зачем пытаться<br />

отлаживать нативный код, когда можно подняться<br />

выше и работать на уровне IL?<br />

Первая проблема — как этот самый код получить,<br />

XÀÊÅÐ 07 /127/ 09<br />

имея под рукой только бинарник. Для этого сама<br />

Microsoft предлагает инструмент под названием<br />

ILDASM. Название выбрано неспроста (надеюсь,<br />

ты уже догадался, что к чему). ILDASM устанавливается<br />

автоматически при установке Visual<br />

Studio, так что, поверь, он у тебя уже есть.<br />

Запускаем консоль студии (или просто подгружаем<br />

переменные среды с помощью скрипта<br />

vsvars32.bat) и запускаем ildasm. Открываем наше<br />

приветливое приложение и утыкаемся в нечто похожее<br />

на диаграмму классов. Развертывая метод<br />

любого из классов, получаем его IL-код. С кодом<br />

мы разберемся немного позже, а сейчас проведем<br />

эксперимент. Выбираем меню File Dump<br />

и сохраняем код всего приложения в текстовый<br />

файл Sample1.il. После этого запускаем ILASM<br />

(угадай для чего): ilasm Sample1.il. Получаем<br />

файл с непонятным расширением exe, запускаем<br />

и видим до боли знакомую форму. Перед нами<br />

простейший алгоритм патчинга приложений:<br />

• дизассемблируем код в IL-язык;<br />

• дампим в текстовый файл;<br />

• корректируем текст в любимой среде программирования<br />

aka «Блокнот»;<br />

• собираем приложение из IL-кода.<br />

УЧИМ МАТЧАСТЬ<br />

Итак, IL. Неплохо хотя бы немного представлять,<br />

как писать на IL, скажешь ты, и будешь абсолютно<br />

прав. Чтобы разбираться в логике работы, а тем<br />

более, иметь возможность ее изменять, нам нужно<br />

изучить азы языка. Этим сейчас и займемся.<br />

Для начала определимся с инструментом. «Блокнот»<br />

— великая вещь, но хотелось бы иметь под<br />

рукой среду, обеспечивающую комфортную работу<br />

на всем цикле разработки: подсветку синтаксиса,<br />

автоматическую компиляцию и линковку, отладку.<br />

Напрашивается Visual Studio, ан нет, Microsoft не<br />

реализует поддержку IL. Возможно, есть какиенибудь<br />

плагины, но мне их найти не удалось.<br />

По большому счету, можно программировать прямо<br />

ВОССТАНАВЛИВАЕМ БИНАРНИК<br />

ИЗ IL-КОДА<br />

в IL, поэтому будем искать среду программирования<br />

и отладки. Проектов таких два: DILE и ILIDE#.<br />

Первый — редактор, позволяющий отлаживать<br />

исполняемый код. Самое смешное, что как раз редактировать<br />

он и не умеет (классно назвали). Второй<br />

проект представляет собой полноценную среду<br />

программирования. Однако попытка импортировать<br />

код, полученный из ILDASM, приводит к невозможности<br />

компиляции (классная IDE). В конечном<br />

итоге выбор пал на среду SharpDevelop, в которой<br />

можно создавать проекты с поддержкой IL. Такую<br />

же поддержку предоставляет MonoDevelop, однако<br />

у меня он работать отказался, а то, что не работает,<br />

идет в топку. Недостатки SharpDevelop: отсутствует<br />

поддержка автодополнения и невозможна работа с<br />

диаграммами классов.<br />

Напишем небольшое консольное приложение,<br />

на примере которого рассмотрим основные языковые<br />

конструкции. Программа будет складывать<br />

два числа и выводить их сумму.<br />

Вся программа состоит из набора директив и<br />

команд. Директивы начинаются с символа точки и<br />

реализуют декларативные функции:<br />

• .assembly — объявляет определение манифеста<br />

и указывает, какой сборке принадлежит текущий<br />

модуль;<br />

• .method — объявляет метод;<br />

• .entrypoint — объявляет, что указанный метод<br />

реализует точку входа в приложение;<br />

• .maxstack — указывает максимальное количество<br />

слотов в стеке для передачи параметров<br />

функции;<br />

•.locals — объявляет локальные переменные<br />

метода.<br />

055

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!