Материал: TextmetukSPO

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

для окончательной настройки машинных кодов с учетом соединения машинных кодов многим объектных модулей и их взаимного размещения друг относительно друг друга. В одной директиве GLOBAL можно указать несколько имен, разделяя их символом запятой.

Задание. Построить библиотеку объектных модулей Linux, содержащих доступные извне процедуры с именами atoi, itoa, lfwrit. Процедура atoi должна выполнять преобразование последовательности цифр, заданной адресом, который содержится регистре eax, в двоичный код, выдаваемой ее также через регистр eax. Процедура itoa должна выводить в стандартный вывод последовательность десятичных цифр, представляющих исходное значение аргумента в регистре eax, заданное им в двоичном коде. Процедура lfwrite переводит экранный вывод на следующую строку. Основная часть программы должна содержать массив записей вида {число, текст} и по введенному числу выводить текст из той записи, значение первого поля которой совпадает с этим числом. Процедуру поиска такой записи на завершающей стадии разработки целесообразно также поместить в библиотеку объектных модулей. Основная часть программы должна использовать библиотеку объектных модулей.

Контрольные вопросы.

1.В каком месте файловой системы ищутся библиотеки объектных модулей, указанные внутри строки вызова компоновщика только собственным именем. Найти ответ в справочной системе на компоновщик.

2.Как указать нестандартное место размещения библиотек объектных моду-

лей?

3.Что получается с содержимым библиотеки объектных модулей, если в нее заноситься новая версия объектного файла, сохраняется ли в ней старая версия?

Лабораторная работа №6

Содержание работы. Изучение методов и средств использования библиотек объектных модулей в ОС Windows.

Предварительные сведения.

В связи со сложившейся спецификой операционных систем типа Windows, ориентированных в первую очередь на неквалифицированных пользователей и, поэтому, использующих преимущественно графический интерфейс, преобладающая часть отладчиков для этих ОС обеспечивают отладку только графических приложений. В частности только этими возможностями обладают отладчики известной фирмы Borland/Inprise.

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

26

Yuschuk и доступный по электронному адресу на Internet сайте http://home.t- online.de/home/Ollydbg.

Отладчик OllyDbg, версию 1.09 которого мы рассматриваем, есть 32-битный отладчик ассемблерного уровня с внутренними средствами анализа кода для Microsoft Windows(R). Он не требует инсталляции и для использования его программные компоненты нужно просто поместить в отдельное оглавление. Данный отладчик представляет собой свободно распространяемое программное обеспечение (shareware) с авторскими правами - Copyright (C) 2000-2003 Oleh Yuschuk.

Имя исполняемого файла отладчика - OLLYDBG.EXE, по которому его и следует запускать. Имя исполняемого файла отлаживаемой программы может задаваться как аргумент строки вызова отладчика. Отладчик имеет очень широкие возможности, в том числе отладку графических приложений и библиотек динамической компоновки. Поэтому его пользовательский интерфейс основан на графическом окне приложения (а не текстовом окне, как ранее рассмотренный отладчики gdb для Linux).

Практически более удобно запускать отладчик из его собственного оглавления, как текущего при таком запуске (или с помощью ярлыка). Причем, запускать без аргумента - имени исполняемого файла, а исполняемый файл задавать с помощью меню отладчика. Именно, после начального запуска программы OLLYDBG.EXE следует использовать раздел File в главном меню отладчика и пункт Open этого раздела для задания через диалоговую панель имени исполняемого файла - в любом желаемом оглавлении.

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

Работа отладчика OllyDbg управляется с помощью мыши и (или) с помощью клавиатуры, в частности управляющих комбинация "горячих" клавиш.

Точки приостановки (контрольные точки) устанавливаются выбором требуемой строки дизассемблированного текста в окне CPU и нажатием клавиши F2, причем эта клавиша действует как переключатель установки контрольной точки - повторное нажатие этой клавиши на строке с уже установленной контрольной точкой выключает ее (контрольная точка на данной строке изчезает).

Для удобства демонстрации конкретных средств отладки в качестве опорного примера возьмем программу, приведенную в листинге 3.

; Вывод десятичного значения содержимого EAX в MS-DOS EXTERN GetStdHandle, WriteFile, ExitProcess

SECTION CODE USE32 CLASS=CODE

..start:

push dword STD_OUTPUT_HANDLE call GetStdHandle

mov [hstdout],eax mov eax, 1000h

mov esi,10 ; base of position digit system mov ecx, 0 ; reset digit counter

pov: mov edx, 0 ; null into left part of devident

27

div esi

; divide for next digit = rest

add dl, '0'

 

push dx

 

inc ecx

; step into counter

cmp eax, 0

 

jne pov

mov [cnt], ecx mov ebx, numtxt

izv: pop dx

mov byte [ebx],dl ; digit into array for text value inc ebx

loop izv ; izv,ecx

;--- WriteFile(hstdout, txt, 7, &actlen, NULL) push dword 0

push dword actlen

push dword [cnt] ; number of bytes push dword numtxt ; address of txt push dword [hstdout] ; N handle=hstdout call WriteFile

; ExitProcess(0) push dword 0 call ExitProcess

SECTION DATA USE32 CLASS=DATA

numtxt times 10 db 0 ; may be <resb 10> but then - warning! cnt dd 0

hstdout dd 0 actlen dd 0

STD_OUTPUT_HANDLE equ -11

Листинг 3. Пример программы PRIM4.asm для отладки

После запуска под отладчиком исполняемого файла, полученного ассемблированием и компоновкой программы с листинга 2, в панели CPU отладчика можно наблюдать следующий текст, приведенный на рис. 1.

00401000

68 F5FFFFFF PUSH -0B

;

DevType

=

STD_OUTPUT_HANDLE

 

 

 

00401005

E8 64000000

CALL <JMP.&KERNEL32.GetStdHandle>

; GetStdHandle

 

0040100A

A3 0E204000

MOV DWORD PTR DS:[40200E],EAX

 

 

 

0040100F

B8 00100000

MOV EAX,1000

 

 

 

00401014

BE 0A000000

MOV ESI,0A

 

 

 

00401019

B9 00000000

MOV ECX,0

 

 

 

0040101E

BA 00000000

MOV EDX,0

 

 

 

00401023

F7F6

DIV ESI

 

 

 

00401025

80C2 30

ADD DL,30

 

 

 

00401028

66:52

PUSH DX

 

 

 

0040102A

41

INC ECX

 

 

 

0040102B

3D 00000000

CMP EAX,0

 

 

 

28

00401030

75 EC

JNZ SHORT PRIM4.0040101E

 

 

00401032

890D 0A204000 MOV DWORD PTR DS:[40200A],ECX

 

00401038

BB 00204000

MOV EBX,PRIM4.00402000

 

 

0040103D 66:5A

POP DX

 

 

 

0040103F

8813

MOV BYTE PTR DS:[EBX],DL

 

 

00401041

43

INC EBX

 

 

 

00401042

E2 F9

LOOPD SHORT PRIM4.0040103D

 

 

00401044

68 00000000

PUSH 0

 

; pOverlapped = NULL

00401049

68 12204000

PUSH PRIM4.00402012 ; pBytesWritten = PRIM4.00402012

0040104E

FF35 0A204000 PUSH DWORD PTR DS:[40200A]

 

; nBytesToWrite =

0

 

 

 

 

 

00401054

68 00204000

PUSH PRIM4.00402000

; Buffer = PRIM4.00402000

00401059

FF35 0E204000 PUSH DWORD PTR DS:[40200E]

 

; hFile = NULL

0040105F

E8 10000000

CALL <JMP.&KERNEL32.WriteFile>

; WriteFile

 

00401064

68 00000000

PUSH 0

 

; ExitCode = 0

 

00401069

E8 0C000000

CALL <JMP.&KERNEL32.ExitProcess>

; ExitProcess

0040106E

$-FF25 38304000 JMP DWORD PTR DS:[<&KERNEL32.GetStdHandl>]

00401074

 

$-FF25 3C304000 JMP DWORD PTR DS:[<&KERNEL32.WriteFile>]

0040107A

.-FF25 40304000 JMP DWORD PTR DS:[<&KERNEL32.ExitProcess>]

00401080

 

00

DB 00

 

 

Рис. 1. Содержимое окна CPU отладчика для примера

