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 закрепляет изменение. В результате мы исправили программу, не прибегая к ее перетрансляции.