На этом шаге мы рассмотрим использование программы HIEW.EXE.
Данная программа широко известна в среде программистов, скажем так, хакерского направления. Название программы происходит от фразы "Hacker's view". Основная задача, которую выполняет данная программа, - просматривать и редактировать загружаемые модули. Причем просмотр и редактирование допускается в трех вариантах:
Интерфейс программы весьма напоминает интерфейс редакторов таких программ, как Far или Norton Commander. Все команды выполняются при помощи функциональных клавиш (или их сочетания с клавишами Alt и Ctrl - для дополнительных команд). Например, нажимая клавишу F4, вы получаете возможность выбрать способ представления двоичного файла: текстовый, ассемблерный или двоичный. Нажимая клавишу F3 (при условии, если вы находитесь в двоичном или ассемблерном просмотре), вы получаете возможность редактировать файл. Если же, находясь в ассемблерном просмотре, вы после нажатия клавиши F3 нажмете еще и клавишу F2, то сможете редактировать машинную команду в символьном виде. Мы не будем далее останавливаться на командах данной программы, поскольку они просты, очевидны и могут быть получены просто по нажатию клавиши F1, а перейдем сразу к простому примеру использования данной программы. Чтобы слишком не загромождать рассмотрение, возьмем простую консольную программу.
.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 \masm32\lib\user32.lib includelib \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: ;Получить HANDL вывода. 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
Приведенная программа достаточно проста. Представьте теперь, что при отладке вы случайно изменили одну команду: вместо JE поставили JNE. В результате после трансляции программа перестала работать. Можно исправить ее, не прибегая к ассемблерному тексту? Конечно. Для этого в начале ее следует дизассемблировать, найти ошибку, а потом воспользоваться программой HIEW.EXE. Вообще говоря, можно ограничиться только программой HIEW, так как она вполне корректно дизассемблирует. Однако мы нарочно проведем исправление в два этапа.
Дизассемблируем модуль при помощи программы DUMPPE.EXE. Для этого воспользуемся следующей командой:
DUMPPE.EXE -disasm pr98_1.exe >> 11.txt
00401005 start: 00401005 E906000000 jmp _START 0040100A CC int 3 0040100B CC int 3 0040100C CC int 3 0040100D CC int 3 0040100E CC int 3 0040100F CC int 3 00401010 _START: 00401010 6AF5 push 0FFFFFFF5h 00401012 E837000000 call _GetStdHandle@4 00401017 83F8FF cmp eax,0FFFFFFFFh 0040101A 751E jnz loc_0040103A 0040101C A316404000 mov [HANDL],eax 00401021 6A00 push 0 00401023 6812404000 push offset LENS 00401028 6A11 push 11h
Рис.1. Фрагмент дизассемблированного текста программы
По дизассемблированному коду легко обнаружить ошибку. Запомним нужный код 83F8FF. Запускаем программу HIEW.EXE, нажимаем клавишу F4 для декодирования кода программы. Нажимаем F7, переходим на задание HEX-кодов и ищем нужное сочетание. Далее нажимаем клавишу F3, затем клавишу F2, после чего заменяем команду JNE на JE. Клавиша F9 фиксирует изменение.
Рис.2. Программа после изменений
В результате мы исправили программу без повторной трансляции.
На следующем шаге мы рассмотрим программу DEWIN.EXE.