Нет, я ни в коем случае не
собираюсь заниматься пересказом статьи
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

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …