II
Утилиты других производителей
DUMPPE.EXE
Данная программа рассматривалась нами в гл. 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) представлена простая консольная программа, выводящая на экран текстовую строку.
.386P ; плоская модель .MODEL FLAT, stdcall ; константы STD_OUTPUT_HANDLE equ -11 INVALID_HANDLE_VALUE equ -1 ; прототипы внешних процедур EXTERN GetStdHandle@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN ExitProcess@4:NEAR ; директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ;------------------------------------------------- ; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' BUF DB "Строка для вывода",0 LENS DWORD ? ; количество выведенных символов HANDL DWORD ? _DATA ENDS ; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить HANDLE вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 CMP EAX,INVALID_HANDLE_VALUE JNE _EX MOV HANDL,EAX ; вывод строки PUSH 0 PUSH OFFSET LENS PUSH 17 PUSH OFFSET BUF PUSH HANDL CALL WriteConsoleA@20 _EX: PUSH 0 CALL ExitProcess@4 _TEXT ENDS END STARTРис. 4.2.3. Консольная программа.
Программа на Рис. 4.2.3 проста и корректна. Представьте теперь, что при отладке Вы случайно изменили одну команду: вместо
JE
поставилиJNE
. В результате поспе трансляции программа перестала работать. Можно исправить ее, не прибегая к ассемблерному тексту? Конечно. Для этого в начале ее следует дизассемблировать, найти ошибку, а потом воспользоваться программойHIEW.EXE
. Вообще говоря, можно ограничиться только программойHIEW
, так как она вполне корректно дизассемблирует. Однако мы нарочно проведем исправление в два этапа.Дизассемблируем модуль при помощи программы
DUMPBIN.EXE
. Вот дизассемблированный текст программы (Рис. 4.2.4).Dump of file cons1.exe File Type: EXECUTABLE IMAGE 00401000: 6A F5 push 0F5h 00401002: E8 2B 00 00 00 call 00401032 00401007: 83 F8 FF cmp eax,0FFFFFFFFh 0040100A: 75 1E jne 0040102A 0040100C: A3 16 30 40 00 mov [00403016],eax 00401011: 6A 00 push 0 00401013: 68 12 30 40 00 push 403012h 00401018: 6A 11 push 11h 0040101A: 68 00 30 40 00 push 403000h 0040101F: FF 35 16 30 40 00 push dword ptr ds:[00403016h] 00401025: E8 0E 00 00 00 call 00401038 0040102A: 6A 00 push 0 0040102C: E8 0D 00 00 00 call 0040103E 00401031: CC int 3 00401032: FF 25 08 20 40 00 jmp dword ptr ds:[00402008h] 00401038: FF 25 00 20 40 00 jmp dword ptr ds:[00402000h] 0040103E: FF 25 04 20 40 00 jmp dword ptr ds:[00402004h]