Заметим, что окно дизассемблирования CPU состоит из четырех столбцов. В первом из них для каждой строки приводится (виртуальный) адрес, с которого размещается содержимое этой строки при выполнении программы. Во втором столбце приводится шестнадцатеричный код содержимого этой строки, в третьем - дизассемблированное содержимое, записанное с помощью мнемокодов команд, обозначений регистров и вспомогательных операндов ассемблера. Кроме того, в этой же строке для операндов, задающих места переходов или вызываемых подпрограмм, в угловых скобках приведены обозначения соответствующих исполняемых файлов и имена доступных извне меток или подпрограмм в этих исполняемых файлах. В частности, в нашем примере для обращения к функциям API, находящимся в DLL библиотеки KERNEL32, используются программные переходники, которые представляют собой обращения по командам CALL к ко- мандам-переходникам в конце исполняемого кода. Эти команды-переходники являются, в свою очередь, косвенными безусловными переходами, которые осуществляют переходы по адресам, записанным в специальные поля и обеспечивающие действительные переходы на требуемые системные функции. (Тем самым, в реализацию пожеланий исходной программы система разработки вносит свои изменения - вместо прямых обращений к системным функциям используются упомянутые переходники.)

Последняя колонка панели CPU содержит пояснения, помогающие разработчику понять, что делает команда в рассматриваемой строке. Эти пояснения могут быть системным обозначением константы, используемой в команде строки, либо комментариями к используемым действиям и вызовам.

Для выполнения программы в пошаговом режиме служат клавиши F7 и F8. Первая из них задает пошаговое исполнение с пошаговым вхождением и выполнением вызываемых подпрограмм. Клавиша F8 задает пошаговый режим только

29

для текущей программы (подпрограммы), при этом выполнение всех вызываемых подпрограмм осуществляется автоматически до момента выхода из них, так что отлаживаемые действия приостанавливаются на следующей за вызовом команде. Автоматическое выполнение программы задается клавишей F9, при этом выполнение происходит до первой встретившейся контрольной точки, до системного вызова, следствием которого является ожидание события (например, ввод данных) или завершения программы. Повторный запуск программы осуществляется горячей клавишей Ctrl-F2.

Текущее значение данных в рассматриваемый момент отладки программы можно получить из двух панелей отладчика: окна Register и окна Dump. Первое из них отображает текущие значения всех регистров, а окно предназначено для отображения участка памяти. Кроме того, при отладке в последнем столбце панели CPU в ряде случаев появляется поясняющая информация о данных, полученных в результате выполнения очередной команды.

Так при отладки рассматриваемой программы, после второго прохождения команды в строке с адресом 0040103F (которая заносит код очередной цифры в область данных исходного кода с именем numtxt), в комментарии к строке с адресом 00401038 появляется примечание ASCII "40". (Сама эта команда дизассемблирована в окне CPU как MOV BYTE PTR DS:[EBX],DL). Это примечание при очередном прохождении той же строки исходной команды

mov byte [ebx],dl

преобразуется в ASCII "409", при последующем прохождении - в ASCII "4096". Все это помогает разработчику быстро разобраться с формируемыми данными.

Отладчик OllyDbg имеет множество возможностей, познакомиться с которыми можно через его справочную систему. Уточним еще раз, что этот отладчик охватывает гораздо более широкий круг проблем отладки, чем требуется для простого программирования на ассемблере.

Задание. Построить библиотеку объектных модулей ОС Windows, содержащих доступные извне процедуры с именами atoi, itoa, lfwrit. Процедура atoi должна выполнять преобразование последовательности цифр, заданной адресом, который содержится регистре eax, в двоичный код, выдаваемой ее также через регистр eax. Процедура itoa должна выводить в стандартный вывод последовательность десятичных цифр, представляющих исходное значение аргумента в регистре eax, заданное им в двоичном коде. Процедура lfwrite переводит экранный вывод на следующую строку. Основная часть программы должна содержать массив записей вида {число, текст} и по введенному значению текст выводить число из той записи, значение второго поля которой совпадает с этим текстом. Процедуру поиска такой записи на завершающей стадии разработки целесообразно также поместить в библиотеку объектных модулей. Основная часть программы должна использовать библиотеку объектных модулей.

Контрольные вопросы.

1.Какие языковые средства описания структур данных содержит язык Си?

2.Какие языковые средства описания структур данных содержит ассемблер NASM?

30

Источник: https://studfile.net/preview/16469866/