Ручная троянизация приложений под windows

         

Куда податься?


Проще всего внедряться в свободное место готового файла, который мы будем звать дрозофилой, а сам внедряемый код — бациллой. Если свободного места ни хрена нет, можно раздвинуть последнюю секцию и внедриться в нее, но это намного сложнее, поэтому такой способ здесь не рассматривается, а всех любопытствующих мы отсылаем к "пути воина — техника внедрение в PE-файлы", который можно отыскать на сайте www.wasm.ru.

Типичный PE-заголовок вместе с таблицей секций и OLD-EXE заголовком занимает чуть больше 200h байт, а минимальное физическое выравнивание внутри файла (File Alignment), которое только поддерживает Windows, как раз и составляет 200h! Таким образом, в нашем распоряжении оказывается практически 200h незанятых байт или даже больше того! Для ускорения загрузки файла большинство линкеров выравнивает адрес начала первой секции не по File Alignment, а по Section Alignment, который никак не меньше 1000h. Как следствие — наши "владения" увеличиваются аж до E00h байт. Для ассемблерных программ это целый материк, на котором и слона разместить можно, ну если не слона, то полноценную бациллу — точно! В упакованных файлах, заголовок прижат к первой секции практически вплотную, поэтому, перед началом внедрения их необходимо распаковать.

Отроем notepad.exe в редакторе HTE и будем прокручивать его до тех пор, пока не врежемся в напаханную целину сплошных нулей. В нашел случае она начинается с адреса 2F0h (именно 2F0h, а не 2EFh, поскольку последний нуль служит завершителем строки WINSPOOL.DRV и трогать его нежелательно). Из любви к круглым цифрам, выберем 300h, хотя, выравнивать начало внедряемого кода совершенно необязательно.

Рисунок 2 поиск места для внедрения бациллы в редакторе HTE

Теперь необходимо определить базовый адрес загрузки файла. Он содержится в заголовке. Не выходя из HTE нажмем <F6> (mode) и выберем "pe/header". Там, в разделе "optional header: NT fields", будет поле "image base".
Это и есть базовый адрес, в нашем случае равный 1000000h. Так же необходимо убедиться, что заголовок действительно распахнут на всю ширину (он лежит в том же разделе в поле "size of headers") и в нашем случае равен 600h. Это значит, что при загрузке файла в память отображаются только первые 600h байт от его начала, а поскольку мы начинаем внедрение с 300h байта, размер бациллы не может превышать 600h –300h == 300h байт. Плохо! Очень плохо! Но при желании это поле можно увеличить до 1000h. Главное, чтобы оно не превышало Section Alignment, указанного ниже. Так же необходимо убедиться, что файл не содержит перемещаемых элементов, которые могут испортить всю малину. Смотрим, если поле "base relocation table" в разделе "optional header: directories" не равно нулю, лучше всего отказаться от внедрения. При большом желании можно внедриться и в перемещаемые файлы, это лишь чуть-чуть труднее, однако, не будем лезть в дебри и для начала разберемся с малым.

Контрольную сумму (checksum) править необязательно. Windows все равно ее игнорирует. Антивирусы, кстати говоря, тоже. Я всегда говорил, что они тупые создания! Впрочем, для перестраховки это поле можно обнулить или рассчитать новую контрольную сумму с помощью утилиты editbin, поставляемой с компилятором Microsoft Visual C++.



Рисунок 3 основные поля дрозофилы, ответственные за внедрение бациллы

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

Берем все тот же HTE, привычным движением руки давим <F6>(mode), "pe/header" и смотрим атрибуты секции .text (в некоторых случаях она называется CODE или как-то еще). Как быстро перейти в конец секции .text? Очевидно, необходимо переместиться на начало следующей секции (в нашем случае эта секция .data), а затем вернуться на один байт назад.

Переводим HTE в режим страничного имиджа (<F6>, "pe/image"), давим <F5> (goto) и говорим "section(".data")", заставляя редактор перейти к началу секции ".data". Переводим курсор на несколько строк вверх и… здравствуй, хвост секции .text! Нулевые байты (которым соответствует ассемблерная команда add [eax],al) никем не заняты и могут использоваться по нашему усмотрению. В данном случае здесь содержится 38h байт. Хм, не слишком-то длинный хвост. Бывают хвосты и подлиннее!



Рисунок 4 незанятый хвост секции .text, готовый к внедрению бациллы


Содержание раздела