SASM – IDE для ассемблера
Данным постом хочу представить сообществу проект, который время от времени писался мной последний год: SASM (SimpleASM) — IDE для разработки программ на языке ассемблера x86 и x86-64.

SASM — простая кроссплатформенная (доступна на Windows и Linux) среда разработки для языков ассемблера NASM, MASM, GAS, FASM с подсветкой синтаксиса и отладчиком. Программа работает «из коробки» и хорошо подойдет для начинающих изучение языка ассемблера. Основана на Qt. Распространяется по свободной лицензии GNU GPL v3.0.
Исходники лежат в репозитории на GitHub.
Бинарники можно скачать на сайте программы.
Под катом Вы найдете немножко истории и более подробное описание возможностей.
Откуда все пошло
На 1 курсе в моём университете проходил учебный курс «Архитектура и язык ассемблера», в котором мы изучали ассемблер NASM и сдавали задачи на нем в ejudge контестах. Привыкший к использованию IDE при программировании до этого, я был не очень рад компилить все в командной строке. Удобных на мой взгляд IDE для NASM не было. Универсальные решения типа Geany мне не очень нравились (хотя на вкус и цвет товарища нет — кто-то пользовался всем этим и был доволен). Да и хотелось уже сделать что-нибудь большое и заодно выучить C++.
Итак, было решено написать свою IDE для NASM, в первую очередь для себя и может быть однокурсников.
Опыта написания GUI у меня до этого не было. После недолгих раздумий было решено использовать Qt — хороший бесплатный фреймворк, заодно и кроссплатформенный. Сначала был написан просто текстовый редактор с простой подсветкой, логом построения и окнами ввода/вывода. Гордо называемая «IDE» программа умела собирать текст, который был в текстовом редакторе и запускать построенную программу.
Затем я, немного подучив регулярные выражения, сделал красивую подсветку. Прикрутил отладчик (GDB). Добавил вкладки и всякие простые фичи в текстовом редакторе типа поиска и комментирования куска кода. Постепенно допиливал программу до более-менее нормального вида, исправлял ошибки.
Весной этого года SASM был включен в вышеописанный учебный курс, и первокурсники уже пользовались им. Недавно добавил в программу поддержку и других ассемблеров, кроме NASM — MASM, FASM и GAS.
Возможности

Во-первых, это просто редактор кода с подсветкой, вкладками и возможностями построения и выполнения программы. Возможен запуск в отдельном окне.
В логе указывается информация о времени работы программы. Есть 2 формы для ввода и вывода. Как я уже говорил, программа изначально предназначалась для сдачи контестов. Две последние возможности очень удобны для этого. Если все-таки понадобиться сохранить exe’шник, это можно сделать в меню «Файл».
Отладчик

Один из самых сложных компонентов в программе — это отладчик. Возможностей у него не так много, но некий минимальный основной набор есть: он показывает текущую строку, делает шаг с заходом, без захода, продолжает выполнение/приостанавливает программу, можно ставить брейкпоинты, смотреть регистры и память. Также для тех кому базовых возможностей все же не хватает снизу окна реализована командная строка для ввода произвольных команд для GDB.
Да, отладчик реализован на базе GDB. Сделать его было не очень просто из-за ограничений ассемблера. В частности, NASM не умеет генерировать нормальную отладочную информацию и приходится определять текущее местонахождение в программе, ставя в соответствие листинг, генерируемый ассемблером и текущий адрес в счетчике команд EIP.
Библиотека макросов для NASM
В SASM включена библиотека макросов для ввода/вывода «io.inc», используемая в курсе «Архитектура и язык ассемблера» и немного переписанная для отладки и поддержки 64-битного режима. Она очень удобна на начальных этапах обучения — позволяет выводить данные, не задумываясь о соглашениях и правилах вызова функций.
Например, чтобы вывести число содержащееся в регистре EAX, достаточно написать
PRINT_DEC 4, eax ; 4 — количество байт
section .data
format db «%d», 0
section .text
push eax
push format
call printf
add esp, 8
Команды, содержащиеся в «io.inc» можно найти в справке.
Опции

В настройках программы можно полностью настроить текстовый редактор — задать цветовую схему, выбрать шрифт, задать начальный текст.
Там же задается язык (доступны русский и английский).

