Глава 2. Обзор отладчиков и дизассемблеров
В этой главе мы рассмотрим отладочные и дизассемблирующие программы, кроме трех наиболее известных, о которых пойдет речь в последующих двух главах.
I
Утилиты фирмы Microsoft
EDITBIN.EXE
Название программы многообещающе, но в действительности программу нельзя назвать редактором. Основное ее предназначение - конвертировать 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.
Утилита весьма полезна для быстрого изменения атрибутов исполняемых и объектных модулей.
DUMPBIN.EXE
Программа используется для исследования загружаемых и объектных модулей 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
. Выполним
трансляцию программы следующим образом.
ml /с /coff /Zi /Zd prog.asm link /debug /subsystem:windows prog.obj53
При этом, кроме исполняемого модуля prog.exe
, появляется еще и
файл prog.pdb
, содержащий отладочную информацию.
Выполним теперь команду DUMPBIN /DISASM /OUT:PROG.TXT PROG.EXE
.
В результате получим практически исходный ассемблерный код. Часть этого кода
представлена на Рис. 4.2.1.
_START: 0040101С: 6A00 push 0 0040101E: E843020000 call _GetModuleHandleA@4 00401023: A344404000 mov [00404044],eax 00401028: C7051C404000 mov dword ptr ds:[40401Ch],4003h 03400000 00401032: C70520404000 mov dword ptr ds:[404020h],offset @ILT+0(_WNDPROC@0) 05104000 0040103C: C70524404000 mov dword ptr ds:[404024h],0 00000000 00401046: C70528404000 mov dword ptr ds:[404028h],0 00000000 00401050: A144404000 mov eax,[00404044] 00401055: A32C404000 mov [0040402C],eax 0040105A: 68007F0000 push 7F00h 0040105F: 6A00 push 0 00401061: E8D6010000 call _LoadIconA@8 00401066: A330404000 mov [00404030],eax 0040106B: 68037F0000 push 7F03h 00401070: 6A00 push 0 00401072: E8BF010000 call _LoadCursorA@8
Рис. 4.2.1. Часть дизассемблированиого кода.
Как видите, это весьма прозрачный текст, ничем не отличающийся от обычного ассемблерного текста. В конце файла можно обнаружить довольно интересную информацию. Вот фрагмент.
_LoadIconA@8: 0040123С: FF2510514000 jmp dword ptr [_imp_LoadIconA@8]
В действительности, когда мы вызываем, например, функцию
_LoadIconA@8
, то на самом деле происходит переход на адрес, где
стоит команда
jmp dword ptr [_imp_LoadIconA@8].
По этой причине в своих программах вместо объявления LoadIcon@8
,
можно объявлять _imp_LoadIconA@8
, что несколько увеличит
производительность Вашей программы. Ранее мы не говорили о такой возможности по
двум причинам:
- Повышение производительности здесь минимально.
- Транслятор TASM32 делает все несколько иначе.
Более подробно данный вопрос рассматривается в Главе 4.1.
53 Здесь, разумеется, мы рассматриваем только средства MASM.