Среда, 23.07.2025, 16:08 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Глава 2. Обзор отладчиков и дизассемблеров(1)

Глава 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, что несколько увеличит производительность Вашей программы. Ранее мы не говорили о такой возможности по двум причинам:

  1. Повышение производительности здесь минимально.
  2. Транслятор TASM32 делает все несколько иначе.

Более подробно данный вопрос рассматривается в Главе 4.1.


53 Здесь, разумеется, мы рассматриваем только средства MASM.

II

Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0