Также в параметрах доступен выбор ассемблера (NASM, MASM, GAS или FASM) и разрядности (x86 или x64). Эти опции влияют на выбор программ — ассемблера и компоновщика, и опций для них. Также под новый ассемблер подстраивается подсветка и начальный текст. Пути и опции сборки можно задать и вручную.
Дополнительно
Программа содержит справку и примеры программ для каждого ассемблера — программы Hello World в папке Projects и начальные шаблоны, чтобы можно было сразу приступить к написанию кода.
На Windows все нужные для сборки программ компоненты уже включены в SASM. Программа работает «из коробки» — можно начинать программировать сразу же после запуска.
На Linux следует установить gcc, gdb и необходимый ассемблер.
Заключение
Больше информации о программе и исходники можно посмотреть по ссылкам выше. Качество кода в начале может быть не очень — только осваивал C++ и ООП, сразу на всякий случай прошу прощения.
Проект Open Source — так что, если вдруг кто-то хочет присоединиться и что-то поменять — Welcome!
Также буду рад отзывам, предложениям и сообщениям об ошибках. И конечно разумной критике, куда без нее.
Как называется программа отладчик ассемблера
В этой главе мы рассмотрим отладочные и дизассемблирующие программы, кроме трех наиболее известных, о которых пойдет речь в последующих двух главах.
Утилиты фирмы Microsoft
Название программы многообещающе, но в действительности программу нельзя назвать редактором. Основное ее предназначение — конвертировать OMF-формат объектных файлов в COFF-формат. Кроме того, данная утилита позволяет менять некоторые другие атрибуты исполняемых и объектных модулей. Если в командной строке данной программы указать имя объектного модуля, то, в случае если модуль будет в OMF-формате, он будет преобразован в COFF-формат. Рассмотрим ключи данной программы, которые можно применять как к исполняемым, так и к объектным модулям.
/BIND — позволяет указать пути к динамическим библиотекам, которые используют данный исполняемый модуль. Например,
EDITBIN /BIND:PATH=c:\edit;d:\dll EDIT.EXE.
/HEAP — изменяет размер кучи в байтах. Например,
EDITBIN /HEAP:100000,100000 (см. Опции программы LINK.EXE).
/LARGEADDRESSAWARE — указывает, что приложение оперирует адресами, большими 2 гигабайт.
/NOLOGO — подавляет вывод информации о программе.
/REBASE — устанавливает базовый адрес модуля. По умолчанию для исполняемого модуля базовый адрес равен 400000Н, для динамической библиотеки — 10000000H.
/RELEASE — устанавливает контрольную сумму в заголовке исполняемого модуля.
/SECTION — изменяет атрибуты секций исполняемого модуля. Полный формат опции /SECTION:name[=newname][,attributes][,alignment]
Значение атрибутов
| Атрибут | Значение |
|---|---|
| c | code |
| d | discardable |
| е | executable |
| i | initialized data |
| k | cached virtual memory |
| m | link remove |
| o | link info |
| p | paged virtual memory |
| r | read |
| s | shared |
| u | uninitialized data |
| w | write |
Значение опции выравнивания
| 1 | 1 |
| 2 | 2 |
| 4 | 4 |
| 8 | 8 |
| p | 16 |
| t | 32 |
| s | 64 |
| x | no alignment |
/STACK — изменяет значение требуемого для загружаемого модуля стека.
Например: EDITBIN /STACK:10000,10000 EDIT.EXE
/SUBSYSTEM — переопределяет подсистему, в которой работает данная программа.
Например, если программа оттранслирована с опцией /SUBSYSTEM:WINDOWS, можно изменить установку, не перекомпилируя ее. EDITBIN /SUBSYSTEM:CONSOLE EDIT.EXE.
/SWAPRUN — устанавливает для исполняемого модуля атрибут «помещать модуль в SWAP-файл».
/VERSION — устанавливает версию для исполняемого модуля.
/WS (/WS:AGGRESSIVE) — ycтaнaвливает атрибут AGGRESSIVE, который используется операционной системой Windows NT и Windows 2000.
Утилита весьма полезна для быстрого изменения атрибутов исполняемых и объектных модулей.
Программа используется для исследования загружаемых и объектных модулей COFF-формата и выводит информацию в текущую консоль. Ключи данной программы:
/ALL — выводит всю доступную информацию о модуле, кроме ассемблерного кода.
/ARCH — выводит содержимое секции .arch заголовка модуля.
/ARCHIVEMEMBERS — выводит минимальную информацию о элементах объектной библиотеки.
/DEPENDENTS — выводит имена динамических библиотек, откуда данным модулем импортируются функции.
/DIRECTIVES — выводит содержимое секции .drective, создаваемой компилятором (только для объектных модулей).
/DISASM — дизассемблирует содержимое секций модуля с использованием и символьной информации, если она присутствует там.
/EXPORTS — выдает все экспортируемые модулем имена.
/HEADER — выдает заголовки модуля и всех его секций. В случае объектной библиотеки выдает заголовки всех составляющих ее объектных модулей.
/IMPORTS — выдает все имена, импортируемые данным модулем.
/LINENUMBERS — выдает номера строк объектного модуля, если таковые имеются.
/LINKERMEMBER[:<1|2>] — выдает все имена в объектной библиотеке, определяемые как public.
/LINKERMEMBER:1 — в порядке следования объектных модулей в библиотеке.
/LINKERMEMBER:2 — вначале выдает смещение и индекс объектных модулей, а затем список имен в алфавитном порядке для каждого модуля.
/LINKERMEMBER — сочетание ключей 1 и 2.
/OUT — определяет, что вывод осуществляется не в консоль, а в файл (/OUT:ED.TXT).
/PDATA — выдает содержимое таблиц исключения.
/RAWDATA — выдает дамп каждой секции файла. Разновидности данного ключа: /RAWDATA:BYTE, /RAWDATA:SHORTS, /RAWDATA:LONGS, /RAWDATA:NONE, /RAWDATA:,number. Здесь number определяет ширину строк.
/SUMMARY — выдает минимальную информацию о секциях.
/SYMBOLS — выдает таблицу символов COFF-файла.
Рассматриваемая программа является весьма мощным средством дизассемблирования. Пусть программа называется prog.asm. Выполним трансляцию программы следующим образом.
При этом, кроме исполняемого модуля prog.exe, появляется еще и файл prog.pdb, содержащий отладочную информацию.
Выполним теперь команду DUMPBIN /DISASM /OUT:PROG.TXT PROG.EXE. В результате получим практически исходный ассемблерный код. Часть этого кода представлена на Рис. 4.2.1.
Рис. 4.2.1. Часть дизассемблированиого кода.
Как видите, это весьма прозрачный текст, ничем не отличающийся от обычного ассемблерного текста. В конце файла можно обнаружить довольно интересную информацию. Вот фрагмент.
В действительности, когда мы вызываем, например, функцию _LoadIconA@8, то на самом деле происходит переход на адрес, где стоит команда
- Повышение производительности здесь минимально.
- Транслятор TASM32 делает все несколько иначе.
Более подробно данный вопрос рассматривается в Главе 4.1.
Утилиты других производителей
Данная программа рассматривалась нами в гл. 1.1. Она во многом похожа на предыдущую программу DUMPBIN.EXE, но более удобна, хотя и обладает несколько меньшими возможностями.
Данная программа широко известна в среде программистов, скажем так, хакерского направления. Название программы происходит от фразы «Hacker’s View». Основная задача, которую выполняет данная программа — просматривать и редактировать загружаемые модули. Причем просмотр и редактирование допускается в трех вариантах: двоичный, текстовый и ассемблерный. Хороших дизассемблирующих программ создано довольно много, а вот программ, подобных данной, можно по пальцам перечесть.
Интерфейс программы весьма напоминает интерфейс редакторов таких программ, как FAR или Norton Commander (см. Рис. 4.2.2.). Все команды осуществляются при помощи функциональных клавиш с использованием клавиш «Alt» и «Ctrl». Например, нажимая клавишу F4, вы получаете возможность выбрать способ представления двоичного файла: текстовый, ассемблерный или двоичный. Нажимая клавишу F3 (при условии, если Вы находитесь в двоичном или ассемблерном просмотре), Вы получаете возможность редактировать файл. Если же, находясь в ассемблерном просмотре, Вы после F3 нажмете еще и F2, то сможете редактировать машинную команду в символьном виде. Мы не будем далее останавливаться на командах данной программы, поскольку они просты, очевидны и могут быть получены просто по F1, а перейдем сразу к простому примеру использования данной программы, хотя пример тематически и относится к материалу Гл. 4.6. Чтобы слишком не загромождать рассмотрение возьмем простую консольную программу.

