Молодые пользователи спрашивают авторские примеры использования hiew.
Что ж, их есть у меня и сегодня будет пример использования Crypt = встроенной возможности hiew для (де)шифрования.
Сейчас сам удивился, но до сих пор ничего про Crypt не писал.
Crypt впервые появился в ноябре 1993 года в версии 4.20 и был 16-битным. А когда в версии 6.00 был удален, столько недовольства и возмущений от пользователей не было ни до ни после. И в 6.01 вернулся.
Напримером будет HiEW Loader 1.1 (кто не знает - легко найдет)
В архиве он тоже называется hiew32.exe, других букв уже не осталось. Что ж, переименуем в loader.exe
Начинаем стандартно:
Hiew32.exe loader.exe
enter enter ;переход в режим кода
F8 ;просмотр заголовка PE
на широких экранах сразу видно что в последней строке кнопка F11 Tls активна,
(если в этом месте встретилось незнакомое слово из трех букв, самое время пойти почитать про Tls callback), а значит есть еще исполняемый код до передачи управления в точку входа,
но для начала
F5 ;переход на точку входа
и видим мусор вместо кода.
(не знаю зачем все это пошифровано, да еще и через Tls, да еще и с проверкой "чтоб только раз наверняка", впрочем, и в самом коде загрузчика много таких "зачем?", но сейчас не об этом)
возвращаемся в заголовок PE
F8 ;просмотр заголовка PE
и смотрим чего там в Tls callback
F11 ;переход на этот самый Tls callback
разумеется, рассшифровка кода на точке входа
в регистрах
esi/edi начало зашифрованного блока = точки входа
в
ecx длина зашифрованного блока = 3c9
сам алгоритм шифрования - простой
xor по одному байту и простой модификацией маски шифрования на каждом шаге и один-в-один переносится в хьюшный
Cryptвернемся на точку входа
3 ;
переход на начало блока расшифровкиenter ;
возвращаем режим кодаF3 ;
режим редактирования (в hiew всегда редактировался только один экран за раз)F7 ;
вызов Crypt и переписываем сюда код расшифровки
расшифровка идет по одному байту, поэтому размер стоит Byte (при необходимости меняется через F2. А F3 меняет направление Forward/Backward)
последняя команда loop 2 завершает цикл, возвращаясь ко второй строке, в первой была инициализация
F7 ;вышли из режима редактирования
и чтобы проверить
F7 ; расшифровываем по одному байту за раз
(да-да, и зашли через F7 и вышли через F7 и расшифровка через F7)
F7 F7 .... F7 F7
и мусор шаг за шагом на глазах превращается в корректый код
ESC ;
отменяем все изменения, расшифруем все за разenter enter ;
в режим дампа, там проще блок отмечать* ;
отмечаем начало блокаF5 +3с8 ;
добавляем к текущему адресу размер зашифрованного блока, ;
поскольку один байт уже отмечен будет на единицу меньшеenter ;
переход на конец блока* ;
отмечаем конец блокаAlt-F3 ;
Crypt для выделенного блокабыло немного тренировки,
crypt ip (отмечен стрелочкой) стал после полного цикла на строку 2, вернем на инициализацию:
- ;
crypt ip на строку назадF5 ;
и чтоб красиво, очистить все регистры заодноF7 ;
расшифровать блокпо проявившимуся тексту сразу видно, что все рашифровалось корректно
[ ;
переход на начало блока* ;
убрать пометку блокаenter ;
режим кодаи вот он, оригинальный код на точке входа
Tls не нужен, убираем
F8 F10 ;п
росмотр PE Directoryкурсором вниз до
TLS и
F7 ;
очиститьТеперь имеем загрузчик без всяких шифрований и ненужных
Tls.
Собственно процесс рашифровки занял буквально пару минут, чего не скажешь про описание этого процесса в картинках.
Подробности о
Crypt см. в документации.