воскресенье, 30 марта 2025 г.

Расшифровать за 100 секунд

Молодые пользователи спрашивают авторские примеры использования 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 см. в документации.

1 комментарий:

  1. Класс! Про crypt конечно же давно знал, а вот про статическую TLS и callback впервые услышал.

    ОтветитьУдалить