Рис. 4.2.2. Внешний вид программы HIEW.EXE
Ниже (Рис. 4.2.3) представлена простая консольная программа, выводящая на экран текстовую строку.
Программа на Рис. 4.2.3 проста и корректна. Представьте теперь, что при отладке Вы случайно изменили одну команду: вместо JE поставили JNE. В результате поспе трансляции программа перестала работать. Можно исправить ее, не прибегая к ассемблерному тексту? Конечно. Для этого в начале ее следует дизассемблировать, найти ошибку, а потом воспользоваться программой HIEW.EXE. Вообще говоря, можно ограничиться только программой HIEW, так как она вполне корректно дизассемблирует. Однако мы нарочно проведем исправление в два этапа.
Дизассемблируем модуль при помощи программы DUMPBIN.EXE. Вот дизассемблированный текст программы (Рис. 4.2.4).
Рис. 4.2.4. Дизассемблированный код программы на Рис. 4.2.3.
По дизассемблированному коду легко обнаружить ошибку. Кстати, команду cmp eax,0FFh надо, естественно, понимать как cmp eax,0FFFFFFFFh. Запомним нужный код 83F8FF. Запускаем программу HIEW.EXE, нажимаем клавишу F7 и ищем нужное сочетание. Далее клавиша F3, затем F2 и далее — заменяем команду JNE на JE. Клавиша F9 закрепляет изменение. В результате мы исправили программу, не прибегая к ее перетрансляции.
Программа работает в командном режиме, но по сравнению, например, с DUMPBIN.EXE обладает рядом достоинств. Главное из этих достоинств — это распознавание языков высокого уровня. Кроме того, Вы сами можете писать скрипт-процедуры на предлагаемом макроязыке.
Один из самых мощных дизассемблеров. Возможности настолько велики, что многие программисты считают его всемогущим. Работая над текстом дизассемблируемой программы. Вы можете называть своими именами метки и процедуры, давать свои комментарии так, что дизассемблированный текст становится в конце концов ясным и понятным. Все сохраняется в специальную базу и при последующем запуске, естественно, восстанавливаются. Внешний вид дизассемблера IDA PRO показан на Рис. 4.2.4. Мы дизассемблировали одну из наших старых программ. Обратите, кстати, внимание на ссылку offset WNDPROC. Название WNDPROC дано уже нами в процессе анализа кода программы. Но рассмотрим все по порядку.

Рис. 4.2.4. Пример дизассемблирования программы с помощью самого мощного дизассемблера IDA PRO (под Windows).
Рассмотрим некоторые возможности этого дизассемблера.
1. Переименование процедур и меток в программе. При дизассемблировании IDA PRO дает, разумеется, свои названия процедурам и меткам. Вы можете ввести свои названия, тем самым сделав программу более понятной. Все изменения, сделанные в тексте, сохраняются в специальной базе и могут быть восстановлены при повторном запуске.
2. Распознавание библиотечных и API-функций (см. Рис. 4.2.4). Дизассемблер не просто распознает эти функции, но и комментирует параметры этих функций.
3. При помощи контекстного меню или двойного щелчка Вы можете перейти по команде JMP или команде CALL в указанное место программы и так продолжать осуществлять переходы любое количество раз. Возвратиться на любое количество шагов можно, используя кнопку «стрелка» на панели инструментов.
4. При помощи Shift+Ins, Ins, а так же пунктов меню «EDIT» в любом месте программы можно записать комментарий. Комментарий, как и введенные названия меток, запоминается в базе данных программы. Но это еще не самое приятное. В комментарии может присутствовать адрес строки программы или имя метки. Если сделать двойной щелчок по адресу или метке, то мы как раз и очутимся на этом месте.
5. Сворачивание и разворачивание процедур. При помощи клавиши «-» на дополнительной клавиатуре можно свернуть процедуру, а при помощи «+» развернуть процедуру. Представление процедур в свернутом виде позволяет представить программу в более компактном и более понятном виде.
6. IDA PRO весьма аккуратно распознает не только код, но и данные. На Рис. 4.2.5 показана дизассемблированная часть нашей программы, содержащей данные.
7. Создание и выполнение командных файлов. Язык командных файлов очень близок к языку Си. У меня нет намерения рассказывать о языке, который использует IDA PRO, приведу только один такой командный файл, содержащийся в пакете IDA PRO.

