Отправляет email-рассылки с помощью сервиса Sendsay

Assembler - Просто и Эффективно.

  Все выпуски  

Assembler - Просто и Эффективно. Глава #8 - Использование отладчика.


Assembler

Глава #8 - Отладка

  Отладка программ.
Отладчик (Debugger) - это программа, позволяющая увидеть ход выполнения отлаживаемой программы, менять содержимое регистров, памяти и т.д в процессе выполнения. Используется для исследования алгоритма работы программ, обнаружения ошибок. Под отладчиком можно увидеть результат выполнения команд процессора, функций ОС, что, вместе с документацией, очень полезно для обучения Assembler'у. Хорошое владение отладчиком особо необходимо начинающему программисту, т.к большую часть времени создания программы будет занимать ее отладка.
   -------------------------------

  Типы отладчиков.
Существуют следующие основные типы отладчиков:
  • Ring3 отладчик: Отладчики этого типа, как правило, входят в пакет с компилятором. Представляют из себя обычную прикладную программу. Обладают очень ограниченной функциональностью. Позволяют отлаживать только прикладные программы. В TASM - TD (Turbo Debugger), В MASM - CodeView.
  • Ring0 отладчик: Отладчики этого типа являются Ring0 драйверами ОС, поэтому имеют неограниченные возможности по управлению компьютером (доступ к памяти, регистрам, портам ввода-вывода и т.д). Позволяют отлаживать всё: прикладные программы, драйверы и т.д. Лучшими считаются SoftICE и KD.
   -------------------------------

  Отладчик SoftICE
Наиболее часто используемым является отладчик SoftICE, поэтому рассмотрим его использование подробнее.
Версия отладчика должна быть совместима с версией вашей ОС.
После установки отладчик всегда загружен, и его можно вызвать, нажав Ctrl+D.
   -------------------------------

  Внешний вид
Снизу отображается окно команд / информации (Shift - прокрутка). Остальное место занимают окна:
  • регистров (wr, Alt+R) - отображает регистры и флаги
  • данных (wd, Alt+D) - отображает данные.
  • кода (wc, Alt+C)
  • регистров FPU (wf)
  • Watch (ww, Alt+W) см команду watch
  • локальных переменных (wl, Alt+L)
  • и другие
   -------------------------------

  Начало отладки.
Для начала отладки Win32 приложения, возможно загрузить его при помощи программы Symbol Loader.
Программу Win16/DOS можно загрузить при помощи Wldr.exe/Dldr.exe из папки Util16 с отладчиком.
Если отладчику указывалась команда i3here on, отладка начнется при выполнении инструкции int 3. Добавьте эту инструкцию в исходный код в местах, где требуется отладка и просто запустите программу.
Вместо команды int 3 можно использовать функцию Windows: DebugBreak.
Иногда для начала отладки программ, устанвливают BreakPoint на какую-нибудь используемую программой внешнюю ф-цию.
   -------------------------------

  Стандартные сочетания клавиш:
Ctrl+DПоказать/ скрыть отладчик
F1Справка
F4rs
F7Выполнить до положения курсора
F8Выполнить инструкцию, с заходом в процедуры, loop
F9BreakPoint на инструкции под курсором
F10Выполнить инструкцию без захода в процедуры.
F12Выход из процедуры

   -------------------------------

  Настройка
Для настройки отладчика SoftICE, можно использовать программу Symbol Loader->Edit->SoftICE Initialization settings.
  • General->Initialization string обычно имеет следующий вид: faults off;i3here on;code on;X; lines к-во строк;wc к-во строк;wd к-во строк;
  • Вкладка Exports содержит имена библиотек, экспортируемые функции которых отладчик воспринимает при использвании выражений.
  • Соответствие сочетаний клавиш командам отладчика можно указать на вкладке Keyboard Mappings
Параметры записываются в файл SystemRoot\System32\Drivers\Winice.dat
Для сохранения/восстановления настроек достаточно его скопировать.
   -------------------------------

  Команды
