Шаг 98.
Программа HIEW.EXE

    На этом шаге мы рассмотрим использование программы 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.




Предыдущий шаг Содержание Следующий шаг