Нет, я ни в коем случае не
собираюсь заниматься пересказом статьи
Dr.Golova
по этой тематике. Более того,
я даже не буду вспоминать всю процедуру
обработки файла. Просто как-то не до конца
все получилось. Антивирусы пишут на файлы
BackOrifice Patch и – усё! Хотя можно так развиться!

Итак, не вспоминая про
вышеуказанную статью, лишь скажу, что
потребуется пакер UPX, и редактор HIEW версии
6.55. Чтобы меня не обвинили в
распространении троянов, все манипуляции
будут производится над МастДаевским
Блокнотом (notepad.exe). В оригинале
же работать надо над отконфигурированным и
готовым к бою сервером трояна. Итак, мы
натравили на него UPX, а теперь запускаем
редактор. Находим забитое нулями место и
начинаем писать на Асме. Но для начала
разберемся.

Итак, идея заключается в том,
чтобы полностью забив голову антивирусу
всякой фигней запустить распаковщик по
адресу Image Base + Entry Point. Напрягая память,
припоминаем, что изменение регистра EIP, а
значит, и передача управления под Виндой
может происходить только в сегмент кода (в
который, кстати, писать нельзя – фишка с
самомодифицирующимся кодом вызовет сбой
общей защиты памяти) при помощи команд LOOP, JMP
(и ее разновидностей – JСС) и CALL, RET. Вспомним
каждую из них.

  1. Команда LOOP уменьшает регистр ЕСХ на 1 и
    если ЕСХ 0 выполняет переход типа short (±
    127 байт) на адрес, суммируя указанное
    значение с EIP. Таким образом,
    последовательность INC ECX / LOOP адрес
    выполнится в любом случае, ничего не
    изменив.
  2. JMP тупо загружает значение EIP, выполняя
    переход типа near. Возможно и суммирование
    значений, как в предыдущем случае, и
    переход short – это как кому хочется. Кстати,
    переходы по условию Jcc только так
    работают – подробнее о них читай в любом
    учебнике по Ассемблеру. Можно и круто —
    изменить заодно командой JMP регистр CS и
    даже TSS, выполнив переход типа far в другой
    сегмент или запустив новую задачу
    соответственно, но в данном случае нам
    это не нужно – запросто можно запариться
    и вызвать благие маты Винды. Однако для near
    переходов придется пользоваться
    регистром – прямое указание адреса не
    пройдет. Работает такая
    последовательность: MOV EAX, адрес / JMP EAX (можно
    и так: PUSH адрес / POP EAX / JMP EAX)
  3. CALL работает абсолютно аналогично JMP, но
    предварительно в стек засовываются текущeе
    значениe EIP (CS, а потом EIP – в far-переходе,
    это опять же – для общего развития), чтобы
    потом можно было возвратиться назад (вызов
    процедуры). Такая же история с near-переходами,
    что и в JMP и точно такой же выход – в
    примерах выше просто замени JMP на CALL.
  4. RET, точнее RETN – так подменит ассемблер HIEW
    эту команду, т.е. RET типа near, тупо загружает
    из стека EIP (EIP, а потом CS – это для случая с
    RETF), выполняя возврат из процедуры.
    Последовательность PUSH адрес / RET выполнит
    переход на адрес. RET 12h вначале загрузит EIP,
    а уже потом удалит из стека 18 байт.

Вот, в принципе, и все. Dr.Golova
использовал в своем патче запись участок
нолей последовательности PUSH настоящая
точка входа по адресу Image Base + Entry Point / RET, а
потом поменял в PE-заголовке значение Entry Point
на адрес этого участка, я же предлагаю этому
делу посвятить целую поэму. В своем примере
Блокнота Patch.exe (см. архив AddOn.zip) я сделал
следующее.

Исходное:

Image Base = 40000
Entry Point = 0DDB0

Патч:

.0040DF04: 68B0DD4000 PUSH 0040DDB0 загоним в
стек точку входа (4 байта)
.0040DF09 50 PUSH EAX а также ЕАХ (4 байта)
.0040DF0A 9C PUSHFD регистр ЕFLAGS (4 байта) и
.0040DF0B 60 PUSHAD все рабочие регистры (32 байта) –
туфта для отвода глаз
.0040DF0C E800000000 CALL .0040DF11

Сейчас стек имеет вид:

0040DDВ0 – 4 bytes
EAX – 4 bytes
EFLAGS – 4 bytes
Рабочие регистры – 32 bytes 0040DF11

.0040DF11 C22800 RETN 28h вернуться на 0040DF11 (текущий
адрес) и выкинуть из  стека весь мусор в 40
байт

А теперь в стеке только 0040DDB0 –
точка входа, и повторение RETN 28h (мы-то
вернулись на нее же) вызовет ее. Чуть ниже в
файле запишем:

………………..

.0040DF1E 41 INC ECX увеличить ЕСХ
.0040DF20 E2E3 LOOP .00040DF04 и перейти на начало патча

В действительности до этого
участка мы никогда не дойдем, т.к.
перескочим на точку входа. Но поступим так:
в Entry Point PE-заголовка запишем значение DF1E,
что в сумме с Image Base (40000) и даст адрес
процедуры INC ECX. Таким образом, при запуске
пройдет набор INC ECX / LOOP, а уже потом мы
перескочим на начало патча, где будем
баловаться со стеком.

Все эти операции проводятся
исключительно в редакторе HIEW и никаких
больше утилит не требуют. Само собой, сам
патч несколько мудреный, но это только на
первый взгляд, зато будучи применен в
сервере трояна он пообламывает зубы всем
антивирусам. И один совет: переходы и новые
точки входа устраивайте на четные адреса –
так программа будет выполняться быстрее и
меньше вероятность возможного зависания.

Естественно, возможны и другие
комбинации, не такие, которые были
использованы в Patch.exe. В этом-то и
заключается смысл: создатели антивирусов
вряд ли сподобятся перебирать все
возможные варианты. Разумеется, кидать мне
на мыло свои алгоритмы, построенные на
описанных выше командах, не то, что не
рекомендуется, а просто НЕ НАДО!!!

Отдельное огромное спасибо Dr.Golova
за разработку самой идеи патча
запакованных троянских программ.

Оставить мнение

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…