|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 11, 2004 22:16:20 > Чего бы я ожидал увидеть: > 1) Диаграммы или рисунки, объясняющие суть. Никакие страницы текста не заменят рисунка ок. слово клиента закон. значит, будут рисунки. > 2) Код, иллюстрирующий эти процессы. будет и код, хотя с этим сложнее (надо кодить и дебажить) пока что используют псевдокод типа вот (рабочий вариант): загружаем PE-заголовок и анализируем атрибуты последней секции; если флаг IMAGE_SCN_MEM_SHARED установлен, отказываемся от внедрения; если ALIGN_UP(Last Section.raw_size, File Alignment) + Last Section.v_a < SizeOfFile, файл содержит оверлей и лучше отказаться от внедрения; дописываем X-код к концу файла; увеличиваем Last Section.raw_size на (SizeOfFile – ALIGN_UP(Last Section.raw_size, File Alignment) – Last Section.r_a), выравнивая его на File Alignment; если Last Section.v_size >= (Last Section.r_a + Last Secion.r_size + (SizeOfFile – (Last Section.r_a + ALIGN_UP(Last Section.raw_size, File Alignment))) оставляем Last Section.v_size без изменений; иначе Last Section.v_size := 0; если Last Section.v_size != 0 пересчитываем Image Size; при необходимости корректируем атрибуты внедряемой секции: сбрасываем атрибут IMAGE_SCN_MEM_DISCARDABLE, и присваиваем атрибут IMAGE_SCN_MEM_READ; > Я вообще никогда в жизни с фразой "создание нового NTFS-потока внутри файла" не сталкивался! Очень интересно! ну это те потоки, которые еще называют атрибутами. создаются/читаются функциями NtCreateFile, NtQueryEaFile и NtSetEaFile, в "The Undocumented Functions Microsoft Windows NT" это описано, а за отзыв спасибо, раз выглядит заманчиво, значит, буду писать ;) |
|
|
Дата: Июн 11, 2004 22:25:34 пока что используют псевдокод типа вот (рабочий вариант) Понял. Схватывается хорошо. Единственное что... Спорно, конечно, идею я из Голуба взял... Если есть какая-то функция, то сначала я описываю ее алгоритм. А затем идет код БЕЗ комментариев. Так вот и тут - код есть, но некоторые вещи нуждаются в объяснении - например, зачем сбрасывается IMAGE_SCN_MEM_DISCARDABLE? |
|
|
Дата: Июн 11, 2004 22:42:50 у меня сначала идут объяснения, а затем код, т.к. если если объяснения терять в коде он во-первых, теряем наглядность, а во-вторых на тех кто уже все знает объяснения нагоняют тоску, а вот с "голым" кодом они ознакомится не прочь - мало ли, может что-то они и упустили. |
|
|
Дата: Июн 12, 2004 00:06:16 В списке механизмов внедрения не хватает "интеграция кода программы с кодом вируса". |
|
|
Дата: Июн 12, 2004 03:47:15 · Поправил: xLat kaspersky Ага. А Вы вспомните последнюю масштабную эпидемию РЕ или ELF вирусов. Они бесперспективны, имхо. Замечу, что вышесказанное не относится к статье, а только к объекту вашего исследования, отчего статья менее интересной не станет. |
|
|
Дата: Июн 12, 2004 04:07:31 а вам обязательно устраивать широкомасштабную эпидемию? между прочим, и сетевым червям надо куда-то внедряться и копировать свое тело в отдельный файл с последующей регистрацией его в \Run, идея на уровне слабого подобия левой руки. уж лучше создать поток в чужом процессе (как временное пристанище) или прорыть нору в PE/ELF файле. а еще есть упаковщики исполняемых файлов и протекторы - им тоже приходится внедряться... а о сетевых червях я в последнее время писал немало, так что не грех будут уделить внимание и файловым вирусам ;) |
|
|
Дата: Июн 12, 2004 04:43:20 kaspersky а вам обязательно устраивать широкомасштабную эпидемию? Ну дык это ж основная идея вирмейкинга - поразить максимум уязвимых систем. между прочим, и сетевым червям надо куда-то внедряться и копировать свое тело в отдельный файл с последующей регистрацией его в \Run, идея на уровне слабого подобия левой руки Хотя ваша мысль об интеграции сеть+РЕ (глобальное+локальное) хороша, но как видите, история показала что есть пути легче - \Run ;) А для реестра можно хук поюзать. а еще есть упаковщики исполняемых файлов и протекторы - им тоже приходится внедряться... а о сетевых червях я в последнее время писал немало, так что не грех будут уделить внимание и файловым вирусам ;) Согласен. Да и полная (я надеюсь;)) классификация не помешает. |
|
|
Дата: Июн 12, 2004 09:12:27 xLat А вот с этим я, пожалуй, не соглашусь. Основная идея вирьмейкинга, как науки, как раз в наиболее грамотном коде. Т.е. скрытие себя, максимальная эффективность заражения и т.д. Если твой вирь в секунду заражает все машины, которые есть в сети, но снимается удалением линка из автозагрузки - кому он нужен? И потом, почему вы считаете, что вирмейкинг должен быть противозаконным? Как уже было замечено, пакеры используют те же техники, что и инфекторы (по сути они и являются инфекторами). Тут среди меня и еще пары знакомых проплывала идея сделать инжектируемую защиту на базе вирусных техник, но идею отложили до лучших времен - дела-с.. Лично для меня существует некое разделение на e-vx и просто vx. e-vx - это всякие черви, трояны и прочая деструктивная нечисть, которая рассчитана на полных идиотов и зачастую не прячется вобще никуда. vx - это вири рассчитаные на профессионалов. Вобще, я мечтаю о светлых днях, когда профессионалы будут соревноваться в заражении друг друга своими зверями и снимать чужих. При этом код зверя будет вызов МессаджБокса или еще чего разного, но никак НЕ деструкция. Когда такое явление примет масштабность не потому, что целевыми машинами управляют дети-ксакепы, а потому что оно заинтересует людей в себе, вот тогда я буду в нирване. Среди моих одногрупников-програмистов (хе-хе..) никто не может вразумительно рассказать из чего состоит PE-файл, а 75% не знают что это такое. :) Уфф.. Во нафлеймил.. :) kaspersky Я хочу! Мне нужна эта статья! Так сложно в наши дни найти информацию толковую! А тратить годы на то, что уже исследовано, как-то не прет. Ведь намного лучше разобраться быстро имея толковую литературу и пойти дальше - развивать область. Короче, я всеми четырьмя лапами ЗА!! |
|
|
Дата: Июн 12, 2004 10:52:20 n0p А вот с этим я, пожалуй, не соглашусь. Хоть десять раз ;) Основная идея вирьмейкинга, как науки, как раз в наиболее грамотном коде. Т.е. скрытие себя, максимальная эффективность заражения и т.д. Особенно понравился момент "как науки" :))) А вообще, я писал все это в свете современных событий. А не исходя из "светлых побуждений вирмейкеров". Если твой вирь в секунду заражает все машины, которые есть в сети, но снимается удалением линка из автозагрузки - кому он нужен? А хуки еще никто не запрещал. И потом, почему вы считаете, что вирмейкинг должен быть противозаконным? Ткните, пжлста, в место где я написал сие изреченье. Как уже было замечено, пакеры используют те же техники, что и инфекторы (по сути они и являются инфекторами). Тут среди меня и еще пары знакомых проплывала идея сделать инжектируемую защиту на базе вирусных техник Вот и пришли к основному - у вирмейкинга, как и у всего две стороны (+/-). Вы смотрите на вирме-г исключительно с одной стороны - "+". Вспомните, что написание и РАСПРОСТРАНЕНИЕМ занимались исключитеольно темные лошадки андеграунда (и сейчас, кстати. Причем речь идет не о лабораторных разработках, которые с одного компа никуда не уходят). Так вот, эти камрады в своих разработках большей частью разбавляли высокотехнологичные операции внедрения в СОМ, NE, PE, прочее, всякими винчестеродавами. Единицы вставляли демомейкерские приколы, а не деструкцию. Короче, это я все к тому, что комп. вирусы изначально задумывались как аналог биологических с соответствующими особенностями (в числе которых взрывной рост популяции при благоприятных условиях). Поэтому я и смотрю не только на качественную, но и вытекающую из нее, количесвенную сторону вирусного паразитизма (эпидемии). Так что vx есть vx. А все остально - РЕ рисечинг. Кстати, все это глубочайшее ИМХО. Щаз услышу упреки о своей категоричности =) |
|
|
Дата: Июн 12, 2004 17:08:37 короче как мне дописать чтобы вместо программы, было скажем сообщение! |
|
|
Дата: Июн 12, 2004 17:27:23 Andrey_Kun короче как мне дописать чтобы вместо программы, было скажем сообщение! Стоит ли задавать столь недзенные вопросы? |
|
|
Дата: Июн 12, 2004 19:54:56 xLat Ты прав, все тобой сказанное (да и мной тоже) - это ИМХО. Во мне твои слова породили бурю возмущения и негатива, но наш флейм ни к чему не приведет, так что лучше нам остаться при своих мнениях. Ведь так? Andrey_Kun Берешь Харда Виздома и дзенствуешь. Там все написано, только скрыто за всякими левыми темами. Но если я смог догадаться, любой сможет, ибо я не бог, а значит такой как все. Дзенствуй!! ЗЫ: ну как не напиться в праздник?! |
|
|
Дата: Июн 13, 2004 04:22:25 n0p Верно. ИМХО, эмоции в дзене не помошник ;) |
|
|
Дата: Июн 13, 2004 08:23:29 2 n0p так может лучше скажешь мне? please... Вообщем если я пытаюсь запихнуть таким образом какуюнибудь левую прогу то при запуске вылетает ошибка. Как я понял надо создавать какойто специальный код |
|
|
Дата: Июн 13, 2004 10:18:34 · Поправил: n0p Все нижеизложенное является теоретическим материалом. Описания вредоносного кода там нет, никаких деструктивных действий код не делает. Более того, знания, полученные из этой статьи рекомендуется примсенять только в мирных целях, таких как написание защит, упаковщиков и т.д. Автор понимает, что эти знания можно использовать для нанесения ущерба информации третьих лиц, но ведь кухонным ножом тоже можно убивать людей. Так что все борцы против вирусологии могут спокойно идти лесом. Andrey_Kun Ну ок, пойдем по-порядку. Сначала открываешь жертву на чтение, закидываешь его целиком в память. Далее работаем с заголовком. Выдираем OEP, сохраняем куда-нить. Ищем Object Table - он в хвосте заголовка. Баунд импорты для начала можно не проверять - зачем усложнять? В Object Table ищем секцию с наибольшим Physical Offset - это даст гарантию, что секция последняя. Я не встречал файлов, в которых физически секции располагаются иначе, чем виртуально, но гипотетически такое возможно. Кстати, также необходимо найти секцию с максимальным Virtual RVA, чтобы случайно чего не напортить. Далее, расширяем Object Table. Для этого находим поле в заголовке, хранящее число объектов, и увеличиваем его на 1. Затем, сразу после последнего объекта в Object Table дописываем еще один объект. Phisical Offset = Phisical Offset последней секции + Physical Size оной. Virtual Size можно оставить нуль - его никто не проверяет, но для большей маскировки в будущем стоит его выставлять согласно остальным секциям. Он может быть нулем, реальным размером кода без выравнивания или же размеру кода с выравниванием. Далее. Virtual RVA = Virtual RVA последней секции + Physical Size оной. Именно Phisical Size, т.к., как я уже говорил, Virtual Size может быть и 0. Еще один подводный камень: новый объект может не влезть в заголовок, поэтому перед добавлением стоит проверить поле Header Size и посчитать размер заголовка после добавления нового объекта. Если он превысит заданное значение, то будет плохо. В таком случае необходимо увеличить поле Header Size на величину, равную File Align, увеличить заголовок на эту величину, сдвинув все секции, а уже потом добавлять новый объект. При этом стоит учесть, что теперь у всех объектов надо изменить Physical Offset и Virtual RVA. Это делается путем прибавления к этим полям того значения, на величину которого изменился размер заголовка. Ну вот. С заголовком частично разобрались, завели новую секцию. Осталось только в хвост файла дописать эту секцию. Но сначала надо проверить, выровнена ли последняя секция. Если нет (а такое встречается), то ее надо выровнять. После этого берем указатель на начало файла в памяти и прибавляем к нему Physical Offset новой секции. Кстати, в заголовке стоит еще изменить поле Image Size. Ну вот. Теперь в хвосте файла есть новая секция, и файл должен работать, если все сделано правильно. Теперь копируем в эту секцию код нашего виря. И вот тут-то и начинается самое веселье. Все, что мы сделали раньше - детские игрушки по сравнению с предстоящей работой. Чтобы записать в секцию тело виря, в начале тела ставим метку vx_start, а в конце vx_end. Размер получаем с помощью препроцессора: vx_size = vx_end - vx_start. Ну с записью тела в память проблем быть не должно, но намекну, что метку можно загружать в регистр - получим адрес метки. :) А теперь сладкое: т.к. все смещения в файле относительные, то для нашего виря они работают только в файле с идентичной вирю структурой. А для любых других файлов необходимо учесть дельта-смещение. Т.о. первые команды в теле виря - вычисление дельта-смещения. Эту величину стоит как следует запомнить куда-нить. Вот как оно вычисляется: vx_start:
call get_delta
get_delta:
sub dword [esp],get_delta
Теперь наверху в стеке лежит дельта-смещение. Для обращения виря к данным нужно прибавить смещение к адресу. Например так: lea eax,[dbHW] add eax,dword [esp] ; add delta-offset У вас, вероятно, возник вопрос: а будет ли сам вирь работать? Отвечаю: будет. Можете провести тесты, если не верите на слово. Для неизмененного файла дельта-смещение равно 0. Но настоящий дзен-программист мне, конечно, на слово не поверит. :) Кстати, немаловажная деталь. Инициирующий вирь пишется одной секцией, лучше вобще файл сделать .flat-типа (это умеет фасм, насчет остальных не знаю). И все данные нужно хранить прямо в коде виря, только поставить прыжки где надо. Пример: jmp @F ; jump to next anonymous label dbData db 'Hello world!',0 @@: ; anonymous label Теперь необходимо организовать переназначение EP и последующую передачу управления коду. Помните, когда мы ковырялись с заголовком, мы сохранили куда-то OEP? Настал его час. Сначала записываем в поле заголовка Entry Point адрес начала нашей новой секции. Тут ничего особо сложного нет. А вот с передачей управления коду есть проблемки. Как я уже говорил, все адреса в PE - относительные. Entry Point не исключение. Т.о. OEP хранит адрес для прыжка относительно себя, любимого. Но ведь мы хотим прыгать из самого хвоста файла! Поэтому от OEP необходимо отнять адрес вызова и еще 5 байт (размер команды jmp). Кстати, тело виря должно завершаться прыжком на OEP. Надеюсь, объяснять "почему" не надо. В инициирующем коде можно ограничиться jmp 0, а при записи тела в жертву надо изменить 0 на нужное значение. Ну вот, теперь жертва заражена и при запуске сначала выполняется код нашего виря, а потом, если мы все сделали правильно, выполняется код жертвы. И последний немаловажный момент. У виря нет секции импорта. Т.е. для нормальной его работы нужно выполнить одно из взаимоисключающих условий: 1) заменить все апи-функции своими. (в связи с этим тело виря увеличится до размеров мамонта, а сам вирь будет требовать высочайших привелегий или r0 :))) 2) организовать поиск образа Kernel32 и поиск нужных апишек. (имхо, это намного проще п.1 :)))) Ну вот. Этих знаний для начала должно хватить, а я постарался изложить их в максимально доступной форме. ЗЫ: насчет поиска апишек на сайте есть статья, но, если будет неясно - спрашивайте. ЗЗЫ: это все очень образно и на полноту не претендует, т.к. это все-таки не статья, а скромный пост. ЗЗЗЫ: спасибо нободи за отлов багов. :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.101 |