Отладчик SoftICE управляется командами, вводимыми в окне команд, либо выполняемыми другими способами. Описание команд находится в документации. Справку по командам можно получить, используя команду h или help. Также, при вводе команды нижняя строчка окна отображает краткую информацию.
Ниже приведен список наиболее часто используемых команд для отладки прикладных программ.
Подробное их описание, и примеры использования смотрите в справке к отладчику.
  • Список однименных объектов можно получить при помощи команд: class, hwnd, proc, thread, mod. для отображения свойств конкретного объекта используется ключ -x и другие. Список экспортируемых функций- команда exp
  • Для присваивания регистру/ флагу значения используется команда r Пример: r eax dl - присвоить eax значение dl r fl z+a-c инверсия ZF, установка AF, сброс CF
  • Команды p, t и here используются для трассировки.
  • Для работы с памятью используются команды c, e, f, m, s. Для отображения данных - группа db, dw, dd ... Для работы с окном данных - dex, data и format. Для записи команд процессора в память используется команда a
  • При помощи команды macro можно создать макрос - новую команду, состоящую из нескольких существующих.
  • Для выхода из отладчика можно использвать команду x, для настройки параметров отображения- lines, width, code. cls - очистить окно информации, rs - временно убрать окно отладчика, u - дизассемблировать инструкции по указанному адресу, . - по текущему.
   -------------------------------

  Выражения:
Выражения могут использоватся везде, где необходимо указать число. Для выполнения выражений используется команда ? Числа, указываемые в отладчике считаются шестнадцатиричными (dword).
  • Для указания десятичного числа, поставьте перед ним знак + или -.
    Пример: +10
  • Для задания другого типа используйте операторы byte и word.
    Пример: byte(+123)
  • Для указания текстовых строк, используйте кавычки.
  • Для указания адреса, используется оператор @, * или . Аналогично выражению Assembler'а в кавадратных скобках.
    Пример: @(esp+4), *(esp+4) или esp.4
Арифметические / логические операторы имеют стиль языка "C"

В выражениях используются:
  • некоторые имена из отладочных символов
  • экспортируемые функции указынных в настройках модулей
    Пример: MessageBoxA -адрес ф-ции, user32!MessageBoxA - адрес ф-ции с указанием бибилотеки.
  • имена регистров
  • флаги. обозначаютя как: буква флагаfl Пример: cfl означает CF
  • некоторые специальные символы. Например, символы pid и tid означают ID текущего процесса/потока, process, thread - их KPEB/KTEB. bpindex равен номеру сработавшей контрольной точки.
   -------------------------------

  BreakPoint (Контрольная точка)
Отладчик позволяет установить контрольные точки, при срабатывании которых открывается отладчик, позволяя начать отладку.
Установка контрольных точек:
bmsgBreakPoint на сообщения окну.
bpmBreakPoint на доступ к памяти.
bpxисполнение инструкций.
gBreakPoint, удаляемый при появлении отладчика

Режимы работы отладчика (значения on или off)
i3hereвкл/выкл отладку по int 3
i1hereвкл/выкл отладку по int 1
faultsвкл/выкл отладку по ошибке программ

Управление контрольными точками:
zapзаменить команду int 3 по адресу eip-1 или int 1 по eip-2 на nop
bcУдалить
bdДеактивировать
beАктивировать
blСписок
bpeРедактировать
bptновый на основе существующего
bhистория (кнопки вверх, вниз, insert, esc, enter)
bstatстатистика

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

Пример:
Откройте окошко отладчика, введите команду: bpx MessageBoxA - установить BreakPoint на функцию MessageBoxA. Команда BL покажет, что созданная контрольная точка имеет номер 0.

Когда какая-нибудь программа вызовет эту функцию, то появится отладчик.
Т.к MessageBoxA - процедура stdcall, то параметры передаются через стэк.
Введите команду dd esp для отображения содержимого стэка. Вы увидите адрес возврата, и 4 переданных параметра. Для просмотра/редактирования текста/заголовка сообщения MessageBox, используйте команды db esp.8 и db esp.c

Контрольные точки bpx,bpm,bmsg поддерживают указание дополнительных условий, при которых начнется отладка. Например, для того, чтобы отладчик реагировал только на вызов MessageBox из определенного процесса, действуйте так:
  • Введите команду proc, и узнайте ID процесса, который хотите отладить.
  • Введите команду bpx MessageBoxA if pid==ID нужного процесса.
Отладчик позволяет задать команды, выполняемые при срабатывании контрольной точки.
Пример: следующая команда перехватит функцию MessageBoxA, проверит, есть ли иконка у сообщения (биты 7-4 параметра #4), и если нет, то установит иконку MB_ICONASTERISK (40h):
bpx MessageBoxA if (esp.10&70)==0 do "e (esp+10) esp.10|40;x"
При выполнении модификации параметра, вы заметите, как окно отладчика появится, и сразу скроется. Блок do можно использовать без блока if

Запуская разные программы, выдающие MessageBox с установленным BreakPoint'ом, вы заметите, что не всегда появляется отладчик. Либо это не MessageBox, а обычное окошко (можно определить по классу), либо сообщение показано, используя "родственную" функцию.
Введите команду exp MessageB для отображения функций, схожих по названию. Посмотрите также в MSDN схожие по действию функции. Поставте контрольные точки на них. Для этого удобно использовать команду bpt т.к имена ф-ций обычно похожи.
Вы заметите, что при появлении одного MessageBox'a, срабатывают поочередно несколько контрольных точек. Это происходит потому, что, например, ф-ция MessageBoxA вызывает MessageBoxExA, она вызвает MessageBoxExW, и потом SoftModalMessageBox. Чтобы перехватить все ф-ции сразу, нужно поставить контрольную точку на "самую глубокую" ф-цию. Многие ф-ции устроены по этому алгоритму.
   -------------------------------

  Отладочная информация (Debug Info).
Программы могут содержать отладочную информацию. При отладке такой программы, вы видите ее исходный код, что может упростить отладку (src - переключение режимов).
Существуют разные форматы отладочной информации. Для использования этого типа отладки, отладчик должен "понимать" формат информации, записанный в программу.
SoftICE понимает отладочную типа CodeView, которую можно создать, используя MASM:
  • Добавте компилятору (ml.exe) параметры: /Zi /coff
  • И линкеру (link.exe): /debug /debugtype:CV /pdb:none
Если отладочная информация отсутствует, программа будет отображена в виде инструкций процессору. Если вы не хотите, чтобы исходный код вашей программы был доступен пользователю, не включайте отладочную информацию в программу. Не злоупртребляйте использованием отладочной информацией при отладке, т.к она скрывает от вас некоторые тонкости работы программы.
   -------------------------------

  MASM (Microsoft Macro Assembler)
MASM - наиболее часто используемый компилятор Assembler. В нем отсутствует большинство недостатков TASM. Ознакомившись с TASM, со следующих выпусков рассылки будет использоватся MASM.
Для использования компилятора, можно загрузить пакет MASM32 c www.masm32.com, содержащий некоторые полезные .inc файлы. Программу cvpack.exe (для создания отладочной информации - используется программой link.exe) можно загрузить с сайта Microsoft.
Данный пример приведен для того, чтобы вы освоили использование компилятора MASM и отладчика SoftICE.
.386
 .model flat,stdcall
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
 .data
MsgBody  db 'MASM Message Box',0
MsgTitle db "Message:",0
 .code
start:
 invoke MessageBox,0,offset MsgBody,offset MsgTitle,0
 invoke ExitProcess,0
end start
Для компиляции MASM'ом исходника, используйте следующие параметры:
ml.exe /c /coff /Cp AnyFile.asm
link.exe /subsystem:windows AnyFile.obj
О дополнительных параметрах компиляции с отладочной информацией см выше.
   -------------------------------

 Содержание дальнейших выпусков зависит от вас. Будут разъясняться те темы, которые непонятны большинству читателей. Присылайте свои вопросы и предложения по адресу: asm32@nm.ru .
   -------------------------------


Автор рассылки Владимир Пронин. Любое коммерческое использование материалов рассылки без ведома и прямого согласия автора запрещено.
Письма присланные автору рассылки могут быть опубликованы целиком или частично без предварительного уведомления. Если вы не хотите, чтобы ваше письмо было опубликовано укажите это в начале письма.
Перепечатка материалов разрешена только с непосредственной ссылкой на asm32.nm.ru


В избранное