Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

Like a Virus

Дмитрий Коваленко aka Ingrem

Спецвыпуск: Хакер, номер #048, стр. 048-064-3


Адресно-независимый код внедряется следующим образом. Секция кода сжимается с помощью какого-нибудь алгоритма (типа LZW). В результате этого освобождается немного места в конце кодовой секции - именно туда и прописывается переносимый код, переводя RVA точки входа в PE-заголовке на себя. Длина заражаемого файла при этом не увеличивается!

Как это сделать? Очень просто! Не надо писать собственную процедуру сжатия. Можно воспользоваться тем, что в ntdll.dll есть следующие функции Native API: RtlCompressBuffer, RtlGetCompressionWorkSpaceSize и RtlDecompressBuffer. Они позволяют сжимать и декомпрессировать данные с помощью алгоритма LZ.

Спешу разочаровать любителей передирать исходники один в один - полностью функционального загрузчика трояна (и уж тем более самого трояна) здесь не будет. Это, во-первых, противозаконно, а во-вторых, просто скучно. Но будут две интересные техники: традиционная и нетрадиционная - обе с рабочими процедурами на диске, который прилагается к журналу.

Откомментированный исходный код процедуры GetApi2k можно найти в файле GetApi2k.inc на диске, прилагаемом к журналу. Она адресно-независимая и на 100% рабочая на всех платформах. Правда, ее код далек от оптимального, но это легко поправимо - ее надо просто оптимизировать :). И прочитай статью о базовых принципах написания эксплоитов в Спеце #08.2004(45): там аналогичный исходник рассмотрен достаточно подробно.

Цепочка обработчиков SEH - это связный список, элементами которого являются специальные структуры. Первый dword структуры указывает на следующий элемент цепочки, второй dword - указатель на процедуру обработки исключения.

Процедура получит управление, если в коде приложения произойдет какая-то ошибка (например, деление на 0 или попытка записи в память с атрибутами read only). Если эта процедура не сможет исправить ошибку, управление будет передано следующей процедуре в цепочке SEH и т.д. Ее последний элемент в качестве первого dword'a содержит -1, а в качестве второго - указатель на процедуру внутри kernel32.dll. Именно эта (последняя в цепочке обработчиков процедура) выводит сообщение типа "Инструкция по адресу XXXXXXXX обратилась к памяти по адресу XXXXXXXX".

Естественно, для каждого приложения цепочка SEH своя.

RVA - Relative virtuall address - смещение относительно начала файла.

Полное описание формата PE смотри в доках. Советуем туториал Iczelion'а и доку Hard Winsdom'а - все это есть на www.wasm.ru на русском языке.

Пример процедур, использующих Native API для сжатия данных, есть на диске к журналу. Процедуру декомпрессии напиши сам.

Назад на стр. 048-064-2  Содержание