ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
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