HIEW.EXE
DUMPPE.EXE
Утилиты других производителей
II
Данная программа рассматривалась нами в гл. 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]
Рис. 4.2.4. Дизассемблированный код программы на Рис. 4.2.3.
По дизассемблированному коду легко обнаружить ошибку. Кстати, команду cmp eax,0FFh надо, естественно, понимать как cmp eax,0FFFFFFFFh. Запомним нужный код 83F8FF. Запускаем программу HIEW.EXE, нажимаем клавишу F7 и ищем нужное сочетание. Далее клавиша F3, затем F2 и далее - заменяем команду JNE на JE. Клавиша F9 закрепляет изменение. В результате мы исправили программу, не прибегая к ее перетрансляции.