Рис. 4.2.5. Часть программы, содержащей данные, дизассемблированная при помощи IDA PRO.
Рис. 4.2.6. Пример командного файла IDA PRO.
Прокомментируем программу на Рис. 4.2.6. Как легко догадаться, организация цикла и условные конструкции имеют в точности тот же синтаксис, что и в языке Си. Главное здесь — разобрать смысл используемых библиотечных функций. Легко видеть, что функция Message просто выводит строку в окно сообщений, которое находится под основным окном. Функция ChooseFunction вызывает окно, которое вызывается также из меню: «Jump to Function». Функция GetFunctionFlags возвращает информацию об указанной функции. Наконец функция NextFunction осуществляет переход на следующую функцию. Она возвращает адрес функции. Аргументом же ее является адрес функции, от которой осуществляется переход на следующую функцию. Оставляю Вам изучение командного языка, поддерживаемого IDA PRO, который представлен в помощи программы.
Теоретически можно написать любую сколь угодно сложную программу по анализу дизассемблированного кода.
8. Программа IDA PRO осуществляет дизассемблирование модулей самых различных форматов: .OBJ, .EXE, .DLL, VXD, .ZIP, .NLM и др.
9. Функциональность IDA PRO может быть значительно усилена посредством подключаемых модулей — plugin’ов. Подключаемые модули пишутся на языке C++ и имеют структуру РЕ-модулей. Подключение модулей осуществляется через горячие клавиши или через пункты меню Edit\Plugins. Подключаемые модули находятся в специальном каталоге Plugins, где находится и файл конфигурации, где указаны эти модули.
10. Еще одна приятная особенность дизассемблера — он создает ассемблерный файл, с которым затем можно работать уже в текстовом режиме.
Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий
Введение в отладчик OllyDbg
Как сам писал автор, Олег Юшук, “OllyDbg это 32-битный отладчик на уровне ассемблера под операционную систему Windows. Его функционал заточенный под работу с бинарным кодом делает этот отладчик чрезвычайно полезным в случае, когда необходимо отладить программу без доступа к ее исходному коду.” Олли это также динамический отладчик. Это значит, что она позволяет пользователю менять код программы прямо по-ходу исполнения. Это очень важно, в случаях когда мы экспериментируем с бинарником, пытаясь понять как тот работает. Помимо этого, Олли обладает множеством полезных функций, что делает ее одним из лучших отладчиков для реверс-инжиниринга (мы сейчас не говорим об отладке на уровне ядра).
Описание
Вот картинка основного окна Олли:

Как видно, основное окно CPU разбито на четыре части: Disassembly (дизассемблер), Registers (регистры), Stack (стек) и Dump (дамп). Ниже будет представлено описание каждой секции.
1. Disassembly (дизассемблер)
В этой секции находится дизассемблированный код загруженного в Олли бинарника. Тут отображаются команды в бинарном виде и в виде ассемблерных инструкций. Первая колонка содержит адрес в памяти соответствующей инструкции. Вторая колонка – это то, что называют опкоды (операционные коды) – в языке ассемлера каждая инструкция соответствует как минимум одному коду (или нескольким). Это тот код, который непосредственно понимает и исполняет процессор. Эти опкоды образуют машинный язык, язык компьютера. Если бы вы посмотрели на исполняемый файл через хекс-редактор вы бы увидели набор этих кодов и ничего больше. Одна из основных задач Олли переводить этот машинный язык в форму, более понятную человеку – в язык ассемблера. Третья колонка как раз и отображает команды в формате языка ассемблера.
Возможно, тому, кто не знает ассемблера эти команды кажутся такими же непонятными как машинный код, но по мере практики становится понятно, что язык ассемблера гораздо проще для восприятия и понимания, чем сырой машинный код.
Последняя колонка это комментарии, оставленные Олли. Иногда они могут содержать имя вызываемой API-функции (если Олли смогла ее определить), например CreateWindow или GetDlgItemX. Олли также пытается помочь нам в понимании кода, давая имена функциям, которые не являются API-функциями. Например на картинке выше, видно вызовы функций с именами “ImageRed.00510C84″ и “ImageRed.00510BF4″.
Может быть это и не очень-то говорящие имена, но в процессе анализа мы можем понять, что делает та или иная функция и дать ей более осмысленное имя. В этой колонке мы может также писать свои комментарии. Для этого нужно дважды щелкнуть по одной из линий на этой колонке и высветится окно, куда свой комментарий и необходимо ввести. Эти комментарии сохранятся автоматически, и будут отображаться и в следующие разы.
2. Register (регистры)
Каждый процессор обладает набором регистров. Регистры представляют собой временные хранилища информации, что-то вроде переменной в высокоуровневых языках программирования. Вот более детальный вид окна регистров:

На самом верху вы видим непосредственно регистры процессора. Регистры поменяют свой цвет с черного на красный, если они были изменены в результате выполнения предыдущей команды. Можно также дважды кликнуть по какому либо регистру и понять его значение самому. Регистры широко используются для различных целей, как мы увидим в будущем.
Средняя секция содержит так называемые флаги, которые меняют свое значение в результате определенных операций (например при сравнение двух чисел: если они равны тогда во флаг записывается единица, нет – то ноль). Они тоже играют важную роль.
Последняя секция содержит FPU-регистры или регистры математического сопроцессора.
Они используются, когда процессор проводит операции над вещественными числами. В процессе реверс-инжиниринга не так часто приходится с ними сталкиваться, в основном когда имеешь дело с шифрованием.
3. Stack (стек)

Стек – это секция памяти зарезервированная для хранения временного списка данных. Эти данные включают в себя указатели к адресам в памяти, строки, переменные и, очень важно, адреса возвратов – места в программе куда необходимо вернуться после выполнения функции. Когда в программе в каком-либо месте вызывается какая-либо функция мы передаем этой функции управление, что бы она могла выполнить то, что нужно. Но в конце это функции необходимо вернуться туда, откуда он была вызвана и продолжить дальше исполнять следующие команды. Для этого и нужен адрес возврата.
Вещь, которую нужно знать о стеке это то, что это структура, работающая по принципу “первый вошел – последний вышел”. Представьте себе стопку листов. Мы можем либо положить на эту стопку еще один лист, либо снять верхний. Что бы добраться например, до четвертого листа сверху, нам необходимо перед этим снять три листа, которые выше него. Так, в общих чертах, и работает стек.
На этой картинке, первый столбец это адрес в памяти каждого элемента, второй столбец – это шестнадцатеричный код – значение, которое хранятся в стеке и последний столбец это комментарии Олли, о каждом элементе – то что он смогла установить. Например, на картинке напротив верхнего элемента стека стоит комментарий “RETURN to kernel…” Это адрес, который процессор расположил на стеке, что бы знать куда вернуться, когда текущая функция будет исполнена.
Если мы захотим изменить какой-либо элемент стека, нужно кликнуть по нему правой кнопкой мыши и в открывшемся меню выбрать пункт “modify”.
4. Dump (дамп)

Раннее в этом туториале, когда мы говорили о “сырых” опкодах которые процессор непосредственно считывает и исполняет, я упомянул, что мы может посмотреть эти коды в хекс-редакторе. Секция Dump в Олли как раз и предсталяет собой простой встроенный хекс-редатор. В нем мы можем посмотреть на сырой код программы, расположенный в оперативной памяти. Помимо шестнадцатеричных кодов, тут также можно увидеть символы, которые соответствуют тем или иным кодам, согласно ASCII. Итак, первая колонка в окне секции Dump – это адреса в памяти, вторая – сырой бинарный код, представленный в шестнадцатеричном формате, третья – символы.
Тулбар
Давайте теперь рассмотрим тулбар, который предоставляет нам Олли

Здесь расположены основные функции для запуска кода. Имейте также ввиду, особенно если вы новичек, все эти кнопки дублируются в вернем выпадающем меню в разделе “Debug”, так что если вы не уверены что означает та или иная кнопка – можете посмотреть там.
Я сделаю несколько заметок об функциях некоторых кнопок. “Re-load” означает перезапуск приложения с последующей остановкой на точке входа. Все изменения, внесенные вами в код, будут удалены, некоторые брейкпоинты (точки останова) будут отключены и приложение прервет исполнение кода. “Run” и “Pause” делают то, что следует из их названия. “Run” – запускает исполнение кода, “Pause” – временно останавливает, с возможностью потом продолжить с этого момента. “Step In” означает выполнить одну строчку кода и затем остановиться. Если этой строчкой кода является вызов функции, то мы переходим внутрь этой функции. “Step Over” делает тоже самое, но не заходит внутрь функций, а исполняет их целиком за один раз. “Animate” это тоже самое как постоянно жать “Step-In” или “Step-Over” но делать это достаточно медленно, чтобы успевать самому видеть ход исполнения. Эта функция не так часто используется, но бывает интересно посмотреть за ходом исполнения кода, особенно в случаях когда мы имеем дело с самомодифицирующемся кодом и можем вживую наблюдать за его изменениями. Похоже, я забежал слишком вперед.
Рассмотрим теперь иконки для управления окнами:

Каждая из этих иконок открывает окно, некоторые из которых пользуются часто, некоторые – редко. Что бы лучше самому с ними разобраться можно просто покликать на все подряд и посмотреть какое окно, открывает каждая кнопка. Каждая эта кнопка дублируется в верхнем выпадающем меню в разделе “View”, так что можете также заглянуть туда. Давайте пройдемся по нескольким основным окнам прямо сейчас.
1. (M)emory (память)

Окно “Memory” отображает все блоки памяти, выделенные программой. Это включает основные секции запущенного приложения (в данном случае “Showstr” в столбце “Owner”). Ниже вы также можете видеть множество других секций – это DLL, который программа загрузила в память и планирует использовать. Если дважды кликнуть по какой либо из этих строчек, откроется окно показывающее дизассемблированный код (или просто шестандцатеричный дамп) этой секции. Это окно также показывает тип каждого из блоков, права доступа, размер и адрес в памяти, где эта секция загружена.
2. (P)atches (патчи)

Это окно отображает все патчи, которые вы сделали. Патч означает изменение в коде. Заметьте, что в столбце “State” отображается значение “Active”. Это означает, что все изменения, сделанные в коде, актуальны на данный момент. Если вы перезапустите приложение, кликнув на “Re-load”, все изменения сбросятся и в столбе “State” напротив каждого сделанного вами патча появится значение “Disabled”. Вы также можете активировать-деактивировать патчи если кликните на выбранный вами патч, удерживая кнопку пробела. С столбце “Old” отображается оригинальная строчка кода, в стобце “New” – измененная.
3. (B)reakpoints (точки останова)

