Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #66, ИЮНЬ 2004 г.

Секреты маскировки

Крис Касперски

Xakep, номер #066, стр. 066-032-5


Код, отвечающий одному или нескольким вышеприведенным пунктам, мы будем называть антиотладочным кодом. Будучи внедренным в упакованный файл, он подложит хорошую свинью виртуальной машине и угробит антивирус еще до того, как распаковщик успеет получить управление. Тупое пополнение сигнатурной базы положение не спасет, и разработчикам придется всерьез засесть за совершенствование виртуальной машины, что не только дорого, но и хлопотно. Так что без крайней нужды на это никто не пойдет, и предложенная идея будет работать долго, укрывая любимый софт от загребущих антивирусных лап.

Существует множество способов внедрения своего кода в чужой исполняемый файл. Вирусы, как правило, раздвигают последнюю секцию, записываясь в ее конец, или создают новую. Дело это муторное и к тому же слишком заметное. Антивирусы матерятся так, что уши вянут. То же самое относится и к вторжению в заголовок.

Мы же поступим умнее и внедримся между секциями в середину файла. Берем файл, упакованный ASPack'ом, грузим его в HIEW, нажимаем <ENTER> для перехода в hex-режим, давим <F8> для входа в режим заголовка, жмем <F6> для просмотра таблицы секций, подгоняем курсор ко второй секции файла и ударяем по ENTER'у.

Теперь, прокручивая курсор вверх, мы оказываемся в чертогах секции .text. В этой секции обычно и размещается машинный код нормальных программ, так что наше появление не вызовет никаких подозрений у антивируса.

Если здесь расположены не нули, а что-то другое, значит, свободное пространство отсутствует. В этом случае попробуй упаковать файл с другой степенью сжатия или поищи свободное место в других секциях. В большинстве случаев AVP/Dr.WEB это воспринимают довольно благосклонно, но никаких гарантий их лояльности у нас нет, и внедрение антиотладочного кода в .text намного более предпочтительно.

Внедрять свой код можно в любое место, адрес которого начинается с точки (если точка не стоит, значит, данная область файла не отображается в виртуальную память – загрузи файл в pe-editor, войди в раздел section и приравняй virtual size секции .text к ее raw size). В нашем случае это может быть любой адрес из интервала 31490F0h – 31491F0h. Допустим, мы возьмем 3149100h как наиболее круглый. Сюда-то и будет направлена новая точка входа, для изменения которой проще всего прибегнуть к pe-editor'у.

Внимание! Точка входа задается не в абсолютных, а в относительных виртуальных адресах, отсчитываемых от базового адреса загрузки файла (image base), и pe-editor говорит, что в нашем случае она равна 01E001, что при базовом адресе в 03140000h дает 01E001h + 03140000h == 0315E001h. Именно по этому адресу наш код должен возвратить управление, чтобы упакованный файл смог начать работу. Короче говоря, для вычисления действительного адреса точки входа мы должны сложить значения полей Entry Point и Image Base, обосновавшихся за кнопочкой "optional header". Как? Ты не умеешь складывать шестнадцатеричные значения? Ну так запусти виндовый калькулятор и, переведя его в "научный" режим, нажми клавишу <F6>. Как вариант, можно затоптать комбинацию <Alt>+<=> в hiew'е, только учти, что вместо суффикса "h" это животное использует сишный префикс "0x", и число 1234h записывается как 0x1234. Запиши полученный адрес точки входа на бумажку, т.к. он нам еще не раз понадобится в дальнейшем.

Назад на стр. 066-032-4  Содержание  Вперед на стр. 066-032-6