В этом окне отображены все поставленные вами брейкпоинты. Как мы увидим дальше это окно часто используется при отладке.
4. (K)all Stack (вызовы в стеке)
Как видно, автор программы выбрал не совсем верную букву для этой иконки, т.к. английское слово Call вообще-то начинается с “C” 🙂

Это окно отличается от того стека, который мы видели ранее. Оно дает гораздо больше информации о вызовах, сделанных в коде программы, значениях которые передаются вызванным функциям, и много чего еще.
В следующем туториале я выложу свою “прокаченную” версию Олли с расширенным функционалом:

Контекстное меню
В завершении я бы хотел также быстро представить контекстное меню Олли, которое открывается при клике левой кнопкой мыши. Оно предоставляет довольно много полезных функций, так что не плохо было бы с ним ознакомится. Если мы кликнем правой кнопкой мыши в секции дизассемблера мы увидим следующее:

Я пройдусь по самым часто-используемым функциям, с остальными вы разберетесь сами, по мере накопления опыта.
“Binary” – редактирование бинарных данных побайтого. Это место где вы можете изменить строчку “Не зарегистрировано” на “Зарегистрировано” 🙂
“Breikpoints” – установка брейкпоитов (точек останова) на какую-либо строчку кода. Существует несколько типов брейкпоинтов, мы подробнее рассмотри их в следующем туториале.
“Search for” предоставляет функции по поиску данных в бинарнике, таких как строки, вызовы функций и т.д.
“Analysis” заставляет Олли заново провести процесс анализ кода, с которым вы сейчас работаете. Иногда Олли затрудняется отличить код от данных (т.к. с точки зрения процессора это все лишь набор битов), и эта функция заставляет Олли учитывать то, в каком месте кода вы сейчас находитесь и попытаться понять, как эта секция должна будет выглядеть.
Также обратите внимание, что мое меню немного отличается от вашего, т.к. я установил себе некоторые плагины, которые добавляют в Олли определенный функционал. Я подробнее расскажу об этом в дальнейшем.
Лучшие инструменты пентестера: отладчики и дизассемблеры

У каждого из команды ][ — свои предпочтения по части софта и утилит для
пентеста. Посовещавшись, выяснилось, что выбор так разнится, что можно составить
настоящий джентльменский набор из проверенных программ. На том и решили. Чтобы
не делать сборную солянку, весь список мы разбили на темы. Сегодня мы разберем
отладчики и дизасемблеры — все, что понадобится для реверсинга приложений.
OllyDbg
Если ты хоть раз читал статьи о крякинге или, например, смотрел видеоуроки от
нашего реверсера Cr@wler’а, то имя "Ольки" тебе должны быть знакомо. Это
32-битный отладчик работающий на ring-3 с продуманным интерфейсом и полезными
функциями, которые существенным образом облегчают процесс отладки. В OllyDBG
встроен специальный анализатор, которые распознает и визуально обозначает
процедуры, циклы, константы и строки, внедренные в код, обращение к функциям API,
параметры этих функции и т.п. Для новичка (и не только) — это именно то, что
надо! В ходу до сих пор находится версия 1.10, а бета-версия второй ветки еще с
марта не претерпела изменений, однако уже сейчас можно оценить многочисленные
нововведения дебаггера. Работа ведется уже давно, и поэтому разработчику уже
есть что показать (прежде всего новый движок). Бету едва ли можно рассматривать
как основной инструмент для серьезных дел, поэтому спешу предупредить: о
стабильности нового движка пока приходится только мечтать, поэтому используй "бетку"
на свой страх и риск.
Тут надо сказать, что стал OllyDbg стандартным user-land отладчиком, взятым
на вооружение хакерами и они тут же захотели его улучшить. Появилось множество
нестандартных сборок: одни фиксят ошибки Ольги, другие расширяют функционал,
третьи – скрывают ее от протекторов. Недостаток — "движок" отладчика работает
через MS Debugging API, страдающий кучей врожденных ограничений, оставляющий за
собой множество трудноудаляемых следов и представляющий легкую мишень для
антиотладочных технологий.
Immunity Debugger
Известный мод одноименной фирмы, специализирующейся на безопасности и
скрестившей Ольгу 1.10 с Питоном – интерпретируемым языком, на котором очень
легко и быстро писать скрипты. Конечно, писать их можно прямо в Ольге, но это не
слишком удобно, все приходится делать вручную и решать типовые задачи (типа
поиска в памяти), которые уже давно решены.
В Immunity Debugger входит множество библиотек, написанных на Питоне и
заточенных под хакерские нужды. Библиотеки вызываются из Питоновых программ,
среди которых значится и searchcrypt.py – отличное средство идентификации
следующих криптографических алгоритмов: AES, BLOWFISH, CAMELLIA, CAST, MD5, RC2,
RC5, RIPEMD160, SHA1, SHA256, SHA512.
Immunity Debugger используют многие специалисты по безопасности,
выкладывающие proof-of-concept expolit’ы, написанные на Питоне и предназначенные
для работы исключительно в среде данного отладчика. И хотя хакер с головой
разберется в алгоритме работы exploit’а и без Immunity Debugger’а, портируя
exploit на любой другой язык, рано или поздно отладчик оказывается на
компьютере, зачастую становясь основным инструментом, вытесняющим Ольгу.
Популярный и очень мощный мод, основанный на Ольге 1.10 и собравший в своем
дистрибутиве огромное количество плагинов, скриптов, а также кучу других
полезных инструментов. В отличие от Immunity Debugger’а, ориентированного на
специалистов по безопасности, YDbg писался хакерами и для хакеров, ломающих
защиты с протекторами (те активно сопротивляются такому положению дел и
напичканы анти-отладочными приемами, распознающими присутствие Ольги по главному
окну с ее именем и пунктам меню). Поэтому первое, что бросается в глаза при
запуске YDbg (исполняемый файл которого переименован из OLLYDBG.EXE в SND.exe),
это "покореженные" пункты меню. В частности, "Memory" превратилось в "M3m0ry", "SEH
chain" в "S3H chain", "Breakpoints" в "Br3akp01nts" и т. д. Словом, все
"хакерские" пункты изменены – попробуй их найти (естественно, в новых версиях
протекторов наверняка появится детекция YDbg, но пока он успешно скрывается от
кучи защит, палящих Ольгу). В состав дистрибутива YDbg входит 36 популярных
плагинов (и не нужно теперь рыскать по Сети в их поисках). Среди них затесался
настоящий бриллиант – IDA Sigs, название которого говорит само за себя. Да-да!
Это плагин, поддерживающий IDA-сигнатуры и отображающий их в виде комментариев к
вызываемым функциям в Ольге или в YDbg. Другой полезный плагин – red-hawk
("красный ястреб") представляет собой панельку инструментов, позволяющую, в
частности, одним движением мыши установить точки останова на нужные функции
(например, в Visual Basic’е это что-то типа __vbaStrCmp или __vbaStrCopy,
используемые для сравнения и копирования строк, соответственно). Начинающие
хакеры просто визжат от восторга, поскольку красный ястреб фактически является
учебником по взлому, а так попробуй догадаться, что нужно делать! Каталог \SCRIPT
содержит 637 скриптов, главным образом предназначенных для снятия различных
протекторов/упаковщиков исполняемых файлов и автоматизации всяких рутинных дел.
SoftICE
Всем известный (даже тем, кто к крякингу даже близко не подходил) отладчик
для Windows, работающий дна уровне ядра. В отличие от прикладного отладчика, как
например OllyDbg, SoftICE способен приостановить все операции в Windows, что
очень важно для отладки драйверов. Работает в обход MS Debugging API, что
значительно усложняет антиотладку, однако, учитывая, что для разработчиков защит
soft-ice – враг номер один, практически все протекторы легко распознают его
присутствие в системе. Поэтому никак не обойтись без специальных расширений
(которые упомянем дальше). SoftICE был первоначально разработан компанией NuMega,
которая включала его в пакет программ для быстрой разработки
высокопроизводительных драйверов под названием Driver Studio, который
впоследствии был приобретён Compuware. Помнишь, сколько всевозможных мануалов
было по поводу установки Soft-Ice’а под Windows XP? Увы, начиная с висты,
отладчик не работает. Разработчики приостановили разработку в апреле 2006 года.
На официальном сайте его не найти и доступен только на торрентах.
Microsoft Debugger
Входит в состав WDK (Windows Driver Kit — бывший Driver Development Kit или
DDK), а также в комплект Debugging Tools. Оба они бесплатны, но WDK намного
больше по объему и требует предварительной регистрации для получения Windows
Live ID, в то время как Debugging Tools раздается без регистрации вместе с SDK,
в которую входит документация, заголовочные файлы, библиотеки и несколько
примеров, как надо писать плагины.
Microsoft Debugger может работать как на прикладном уровне (ring-3), так и на
уровне ядра. Вплоть до XP ядерная отладка требовала, как минимум, двух машин,
соединенных COM-шнурком, но теперь достаточно и одной.
Поставляется в двух редакциях: windbg.exe – графический интерфейс и cdb.exe —
интерфейс командой строки. И та и другая являются лишь тонкими обертками вокруг
dbgeng.dll, в которой, собственно, и реализован основной отладочный "движок",
документированный протокол обмена. Поэтому, чтобы в очередной раз не писать
трассер с нуля, dbgeng.dll можно использовать в качестве "фундамента" при
написании универсальных распаковщиков исполняемых файлов.
Syser Kernel Debugger
Достойных отладчиков ядра всего три: SoftICE, Syser и Microsoft Kernel
Debugger, но SoftICE не работает на Висте и Server 2008, а Microsoft Kernel
Debugger – для хакерских целей не самый лучший вариант. Остается Syser, который
хакеры взяли на вооружение и весьма активно используют. Написан он двумя
предприимчивыми китайскими реверсерами Wu YanFeng и Chen JunHao. По сути, Syser
— отладчик уровня ядра с графическим оконным интерфейсом. Позволяет отлаживать
как приложения, так и драйвера. Сочетает в себе функции IDA Pro, Softice и
Ollydbg. Поддерживает подсветку листинга дизассеблера, динамическую загрузку и
выгрузку, все команды отладчика SoftICE, полноценную работу с юникодом и
многопроцессорными системами. Проработаны многие мелочи: например корректно
работает буфер обмена, позволяющий копировать данные из уровня Ring 3 в уровень
Ring 0. Многие из операций можно автоматизировать с помощью скриптов. Надо
сказать, что Syser — преемник SoftICE, из которого, как говорят, были дернуты
целые модули. У него масса преимуществ, как, впрочем, масса недостатков, поэтому
реально его приходится юзать совместно с Microsoft Kernel Debugger.
GNU Debugger – основной отладчик под UNIX, ориентированный на совершенно иной
тип мышления, чем все вышеперечисленные отладчики. Это не просто интерактивный
отладчик, скорее это станок с программным управлением, гибким и мощным
интерфейсом. Отлаживать с его помощью "честные" программы — одно удовольствие,
но в плане антиотладки дела обстоят плохо. GDB даже не пытается сопротивляться и
работает через библиотеку ptrace (которая на самом деле никакая не библиотека, а
системный вызов). GDB принципиально неспособен отлаживать программы, которые не
хотят, чтобы их отлаживали. А такие программы мало-помалу начинают появляться.
Естественно, помимо GDB существуют и другие отладчики для никсов, например,
Lin-Ice, но поскольку антиотладочные технологии под UNIX только-только начинают
развиваться, в большинстве случаев вполне сгодиться и GDB.
IDA Pro
IDA Pro — это одновременно интерактивный дизассемблер и отладчик. Она
позволяет превратить бинарный код программы в ассемблерный текст, который может
быть применен для анализа работы программы. Правда, стоит сказать, что
встроенный ring-3 отладчик довольно примитивен. Он работает через MS Debugging
API (в NT) и через библиотеку ptrace (в UNIX), что делает его легкой добычей для
защитных механизмов. Но зато IDA Pro — интерактивный дизассемблер более чем с
десятилетней историей, первая версия которой увидела свет 6 мая 1991 года. Юрий
Харон вместе с Ильфаком начали работать в том направлении, куда еще никто не
вкладывал деньги. До этого дизассемблеры писались исключительно на пионерском
энтузиазме параллельно с изучением ассемблера и довольно быстро забрасывались.
Стоит ли удивляться, что парням удалось решить практически все фундаментальные
проблемы дизассемблирования, над которыми просто не хотели работать остальные
разработчики, зная, что быстрой отдачи не будет и проект потребует десятилетий
упорного труда. К пятой версии IDA Pro имела в своем арсенале все необходимое
для автоматической декомпиляции, причем не просто декомпиляции, а очень
качественной декомпиляции. На текущй момент последний резиз 5.5 от 12 июня.
Влюбленные в продукт пользователи генерят немало полезных плагинов, в том числе
поддерживающих разные скриптовые языки для написания сценариев в дополнение к
встроенному IDC. Например,
IdaRUB
добавляет поддержку Ruby, а
IDAPython — Python.
Тут надо сказать, что начиная с версии 5.4 IDAPython идет предустановленной в
дистрибутивы ИДЫ.
Hex-Rays
Дальше разработчики подумали и решили, что уж раз смогли получить
человеческий код на ассемблере, то неплохо дописать еще одну фичу, переводящую
китайскую ассемблерную грамоту в доступный и понятный листинг на языке Си.
Закипела напряженная работа, по ходу которой выявлялись все новые и новые
подводные камни, обход которых требовал времени, усилий и мозговой активности. В
итоге на свет появился
Hex-Rays — декомпилятор, требующий обязательно установленную на компьютеру
ИДУ. Декомпилятору подается на вход бинарник, указывается ряд параметров, после
чего Hex-Rays выплевывает исходник на чистом C — в большинстве своем понятный и
доступный. Правда, спешить компилировать его обратно в бинарник не стоит, потому
как в большинстве случаев в момент компиляции ты увидишь столько ошибок, сколько
еще не видывал. Одна из причин — отсутствие поддержки в Hex-Rays ресурсов.
W32DASM
Отличный дизассемблер, удобный и понятный. Набор функций с точки зрения
профессионала довольно ограничен, да и вообще его пора отнести к инструментам из
прошлого века, но нет. W32DASM выдает хороший листинг, и для новичков является
отличным вариантом понять и разобраться, что к чему. К тому же именно на него
опираются в многочисленных мануалов для новичков, в том числе нашим манулом для
начинающих "Крякинг — это просто" (#80
номер ][).
Начинающие хакеры обычно испытывают большие трудности при взломе программ,
написанных на Delphi и Builder, поскольку классические трюки, типа бряка на
GetWindowTextA, не работают. Для декомпиляции кода, написанного на Delphi/Borland
C++ Builder, т.е программ, которые используют библиотеку VCL от Borland, нужен
специальный подход, и он реализован в утилите DeDe. По сути, это единственный
работающий декомпилятор для Delphi-программ, которые не смотря ни на что никак
не умирают. DaFixer, автор проекта, к сожалению, забросил заниматься своим
детищем, поэтому официальной страницы у проекта в настоящий момент нет.
Подробнее о том, как совладать с программами на Delphi, читай в статье "Взлом
Борландии: изящная декомпиляция Delphi".
Любой коммерческий продукт должен быть достаточно хорошо защищен.
Разработчики намеренно использует разного рода упаковщики и так называемые
протекторы, которые применяют разного рода антиотладочные средства, максимально
препятствующие взлому программы. Обойти их можно, но для этого нужно четко
представлять, что использовалось для защиты программы, какой плагин для
отладчика использовать — и от этого "крутиться". Изящно определить название и
версию упаковщик способна небольшая утилита PEiD. Собственно, для этого она и
нужна.
PE Explorer
Программа для просмотра и редактирования PE-файлов — начиная с EXE, DLL и
ActiveX контролов, и заканчивая скринсейвверами SCR (Screensavers), апплетами
панели управления CPL, SYS и бинарниками для платформы Windows Mobile. По сути,
это не одна утилита, а целый набор тулз для того, чтобы посмотреть изнутри, как
работает программа или библиотека. Включает в себя просмотрщик заголовков,
экспорт вызовов API-функций, редактор ресурсов, дизассемблер.