Whatis.Ru

Информация о компьютерах доступным языком
Назад на сайт

Вы не зашли.


#1 24-07-2014 09:59:25

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

.: Вирусы под наркозом :.


    1.ВВЕДЕНИЕ                           5.АНТИВИРУСЫ
       Сущность хакеров                     Антивирусная технология
                                             Класификация средств защиты
    2.ВИРУСЫ                                Проверка целостности
       Вирусы прошлого                      Трепанация антивируса
       Группа стелс-вирусов
                                         6.НА ЗАДНЕМ ДВОРЕ У ВИРУСА
    3.ФАЙЛОВЫЕ СИСТЕМЫ "NTFS"               NTFS-потоки на службе у пионера
       Процессы и потоки                    Внедрение в файлы
       Файловые потоки (:stream)            Кастрация вирусов

    4.ВИРУСЫ НАСТОЯЩЕГО                  7.СЕТЕВЫЕ ТЕХНОЛОГИИ
       Понятие X-кода                       Сети Ботнет
       Формат РЕ-файла                      Обход брендмауров
       Обзор механизмов внедрения
       Что нельзя делать с PE-файлом
       Окупация PE-заголовка


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#2 24-07-2014 10:00:07

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

1.ВВЕДЕНИЕ

Ох уж эти малвари! Чтобы мы без них делали? Тормоза системы, вызванные работой антивируса, компенсируются умиритворённым состоянием духа от слепой уверенности, что с тачкой всё в порядке и в системе нет всякой нечисти. Человеку свойственна наивность! Если антивирус говорит, что он ничего не нашёл, то и понимать его следует буквально - значит, хреново искал!

В наше время, можно с уверенностью утверждать, что 90% всех компьютеров в сети в той или иной степени заражены (в независимости от того, охраняется периметр антивирусом или нет). По данным Википедии, львиная доля всех вирусов приходится именно на операционную систему Windows, как наиболее распространённую ОС. Зависимость количества известных вирусов от ОС демонстрирует следующий список:

    Windows         : 140 000
    MS-DOS          : 4 000
    Amiga OS        : 775
    Sumbian OS      : 85
    Mac OS Classic  : 65
    Linux/GNU       : 30
    Palm OS         : 4
    Windows Mobile  : 3
    OS/2, Free BSD  : ??

Как видим, винда имеет солидный отрыв от своих собратьев. Пожалуй, только контроллёры, управляющие лифтами да микроволновыми печами избавлены от этой напасти, но сколько такое спокойствие ещё продлится, сказать невозможно. Микроволновые печи, управляемые через Интернет, уже появились. Осталось добавить в них поддержку Java-апплетов и вирусы захватят ещё один ареал обитания.

Думаю эта тема тревожит многих из нас, поэтому предлагаю её обсудить, ..но сначала немного хакерского жаргона, чтоб не чесать репу если встретится незнакомый лексикон:

*Дрон/Зомби - заражённый компьютер.
*Малварь (Malware) - вся зараза, вместе взятая (черви, вирусы, трояны и т.д.)
*Вирус (Virus) - самовоспроизводящаяся программа, паразитирующая на других программах. Инфицированные программы обретают способность заражать других.
*Червь (Worm) - самовоспроизводящаяся программа, распространяющаяся по сети без участия человека. В отличие от вируса, не является паразитом и представляет самостоятельную сущность.
*Троян (Trojan) - программа, не обладающая способностями к самовоспроизведению и распространяемая злоумышленником вручную. В другие программы не внедряется, но может прописывать себя в автозагрузку, получая управление при каждом запуске ОС.
*Root-Kit - подпрограмма, прячущая другие программы от антивирусов (файлы, процессы, сетевые соединения).
*Начинка (Payload) - подпрограмма, входящая в состав малвари. Выполняет некоторые действия, от вывода на экран до разрушения инфы и установки удаленного shell-кода.
*Бот (Bot) - код, ждущий подключения к сети. Обычно Боты рассылаются по нескольким машинам, которые в савокупности образуют сеть Ботнет. Хакер, управляющий ботнетом, величается Магом.


Сущность хакеров.

Массовый выпуск IBM PC привёл к резкому увеличению людей, активно занимающихся программированием. Обладателями компьютеров стали школьники, пенсионеры, а также другие лица, располагавшие, помимо желанием попробовать свои силы в программировании, ещё и значительным количеством свободного времени.

Спектр отношения людей к программированию очень широк: от ненависти до зависимости, которую можно квалифицировать как манию. Для программиста/фаната работа за дисплеем - это и есть настоящая жизнь, а всё остальное - скучная обязаловка. Постоянная работа с машиной накладывает определенный отпечаток на язык и мышление таких людей. Люди воспринимаются ими как программы, а окружающая среда - как операционка.

Такой/одержимый программист, часто называется хакером (от англ.Hack - рубить, кромсать). Это очень способный человек, работающий за дисплеем до полного изнеможения. Блестяще знает все подробности ОС, ассемблер и особенности периферийного оборудования. Конечно, статус хакера не является пожизненным. Это своего рода детская болезнь, и из среды нормальных хакеров вышел ряд известных разработчиков системного программного обеспечения.

Для части хакеров, обычно называемых кракерами, в качестве сверхзадачи выступает проникновение в какую-нибудь систему, снятие защиты программного продукта или что-то аналогичное. Именно эта часть хакеров становится причиной головной боли разработчиков коммерческого программного обеспечения, снабженного средствами защиты.

И наконец, самая худшая порода хакеров - создатели троянских программ и компьютерных вирусов.  Впрочем, их уже нельзя назвать хакерами, поскольку неформальный кодекс хакера запрещает использование своих знаний во вред пользователям! Это своего рода паршивые овцы, которые бросают тень на хакеров в целом. Обычно их называют техно-крысами.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#3 24-07-2014 10:06:18

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

2.ВИРУСЫ

Вирусы прошлого

С высоты птичьего полёта, вирусы эпохи MS-DOS кажутся очень примитивными. Чтобы распознать их не требовалось особых усилий. Распишем действия, к примеру, вируса С-648:

1. Ищем файл-жертву;
2. Если жертва была найдена (среди последних/четырёх битов нет 1), то С-648 вставляет в начало этой программы команды перехода на подпрограмму перезагрузки BIOS, делая тем самым машину неработоспособной.

Формально, вирус С-648 файловый/нерезидентный вирус, поражающий файлы типа СОМ. При заражении он дописывается в конец программы и одновременно вставляет в первые 3 байта COM-файла, команду перехода на тело вируса.

Для отличения заражённых файлов от незаражённых C-648 использовал младшие 4 бита времени создания файла (для заражённых файлов они все устанавливаются в 1, что соответствует несуществующему количеству секунд - 62 сек). Следует отметить, что досовская команда DIR и др. не показывают поле секунд, поэтому признак заражённости файла был хорошо скрыт от юзера.

..или ещё один малварь RCE-1636 (Sunday - Воскресенье).
Данный вирус получил название "Sunday", поскольку в этот день недели вирус удаляет все запускаемые файлы. Вирус RСЕ-1636 является резидентным (постоянно висящим в ОЗУ) файловым вирусом, поражающим как СОМ, так и ЕХЕ-файлы. Механизм размножения стандартен - перехват прерывания 21-4B и заражение каждой запускаемой программы.

Файлы поражаются данным вирусом однократно, в инфицированной программе тело вируса размещается в начале файла. Со смещения 84h от начала заражённого файла (см.дамп ниже) расположена текстовая строка "COMMAND.COM", а со смещением 251h - текст сообщения, выдаваемого вирусом на экран:

  Сегодня воскресенье! Зачем работать так напряженно ?
  Постоянная работа без игр делает Вас занудой !
  Пошли ! Давай выйдем из дому и развлечёмся !

В конец заражённого файла записывается 5-байтовое поле (C8F7E1EEE7). Это поле используется вирусом в качестве признака заражённости. Как уже указывалось, данный вирус имеет стадию проявления, наступающую в воскресенье. В этот, день вирус перехватывая прерывание от таймера (INT-8), выводит приведённое выше сообщение.

При выполнении заражённой программы, управление сразу передаётся на начало вируса командой "JMP", опкодом которой является значение "Е9". В ассемблере - команда "JMP" означает переход. Как видно из дампа, этот переход указывает на адрес 9200h. Меняем байты местами и получаем адрес 0092h. Именно с этого адреса и начинается дрозофила.

Сперва вирус проверяет наличие своей копии в ОЗУ. Если компьютер не заражён, то вирус копирует всю программу в свободное место в памяти и, таким образом, остаётся резидентным. Затем вирус перехватывает прерывание 21h, в результате чего при запуске любой программы вирус получает управление. Определение заражённости программы основано на считывании последних 5-ти байтов.

В то/смутное время, более опасной группой вирусов была ещё одна группа, под названием "Avenger". Она включала два вируса: RCE-1800 (Dark Avenger) и RCE-02000 (Bontchev). Код вирусов этой группы свидетельствует о глубоком знании разработчиком MS-DOS. В них используется ряд нетривиальных методов маскировки и обхода простейших резидентных сторожей.

Вирус "Dark Avenger" получил своё название в связи с тем, что в теле вируса содержатся две текстовые строки:

  1. Eddie lives...somewhere in time.
  2. This program was written in the city of Sofia (C)1988-89 Dark Avenger.

Вирус RCE-1800 является файловым/резидентным вирусом. Это первый попавший в СССР вирус, стратегия размножения которого предусматривает заражение программ не только при их выполнении, но и при других операциях доступа к файлам: создании, переименовании, открытии и закрытии (прерывания 21-4Bh, 21-3Ch, 21-5Bh, 21-56h, 21-3Dh, 21-2h). Такая стратегия размножения делает этот вирус весьма опасным, поскольку, если в заражённой системе запустить программу, просматривающую файлы во всех подкаталогах (например, ревизор), то в результате большая часть файлов будет заражена.

Фаза проявления данного вируса связана с разрушением секторов винчестера и наступает после определённого количества инсталляций вируса. Сразу после очередной инсталляции вирус анализирует 2 байта бутсектора диска (8 и 10-й). Десятый байт используется в качестве счётчика, который вирус увеличивает на 1 при каждой инсталляции. При каждой 16-ой инсталляции он уничтожает содержимое одного из секторов винчестера, записывая туда первые 512 байтов своего тела. При этом байты запорченного сектора будут содержать фразу:
"Eddie lives..somewhere in time":

    000: E209013049113090 9090909090909090  .U..............
    010: 9090909090909090 9090909090909090  ................
    ***   ??????????? ?????? ????????? ??????????   ***
    6F0: 4564646965206C69 7665732E2E2E736F  Eddie lives...so
    700: 6D65776865726520 696E2074696D6521  mewhere in time!
    710: 00009023121E8CC3 83C3102E039CFF06  ...#............
    720: 2E899C53002E8B9C FD062E899C51008C  ...S.........Q..
    730: C383C3102E039C03 078ED32E8BA40107  ................
    740: EA00000000BF0001 81C60507A4A58B26  ...............&
    750: 060033DB53FF64F5 E800005E81EE6B00  ..3.S.d....^..k.
    760: FC2E81BC05074D5A 740EFA8BE681C408  ......MZt.......
    770: 08FB3B26060073CD 5006561E8BFE33C0  ..;&..s.P.V...3.
    780: 508ED8C4064C002E 8984F4062E8C84F6  P....L..........
    ...  ..  ..  ..  ..   ..  ..  ..  ..    ..  ..  ..  ..
    D50: 164F072E8C1E5107 33DB8EDBC7068400  .O....Q.3.......
    D60: EE028C0E86005A5B 581FC35053B462E8  ......Z[X..PS.b.
    D70: 72FD8CC8484B8EDB F9131E03003BD872  r...HK.......;.r
    D80: F55B58C3A15B07BA 1000F7E2C3546869  .[X..[.......Thi
    D90: 732070726F677261 6D20776173207772  s program was wr
    DA0: 697474656E20696E 2074686520636974  itten in the cit
    DB0: 79206F6620536F66 6961202843292031  y of Sofia (C) 1
    DC0: 3938382D38392044 61726B204176656E  988-89 Dark Aven
    DD0: 6765720080FC0375 0F80FA807305EAC8  ger....u....s...
    DE0: 0EFD18EAC80EFD18 EAC80EFD18000121  ...............!
    DF0: 0090909090909090                   ........

Как известно, при запуске, файлы читаются последовательно, и здесь мы отчётливо видим, как вирус первым перехватывает управление, записав в начале кода "JMP" (Е9). Своё тело вирус записывает с самый конец заражённого файла. Далее, он передаёт управление оригиналу, а сам ждёт своего часа. Получается приблизительно следующая картина (XX-код программы; ZZ-код вируса):


Пример незаражённой программы

    +--начало файла                конец файла---+

    |-------------ХХХХХХХХХХХХХХХХХ--------------|


Пример заражённой программы

       +---->>----+

    |-ZZ--ZZZZ----XXXXXXXXXXXXXXXXX--ZZZZZZZZZZ--|
          +----<<----------<<-----------<<----+

..вот когда процветали антивирусы! Всё что им нужно было, это проверить начало и конец файлов на принадлежность к вирусу. Проверялась, тупо, "JMP" в начале, и "сигнатура" в конце файла.

Чуть позже, создателями антивирусов была выработана схема классификации вирусов, включающая три основных элемента. На этой схеме строился весь антивирусный софт:

* код вируса (типа, код товара);
* дескриптор вируса (список основных свойств);
* сигнатура вируса (строка контекстного поиска).

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

Следует отметить, что контекстный поиск может использоваться не только для поиска заражённых  вирусом программ, но и для поиска программ повреждённых вирусом. Например, вирус С-648 записывал в первые 5 байтов строку, соответствующую переходу на подпрограмму перезагрузки BIOS. Для поиска уничтоженных вирусом программ можно было использовать строку "EAF0FF00F0".

Аналогично вирус "RCE-1800" уничтожал сектора на винчестере, записывая в первые байты  сообщение "Eddie livesт somewhere in time". По этому сообщению можно было выявить все поражённые сектора и определить, к каким файлам они относятся.

*************************************************

Интервью c Dark Avenger'ом

http://myfolder.ru/thumbnail/20140725/4/p41294254_2_1212094.jpg

Рисунок 1. Dark Avenger - легендарный болгарский хакер конца 80-х, главным образом известный своим мощным полиморфным движком MtE и вирусом "Eddie".

Q: Вопрос первый, но концептуальный. Почему, собственно, вирусы?!

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

Разобравшись, я сильно разочаровался, почувствовав, что сам-бы мог написать намного лучше. Написал, поигрался, бросил на полку и забыл. Но потом схватил ещё один вирус и угаснувший интерес мгновенно разгорелся с новой силой. На этот раз запала хватило на несколько лет, за которые были опробованы различные технологии, вошедшие в легенду ещё при жизни.

Q: Подолжаешь-ли заниматься вирусами теперь?

DA: Я, конечно, слегка задвинутый, но не настолько! Я отошёл от дел ещё в начале 90-х, в тот момент, когда вирусные технологии, достигнув пика своего развития, пошли на спад, а в "элитарное" сообщество вирусописателей начали вливаться толпы пионеров, пишущих вирусы на Бейсике! Какой интерес их анализировать? Свежих идей в них нет. Полный примитив. А если вас интересуют идеи - отправляйтесь на Black Hat, хотя упадок царит и там. Это трудно передать словами, но хакерское общество за последнее время сильно опустилось и деградировало.

Q: Твое напутствие молодым хакерам?

DA: Хакерство - это болезнь, которой нужно хотя-бы однажды переболеть, чтобы выработать иммунитет. Вирусы остаются объектом серьёзных научных исследований и пускай заткнуться те, кто пытается приравнять хакеров к террористам, а в вирусах видит только вредоносные программы хулиганствующего типа. Разрушение данных - не есть основная сущность вируса. Чтобы выжить, вирус должен стремиться к симбиозу с операционным окружением и не причинять ни прямого, ни косвенного вреда.

К сожалению, хакеры свернули исследовательскую деятельность много лет назад. Мы были первооткрывателями, а молодое поколение только обезьянничает. И хотя вирусы осваивают новые платформы (мобильные телефоны, RFID-сканеры), они эксплуатируют технологии десятилетней давности, адаптированные под новые условия. Грустно. Очень грустно.




Группа стелс-вирусов

В 1989 году США выпустили невидимый для радаров истребитель "F-117A Стелс".
Это новшество настолько воодушевило хакеров, что они взяли идею невидимки на своё вооружение и вопросы маскировки вирусов стали основными. В результате, маскировка приобрела комплексный характер, а соответствующие вирусы можно было отнести к новому поколению, получившему название "Стелс-вирусов".

Действия по маскировке можно условно классифицировать на следующие категории:

  * Automodification - авто/модификация с целью затруднения контекстного поиска;
  * Cipher - шифровка программы;
  * AntiDebugging - защита от трассировки;
  * Enter point - сохранение точки входа в EXE-программах;
  * Fag - самоизлечение при попытке просмотра заражённой программы;
  * Hook - не обнаруживается сторожами векторных прерываний;
  * Increment - имплантация тела в программу без увеличения размеров файла;
  * Jump - cохранение первого перехода в COM-файлах;
  * Length - маскировка увеличения длины заражённых файлов;
  * Memory map - не обнаруживается средствами просмотра памяти;
  * Overlay - разделение тела вируса на несколько подгружаемых частей;
  * Polyinfection - заражение как файлов, так и MBR;
  * Redirection - перехват и модификация дисковых операций;
  * Space - корректировка общего объёма свободной памяти;
  * Text - шифровка текстовых сообщений.

Здесь приведены только те приёмы, которые уже были использованы в существующих вирусах, однако могут существовать и другие приёмы маскировки.

Первым стелс-вирусом принято считать RCE-04096 (Frodo). Название "Фродо" связано с тем, что вирус содержит бутсектор в своем коде. При записи этого бутсектора в бутсектор диска, выдаётся текст:

    FRODO LIVES !

В то время была идея, что эт вирус посвящён героям известной трилогии "Властелин колец" - Бильбо и Фродо Баггин'ов (Bilbo and Frodo Baggin).

Данный вирус относится к файловым резидентным вирусам. Заражает исполняемые файлы при запуске и закрытии файла (прерывания 21-4B и 21-3E). В качестве признака заражения, используется год создания файла. Для заражённых файлов, вирус меняет его увеличивая на 100 (например с 1990 на 2090). Приращение длины всегда равно 4096 байт, что объясняет название 04096.

При заражении изменяет первые 6 байт. Тело вируса дописывается в хвост заражённого файла. Вирус располагается в старших адресах ОЗУ, но может вести кочевой образ жизни мигрируя в область младших адресов.

Маскировка обеспечивается за счёт перехвата операций используемых командой DIR и вычитания 4096 байт (4К) из длины заражённых файлов. В итоге сохраняется оригинальный размер файла. Первым такой метод маскировки был использован в вирусе "RCE-02000". При открытии файла для записи вирус выкусывает своё тело из заражённого файла, а затем снова заражает его при закрытии.

При анализе работы вируса выясняется, что вирус написан техно-крысой, хорошо знающей внутренности ОС и алгоритмы работы антивирусных программ. Странно, что программист такого уровня не нашёл ничего лучшего для выражения собственных способностей, как написание вируса.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#4 24-07-2014 10:08:40

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

3.ФАЙЛОВЫЕ СИСТЕМЫ "NTFS"

Процессы и потоки

В Windows, каждый процесс содержит как минимум один поток. Для управления ресурсами, процессы объединяются в задания. Все вместе (задания, процессы, потоки) они образуют общий набор инструментов для управления ресурсами и реализации многозадачности. Описание этих понятий приведено ниже:

    Задание  : набор процессов с общими квотами
    Процесс  : контейнер для ресурсов
    Поток    : сущность, выполняемая ядром

Рассмотрим эти понятия..
* Задание - набор, состоящий из одного или нескольких процессов, управляемых как единое целое. С каждым заданием ассоциированы квоты и лимиты ресурсов, хранящиеся в задании.
Квоты включают такие пункты, как:
- макс.кол-во процессов (лимит на кол-во дочерних процессов);
- время ЦП, доступное для каждого процесса;
- макс.кол-во памяти для процесса и всего задания.

* Процесс - контейнер для ресурсов. У каждого процесса есть 4-гигабайтное адресное пространство, в котором юзер занимает нижние 2 гига, а ОС занимает остальную его часть. Таким образом, ОС присутствует в адресном пространстве каждого процесса. У процесса есть:
- идентификатор;
- один или несколько потоков;
- список дескрипторов;
- флаги защиты.
Процессы создаются при помощи API-вызова "CreateProcess", который принимает на входе имя исполняемого файла, определяющего начальное содержимое адресного пространства, и создаёт первый поток. Каждый процесс начинается с одного потока, но новые потоки могут создаваться динамически.

* Потоки - формируют основу планирования ЦП, т.к. ОС для запуска всегда выбирает поток а не процесс. У каждого потока есть состояние: готовый, работающий, блокированный, ..тогда как у процессов состояний нет. Помимо состояния, поток имеет свой идентификатор и два стека. Один стек используется в режиме ядра, другой в режими пользователя.
Таким образом, каждый поток имеет свой:
- идентификатор;
- состояние;
- два стека;
- контекст;
- флаг доступа.
Когда поток завершает свою работу, он прекращает своё существование. Когда отрабатывает последний/активный поток - процесс завершается.

*****************************

Файловые потоки (:stream)

Во время работы, процесс может хранить ограниченное кол-во данных в собственном адресном пространстве. Ёмкость такого хранилища ограничена виртуальной памятью. Для некоторых приложений такого размера вполне достаточно, но для других (например, систем резервирования) виртуального адресного пространства будет недостаточно.

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

Обычное решение этой проблемы состоит в хранении информации на дисках, в модулях, называемых файлами. Процессы могут читать их и создавать новые файлы. Часть ОС работающая с файлами, называется "файловой системой".

Файлами являются либо ASCII, либо двоичные данные. ASCII-файлы состоят из текстовых строк, ..к двоичным файлам относятся все остальные. При выводе бинарного файла на экран, получается невразумительный мусор. Обычно у них есть некая структура известная программе, которая их использует.

Файл в системе NTFS - это не просто линейная последовательность байт. Он состоит из множества атрибутов, каждый из которых представляется в виде потока байтов. Обычно, файл имеет несколько коротких потоков (имя файла, его дескриптор, флаг), ..плюс один длинный "Безымянный поток данных", который, собственно, и хранит основные данные.

Однако, внутри одного файла может существовать и (!)несколько независимых "потоков данных". При обращении к каждому потоку, после имени файла (через двоеточие) указывается имя потока:

    myfile:stream1

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

Как было сказано, основное тело файла хранится в "безымянном потоке", но мы можем создавать и свои потоки. Чтоб продемонстрировать эту фишку, создадим файл с двумя потоками данных, через бат-файл. Откроем любой текстовый редактор, вобъём следующие строки и сохраним файл как *.bat:

    @echo off
    echo "Hello Whatis!" > readme.txt:xxx

Здесь, мы создаём текстовый файл "readme.txt" с вложенным потоком ":xxx".
После запуска батника, в той-же папке видим созданный нами файл "readme.txt", ..(!)с нулевой длиной. Как это с нулевой длиной?! А наше восклицание где?! Запустим "readme.txt" на выполнение и.. ни хрена не видим.

Всё правильно! Если не указано имя потока, то NTFS отображает основной/безымянный поток с данными, а он у нас пустой. Размеры остальных потоков не отображаются и чтобы дотянуться до их содержимого, имя потока должно быть указано явно. Вводим в командной строке:

    more < readme.txt:xxx

..и вот оно, наше приветствие. Нужно сказать, что такой фокус прокатит только с файловой системой NTFS. FAT отдыхает.

Будем мыслить так: раз создание дополнительных потоков не изменяет видимых размеров файла, то наше пребывание в нём, скорее всего, останется незамеченым. Конечно, чтобы передать управление на свой/именованный поток, необходимо модифицировать безымянный поток.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#5 24-07-2014 10:11:12

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

4.ВИРУСЫ НАСТОЯЩЕГО

       Понятие X-кода
       Формат РЕ-файла
       Чего нельзя делать с PE-файлом
       Обзор механизмов внедрения
       Окупация PE-заголовка


Понятие X-кода

Код, внедряющийся в файл, мы будем называть "X-кодом". Репродуктивные способности X-кода в данной статье не рассматриваются, в пользу разработчиков антивирусов. Всю ответственность за внедрение берёт на себя человек, запускающий программу-внедритель, которая записывает X-код внутрь файла-жертвы.

Цели и задачи X-кода

Перед X-кодом стоят, по меньшей мере, 3 серьёзных задачи:
- разместить своё тело внутри жертвы;
- перехватить управление до начала выполнения основной программы;
- определить адреса API-функций, жизненно/важных для собственного функционирования.

Перехват управления обычно осуществляется следующими путями:
- переустановкой точки входа на тело X-кода;
- внедрением в окрестности оригинальной точки входа, команды перехода на X-код;
- "JMP" на тело X-кода с последующей передачей управления по оригинальному адресу;

Существуют 4 способа внедрения:
- размещение X-кода поверх оригинальной программы (затирание);
- размещение X-кода в свободном месте программы (интеграция);
- дописывание X-кода в начало/конец файла с сохранением оригинального содержимого;
- размещение X-кода вне основного тела жертвы (например, в DLL или NTFS-потоке).

X-код должен быть предельно компактным, поскольку объём пространства, очень ограничен. Имеет смысл разбить X-код на две части: крошечный загрузчик и хвост. Загрузчик лучше-всего разместить в PE-заголовке, а хвост сбросить в NTFS-поток, комбинируя тем-самым различные методы внедрения.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#6 24-07-2014 10:11:54

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Формат РЕ-файла

Знакомство с РЕ-файлом мы начнём с того, что создадим в FASM'е диалоговое окно "Hello World!", загрузим полученный экзешник в HIEW (WinHex) и разберём его по-кусочкам. Вот исходник на FASM'e:

Код:

    include 'include\win32ax.inc'
    .code
     start:
      invoke MessageBox,HWND_DESKTOP,"Hello World!","Whatis.ru",MB_OK
      invoke ExitProcess,0
    .end start

Загрузив файл в HIEW, жмём 2 раза "Enter" и F8. Видим информацию о РЕ-заголовке:

    ************************************************************
                          * PE-header *

    Версия линкера       : 1.67     Размер образа        : 3000h
    Сигнатура            : 4D5Ah    Секция выравнивания  : 1000h
    Количество секций    : 2         Контрольная сумма    : D279h
    Размер опц.заголовка : 00Е0h    Кол-во оверлеев      : 00h
    Точка входа RA       : 0040h    Страниц в файле      : 01h
    Размер иниц.данных   : 00h        Байт в странице      : 80h
    ************************************************************

Все PE-файлы начинаются с ЕХЕ-заголовка (MZ), за концом которого следует DOS-заглушка (stub). Далее идёт PE-заголовок, начинающийся непосредственно за концом DOS-заглушки.

На самом деле, РЕ-заголовок может быть расположен в любом месте файла (в середине/конце), т.к. загрузчик определяет его положение по двойному слову, смещённому на 3Ch байт от начала файла.
HIEW показывает нам, что двойное слово по адресу 003С имеет значение "80 00 00 00". Отражаем байты по-горизонтали и получаем адрес 0080h, пройдя по которому видим РЕ-заголовок:

                ; Окно "Hello World!" открытое в HIEW'e

            0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

    0000   4D 5A 80 00 01 00 00 00  04 00 10 00 FF FF 00 00   MZЂ.........яя..
    0010   40 01 00 00 00 00 00 00  40 00 00 00 00 00 00 00   @.......@.......
    0020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0030   00 00 00 00 00 00 00 00  00 00 00 00 80 00 00 00   ............Ђ...
    0040   0E 1F BA 0E 00 B4 09 CD  21 B8 01 4C CD 21 54 68   ..є..ґ.Н!ё.LН!Th
    0050   69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F   is program canno
    0060   74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20   t be run in DOS
    0070   6D 6F 64 65 2E 0D 0A 24  00 00 00 00 00 00 00 00   mode...$........
    0080   50 45 00 00 4C 01 02 00  67 E0 5A 47 00 00 00 00   PE..L...gаZG....
    0090   00 00 00 00 E0 00 0E 01  0B 01 01 43 00 00 00 00   ....а......C....

PE-заголовок представляет собой 17h-байтовую структуру данных, описывающую характеристики файла и содержащую "PE\x0\x0" сигнатуру, по которой файл и отождествляется:

                         ; Дамп РЕ-заголовка
    0080   50 45 00 00 4C 01 02 00  67 E0 5A 47 00 00 00 00   PE..L...gаZG....
    0090   00 00 00 00 E0 00 0E 01                            ....а...

Непосредственно за концом PE-заголовка, следует Опциональный заголовок (Optional header), описывающий структуру страничного образа более детально (базовый адрес загрузки, размер образа, степень выравнивания и т.д.).

Важной структурой "Опционального заголовка" является DATA_DIRECTORY, представляющая собой ссылки на подчиненные структуры данных, такие как: таблицы экспорта/импорта, отладочную информацию, таблицу перемещаемых элементов и т.д.

Типичный размер "Опционального заголовка" составляет E0h байт, но может варьироваться в ту или иную сторону. Его размер хранится в PE-заголовке (слово, по смещению 14h от начала заголовка), так что эти две структуры очень тесно связаны:

                      ; Опциональный заголовок
    0090                            0B 01 01 43 00 00 00 00           ...C....
    00A0   00 00 00 00 00 00 00 00  00 10 00 00 00 00 00 00   ................
    00B0   00 00 00 00 00 00 40 00  00 10 00 00 00 02 00 00   ......@.........
    00C0   01 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00   ................
    00D0   00 30 00 00 00 02 00 00  34 2F 00 00 02 00 00 00   .0......4/......
    00E0   00 10 00 00 00 10 00 00  00 00 01 00 00 00 00 00   ................
    00F0   00 00 00 00 10 00 00 00  00 00 00 00 00 00 00 00   ................
    0100   00 20 00 00 92 00 00 00  00 00 00 00 00 00 00 00   . ..’...........
    0110   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0120   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0130   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0140   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0150   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0160   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0170   00 00 00 00 00 00 00 00                            ........

За концом опционального заголовка следует суверенная территория, оккупированная Таблицей секций. Политическая принадлежность её весьма условна. Ни к одному из заголовков она не принадлежит и является самостоятельным заголовком безымянного типа. Редкое внедрение в исполняемый файл обходится без правки таблицы секций, поэтому эта структура для нас ключевая.

Обычно, исполняемый файл имеет три секции:
- секция кода (.text);
- секция данных (.idata);
- секция ресурсов (.rsrc).

Таблица секций состоит из заголовков, и непосредственно самих секций. Каждый заголовок имеет размер 27h байт и описывает свои секции. HIEW (показавший нам инфу о РЕ-файле по F8) увидел в нашем экзешнике 2 секции, которые мы и видим в дампе ниже. Третий заголовок (секция ресурсов) - у нас пустой, т.к. наш файл не импортирует никакие ресурсы (jpg/mp3 и т.д):

                         ; Заголовки секций
    0170                            2E 74 65 78 74 00 00 00           .text...
    0180   33 00 00 00 00 10 00 00  00 02 00 00 00 02 00 00   3...............
    0190   00 00 00 00 00 00 00 00  00 00 00 00 20 00 00 60   ............ ..`

    01A0   2E 69 64 61 74 61 00 00  92 00 00 00 00 20 00 00   .idata..’.... ..
    01B0   00 02 00 00 00 04 00 00  00 00 00 00 00 00 00 00   ................
    01C0   00 00 00 00 40 00 00 C0                            ....@..А

    01C0                            00 00 00 00 00 00 00 00           ........
    01D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    01E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

Как правило, с каждой секцией связано 4 атрибута:
- размер секции в файле;
- адрес начала секции в файле (RA - RelativeAdress);
- виртуальный адрес секции в памяти (RVA - Relative/VirtualAdress);
- флаги секции, описывающие права доступа

Так-как структура всех заголовков идентична, разберёмся с их адресами, на примере заголовка секции кода ".text". После двоеточия указаны смещения от начала заголовка, в скобках - текущее значение:

    0170                            2E 74 65 78 74 00 00 00           .text...
    0180   33 00 00 00 00 10 00 00  00 02 00 00 00 02 00 00   3...............
    0190   00 00 00 00 00 00 00 00  00 00 00 00 20 00 00 60   ............ ..`

    * адрес начала секции   : 14h (00 02 00 00 = 0200h)
    * размер секции         : 08h (33 00 00 00 = 0033h)
    * вирт.адрес в памяти   : 0Ch (00 10 00 00 = 1000h)
    * флаги доступа         : 24h (20 00 00 60 = 60000020h)


                  ; Секция кода (адрес-200, размер-33)
    0200   6A 00 E8 0A 00 00 00 57  68 61 74 69 73 2E 72 75   j.и....Whatis.ru
    0210   00 E8 0D 00 00 00 48 65  6C 6C 6F 20 57 6F 72 6C   .и....Hello Worl
    0220   64 21 00 6A 00 FF 15 7C  20 40 00 6A 00 FF 15 5E   d!.j.я.| @.j.я.^
    0230   20 40 00 00                                        @...

Для секции ".idata" будет следующее:
    начало лежит по адресу 01В4h (0400);
    размер лежит по адресу 01A8h (0092);

                ; Секция данных (адрес-400, размер-92)
    0400   56 20 00 00 00 00 00 00  00 00 00 00 3C 20 00 00   V ..........< ..
    0410   5E 20 00 00 74 20 00 00  00 00 00 00 00 00 00 00   ^ ..t ..........
    0420   4A 20 00 00 7C 20 00 00  00 00 00 00 00 00 00 00   J ..| ..........
    0430   00 00 00 00 00 00 00 00  00 00 00 00 4B 45 52 4E   ............KERN
    0440   45 4C 33 32 2E 44 4C 4C  00 00 55 53 45 52 33 32   EL32.DLL..USER32
    0450   2E 44 4C 4C 00 00 66 20  00 00 00 00 00 00 66 20   .DLL..f ......f
    0460   00 00 00 00 00 00 00 00  45 78 69 74 50 72 6F 63   ........ExitProc
    0470   65 73 73 00 84 20 00 00  00 00 00 00 84 20 00 00   ess.„ ......„ ..
    0480   00 00 00 00 00 00 4D 65  73 73 61 67 65 42 6F 78   ......MessageBox
    0490   41 00 00                                           A..

Ещё есть такия фишка, как выравнивание адресов. Выравнивать их нужно тогда, когда секции недостигают, или вылетают за пределы 200h байт, т.к. минимальная кратность выравнивания адресов компилятором, составляет именно 200h байт (1 параграф).

Как было сказано выше, наша "секция кода" имеет размер 33h байт, и начинается с адреса 200h, ..значит заканчивается на 400h. Именно поэтому, пространство от 233h до 400h забито в дампе нулями. Тоже-самое и с "секцией данных": начинается с 400h и заканчивается 600h при размере 92h:

                    ; Выравнивание секции данных
    0490            00 00 00 00 00  00 00 00 00 00 00 00 00      .............
    04A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    04B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    ....   .. .. .. .. .. .. .. ..  .. .. .. .. .. .. .. ..
    05E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    05F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

..а что будет, если размер данных в секции, составляет 210h байт? Тогда компилятор выделит 400h байт, 1F0 из которых забьёт нулями, ..а мы сможем поиметь их, если захотим.

За концом последней секции, раскинулось болото ничейной области, не принадлежащей ни заголовкам, ни секциям и образовавшееся в результате выравнивания физических адресов всего программного кода. Таким образом, суммарный объём кода в целом, всегда кратен 200h байт.

Теперь, когда мы подробно разобрали структуру исполняемого файла, представьте, что будет с ним, если попытаться внедрить в его тело наш Х-код. Как говорил дедушка Д.Нагиева: "..он окажется в капкане, как мужик по-среди женской бани". Вся структура его нарушится, заголовки не найдут по указанным адресам своих данных. Без соответстующих поправок в таблицах секций, и пересчёта/выравнивания всех адресов, виндовый загрузчик просто пошлёт нас, выдав сообщение: "Файл не является приложением Win-32". Такие вот дела..


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#7 24-07-2014 10:14:22

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Чего нельзя делать с PE-файлом

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

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

Поскольку секции располагаются в файле по выровненным адресам, между ними практически всегда остается свободное пространство, уверенно вмещающее в себя крохотный загрузчик, подкачивающий "хвост" вируса из оверлея или NTFS-потока. Как вариант, можно увеличить размер последней секции и записаться в её конец.

Все секции стандартного PE-файла используют только физическую адресацию, а это значит, что с незначительной правкой адресов, мы можем свободно перемещать секции внутри дискового образа: менять их местами, внедрять между ними оверлеи и всё это никак не скажется на работоспособности файла, поскольку страничный имидж во всех случаях будет один и тот-же!

Это не покажется удивительным, если вспомнить, что виртуальный и физический адреса каждой секции хранятся в различных полях, поэтому внедрение кода в середину файла, ещё не означает внедрения в середину его виртуального образа в ОЗУ.

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

А что если попробовать внедриться перед началом кодовой секции (.text), передвинув её начало в область младших адресов (00-младший адрес, FF-старший адрес)? Виртуальный образ окажется при этом практически нетронутым и останется лежать по тем-же-самым адресам. Это сохранит файлу работоспособность, и лишит нас полового контакта с перемещаемыми элементами и прочими служебными структурами. Всё это так, за исключением одного "но". Первая секция большинства файлов уже начинается по наименьшему из всех/доступных адресов и передвигать её просто некуда.

С динамическими библиотеками (.idata) ситуация не так плачевна, однако сложность реализации внедряемого кода просто чудовищна, к тому-же нестандартный адрес загрузки сразу бросается в глаза. Так что, ценность этого приема очень сомнительна.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#8 24-07-2014 10:14:57

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Обзор механизмов внедрения

К категории "А" относятся механизмы, не вызывающие изменения адресации ни физического, ни виртуального образов. После внедрения в файл ни его длина, ни количество выделенной при загрузке памяти не изменяется, и все базовые структуры остаются на своих прежних адресах.
Этому условию удовлетворяют:
- внедрение в пустое место файла (PE-заголовок, хвосты секций, регулярные последов.);
- внедрение путем создания нового NTFS-потока внутри файла.

К категории "B" относятся механизмы, вызывающие изменения адресации только физического образа на диске. После внедрения в файл, его длина увеличивается, однако количество выделенной при загрузке памяти не изменяется и все структуры файла проецируются по тем-же самым адресам.

К категории "С" относятся механизмы, вообще не дотрагивающиеся до файла-носителя и внедряющиеся в его адресное пространство косвенным путем, например, модификацией ключа реестра, ответственного за автоматическую подгрузку DLL. Этой технологией интересуются в первую очередь сетевые черви и шпионы. Вирусы к ней равнодушны.

Если мы начнём обсуждать здесь все методы внедрения, то свет увидит эту статью не раньше 15 года, поэтому ограничимся только категорией "А", как наименее трудоёмкой.

Проще всего внедриться в пустое место файла. На сегодняшний день, таких мест известно три:
- PE-заголовок;
- хвостовые части секций;
- регулярные последовательности.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#9 24-07-2014 10:15:46

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Окупация PE-заголовка

Типичный PE-заголовок вместе с DOS-заглушкой и заголовками секций, занимает ~300h байт, а минимальная кратность выравнивания секций, как мы уже знаем = 200h байт. Таким образом, между концом заголовка и началом 1-ой секции, практически всегда имеется ~100h бесхозных байт, которые можно использовать для "производственных целей", размещая здесь либо весь Х-код целиком, либо только его загрузчик, считывающий своё продолжение из дискового файла, NTFS-потока или реестра:

              ; ~100h бесхозных байт в виндовом блокноте
    0300   4E 54 44 4C 4C 2E 44 4C  4C 00 47 44 49 33 32 2E   NTDLL.DLL.GDI32.
    0310   64 6C 6C 00 55 53 45 52  33 32 2E 64 6C 6C 00 00   dll.USER32.dll..
    0320   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0330   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0340   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0350   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0360   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0370   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0380   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0390   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0400   EF 6F DC 77 17 6C DC 77  25 BA DE 77 05 BD DE 77   пoЬw.lЬw%єЮw.ЅЮw
    0410   AB 7A DC 77 42 78 DC 77  57 D7 DC 77 00 00 00 00   «zЬwBxЬwWЧЬw....

Перед внедрением в РЕ-заголовок, X-код должен убедиться, что хвостовая часть заголовка действительно свободна. Подтягивать хвост РЕ-заголовка к началу первой секции - обычная практика большинства линкеров, усматривающих в этом гармонию высшего смысла.

Сканирование таких заголовков обычно выявляет длинную цепочку нулей, расположенных в его хвосте и, очевидно, никак и никем не используемых. Может-ли X-код записать в них свое тело? Да, может, но только с предосторожностями. Необходимо отсчитать, по меньшей мере, 10h байт от последнего ненулевого символа, оставляя этот участок нетронутым (т.е. в дампе выше, с адреса 0330h). В конце некоторых структур присутствует до 10h нулей, искажение которых ни к чему/хорошему не приведёт.

Некоторые программисты пытаются проникнуть в DOS-заголовок и заглушку. Действительно, загрузчик Windows реально использует всего лишь 6 байт: 2-хбайтную сигнатуру "MZ" (адрес=00h), и 4-хбайтный указатель на РЕ-заголовок "e_lfanew" (адрес=3Ch). Остальные-же его никак не интересуют и могут быть использованы X-кодом:

                      ; секция MS-DOS блокнота
    0000   4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZђ.........яя..
    0010   B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ё.......@.......
    0020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0030   00 00 00 00 00 00 00 00  00 00 00 00 E0 00 00 00   ............а...
    0040   0E 1F BA 0E 00 B4 09 CD  21 B8 01 4C CD 21 54 68   ..є..ґ.Н!ё.LН!Th
    0050   69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F   is program canno
    0060   74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20   t be run in DOS
    0070   6D 6F 64 65 2E 0D 0D 0A  24 00 00 00 00 00 00 00   mode....$.......
    0080   EC 85 5B A1 A8 E4 35 F2  A8 E4 35 F2 A8 E4 35 F2   м…[ЎЁд5тЁд5тЁд5т
    0090   6B EB 3A F2 A9 E4 35 F2  6B EB 55 F2 A9 E4 35 F2   kл:т©д5тkлUт©д5т
    00A0   6B EB 68 F2 BB E4 35 F2  A8 E4 34 F2 63 E4 35 F2   kлhт»д5тЁд4тcд5т
    00B0   6B EB 6B F2 A9 E4 35 F2  6B EB 6A F2 BF E4 35 F2   kлkт©д5тkлjтїд5т
    00C0   6B EB 6F F2 A9 E4 35 F2  52 69 63 68 A8 E4 35 F2   kлoт©д5тRichЁд5т
    00D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

Разумеется, о последствиях запуска такого файла в голой MS-DOS лучше не говорить, но MS-DOS уже давно труп. Некоторые PE-загрузчики проверяют все поля DOS-заголовка, поэтому без особой нужды лучше в них не лезть, а вот использовать для своих нужд DOS-заглушку можно.

Достаточно многие системные загрузчики не способны транслировать виртуальные адреса, лежащие к западу от PE-заголовка, что препятствует размещению в MS-DOS-заглушке служебных структур PE-файла. Даже не пытайтесь внедрять сюда таблицу импорта или таблицу перемещаемых элементов! А вот тело X-кода внедрять можно.

В общем случае, внедрение в РЕ-заголовок осуществляется так:
- сканируем заголовок на непрерывную цепочку нулей, и если она будет найдена, внедряем Х-код начиная с 10h байта от её начала;
- внедряем X-код в DOS-заглушку, не сохраняя её старого содержимого;
- если внедрение прошло успешно, передаём управление на X-код;


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#10 24-07-2014 10:17:24

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

5.АНТИВИРУСЫ

       Антивирусная технология
       Класификация средств защиты
       Проверка целостности
       Трепанация антивируса
       Ответный удар мелкософта


Антивирусная технология

Вирусы пытаются спрятаться, а пользователи пытаются их обнаружить, играя таким образом в кошки-мышки. Вирусы могут прятаться в дефектных секторах диска и в реестре. BIOS и CMOS, так-же могут использоваться в качестве норы, ..хотя до BIOS'а не так просто добраться, а CMOS-память слишком мала. Остаются испольняемые файлы и документы, хранящиеся на винте.

Очевидно, что юзер вряд-ли сможет сам обнаружить малвари, поэтому на рынке появились антивирусы. У антивирусных компаний есть лаборатории, в которых учёные исследуют новые вирусы. Первый шаг заключается в том, чтобы заразить вирусом программу, не выполняющую никаких функций, часто называемую "козлом отпущения". Это делается для того, чтоб получить вирус в его чистейшей форме. Следующим шагом будет выдирание точного листинга кода вируса и помещения его в базу данных известных вирусов.

После установки, антивирус сканирует все исполняемые файлы на диске, сравнивая их со своей базой данных. Если у юзера 10 000 файлов, а у антивируса в базе данных хранятся данные на столько-же вирусов, то чтобы сканирование проходило быстро, требуется очень умное программирование.

Поскольку незначительные мутации известных вирусов появляются постоянно, антивирус должен распознать заразу, несмотря на такие мутации. Однако такой способ может привести к ложным тревогам. Юзер при этом получает сообщение, типа: "..возможно заражён вирусом Х.". Чем больше вирусов в базе данных, тем больше будет ложных тревог. Но если антивирус будет искать более точное соответствие, то он может пропустить некоторые модифицированные вирусы. Найти золотую середину не так просто. В идеале, антивирус должет найти в вирусе неизменное ядро и использовать его для идетнификации вируса.

Поскольку процесс сканирования занимает много времени, эффективнее проверять только те файлы, которые были изменены с момента последнего сканирования. Ну и вирус не Васик, ..он обязательно сохранит дату заражаемого им файла, чтобы избежать обнаружения. Игра в кошки-мышки продолжается!

Антивирус (для обнаружения изменения файлов) может сохранять в своей базе размеры всех файлов на диске (рис."А"). Если размер файла увеличился, то это может означать, что он заражён. Но как говорил дедушка Дмитрия Нагиева: -"Человека без бровей трудно удивить!", ..а вирусы как мы знаем - без бровей. Он может сжать заражённый файл, и дополнить длинну до оригинала (рис."B"). Чтобы эта схема работала, вирус должен содержать процедуры сжатия и декомпрессии в своём теле:

           =A=                =B=
    +---------------+    +---------------+
    |               |    |     Вирус     |
    |               |    |               |
    |  Исполняемая  |    +---------------+
    |   программа   |    |  Декомпрессор |
    |               |    +---------------+
    |               |    |   Компрессор  |
    |               |    +---------------+
    |               |    |    Сжатая     |
    |               |    |  исполняемая  |
    |               |    |   программа   |
    |               |    |               |
    +---------------+    +---------------+
    |   Заголовок   |    |   Заголовок   |
    +---------------+    +---------------+

Другой метод маскировки, заключается в шифровании вирусом своего тела, причём каждый раз используется новый ключ. Прежде чем создать новую копию, вирус формирует случайный 32-разрядный ключ шифрования, например складывая по модулю +2 системное время с содержимым некоторых слов в памяти. Затем (с этим ключом) так-же по модулю 2 складывается слово-за-словом весь код вируса. Ключ шифрации/дешифрации хранится в самом вирусе.

Эта схема всё-ещё остаётся не совершенной, т.к. во всех копиях вирусов будут храниться одинаковые процедуры компресии/шифрации, что будет являться для антивируса мишенью. Скрыть процедуры компресии/шифрации вирусом не сложно, ..их можно зашифровать вместе с телом самого вируса, но процедура де'шифрации не может быть зашифрована. Она должна быть готова расшифровать все остальные части вируса. Антивирусы это знают и охотятся именно за процедурами дешифрации.

Однако борьба на этом не заканчивается, поэтому хакер поступает следующим образом. Предположим, что процедуре дешифрации требуется выполнить следующее вычисление:

    x = (a + b + с - 3)

Вариант ассемблерной программы, реализующей эту функцию приведён ниже.
Антивирус ловит и заносит в свою базу первый вариант. Но стоит разработчику вируса добавить команду "NOP" (No Operation), как антивирус пропускает её между ног (вариант #2):

       (1)             (2)
    mov ax, a        mov ax, a
    add ax, b        nop
    add ax, с        add ax, b
    sub ax, 3        nop
    mov x, ax        add ax, с
                     sub ax, 3
                     mov x, ax

Таким образом, существует масса способов сокрытия дешифрующей процедуры. Вместо команды "NOP" можно использовать самые разнообразные команды, не влияющие на ход вычисления. Например, можно прибавить 0, выполнить оперцию "ИЛИ" с самим-собой, сдвинуть регистр на 0 разрядов, передать управление на следующую команду и т.д.

Вирус, мутирующий при каждой операции копирования, называется полиморфным вирусом. Научить антивирусы распознавать функционально одинаковые процедуры теоритически возможно, но практически нереально, т.к. это сильно замедлит сканирование файлов.

Хорошо написанный мутационный механизм, может стать кошмаром для создателей антивирусов. Единственное утешение состоит в том, что подобный механизм довольно трудно написать, поэтому создатели вирусов, как правило, используют уже кем-то написанный мутационный механизм. Это означает, что в обороте различных механизмов не так уж-то и много.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#11 24-07-2014 10:19:22

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Классификация средств защиты

1. Простейшим средством защиты от вируса является программа, позволяющая составить список заражённых программ. Мы будем называть такую программу "детектором". Детектор может быть как нерезидентным, так и резидентным. В этом случае после загрузки программы он проверяет её на заражённость и, если вирус не обнаружен, передает ей управление.

2. Вторым средством защиты являются "фаги" - программы, выкусывающие вирус из зараженной программы и тем самым восстанавливающие её в виде, близком к первоначальному. Операция выкусывания не всегда бывает успешной. Фаги, также могут быть резидентными, однако из-за значительного объёма резидентные фаги встречаются редко.

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

4. Четвёртый тип - это "ревизоры", которые подсчитывают контрольные суммы и сравнивают их с эталонными. Эталоны обычно хранятся в отдельном файле. Этот вид контроля представляется наиболее надёжным.

5. И, наконец, наиболее изощрённым типом антивирусных программ являются т.н. "вакцины".
Подобно медицинским вакцинам они изменяют среду функционирования вируса таким образом, что он теряет способность к размножению. Вакцины могут быть пассивные или активные. Пассивная вакцина представляет собой пакетную программу, которая обрабатывает файл специальным образом. Обычно при такой обработке проставляется признак, который вирус использует для отличия заражённых программы от незаражённых.

Например, некоторые вирусы дописывают в конец заражённых файлов определенную строку (скажем, MsDos). Если искусственно дописать в конец всех программ эту строку, то такие программы не будут заражаться вирусом, поскольку он будет считать, что они уже заражены. Обработанная таким образом программа является вакцинированной против данного вируса, причём операция вакцинации  является обратимой: когда опасность заражения будет ликвидирована, строку можно из файла удалить.

Другие вирусы, проставляют в поле даты заражаемых программ значение секунд, равное 62. Вакцина может проставить этот признак у всех выполняемых программ, которые тем самым будут защищены от заражения данным типом вируса.

Простейшая вакцина представляет собой модифицированный вирус, с кастрированной функцией размножения. Более сложные вакцины (поливакцины) имитируют наличие в ОЗУ нескольких вирусов.

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

Проверка целостности

Принципиально другой метод обнаружения вирусов заключается в проверке целостности файлов. Антивирус сначала сканирует винт в поисках вирусов. Убедившись, что диск чист, он считывает и сохраняет контрольные суммы всех исполняемых файлов в своей базе. Заражённый файл будет тут-же обнаружен по несовпадению CRC.

Однако, вирусы могут подделывать такие/сохранённые файлы антивирусов с чек-суммами. Лучшим вариантом для защитников программ является шифрование файла контрольных сумм с использыванием флэш/смарт-карты, хранящейся вне компьютера, чтобы вирусы не смогли до него добраться.

Другая стратегия состоит в проверке поведения программ. При этом антивирус (являясь резидентным) перехватывает все системные вызовы. Например, ни одна нормальная прога не должна тыкаться в загрузочный сектор, поэтому такие попытки наверняка свидетельствуют о деятельности вируса. Изменение содержимого BIOS, тоже является крайне подозрительным.

..но бывают-же и исключения! Например, перезапись исполняемого файла необычна, если только это не делает компилятор. Или если "Word" перезаписывает свои макросы, это не обязательно свидетельствует об активности вируса. В таких случаях, антивирус должен предоставлять выбор принятия решения, юзеру.

Захватывающие сражения антивируса с вирусом могут начаться при встрече их в ОЗУ (оба резидентные). Местом битвы является компьютер бедалаги-юзера, который вовсе не желает, чтобы это происходило именно на его тачке. У вирусов в этой схватке есть приемущество: в отличии от вирусов, антивирусы распространяются открыто и создатели вирусов могут изучить его действия.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#12 24-07-2014 10:22:06

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Трепанация антивируса

Эпоха вирусов закончилась вместе с крушением MS-DOS. В то время, сеть только зарождалась и единственным средством установки софта, были дискеты. Фактически, основными носителями вирусов были не файлы, а люди, поэтому масштабы эпидемии определялись интенсивностью копирования программ. Но копировать программы друг-у-друга, всё равно, что ширяться из одного шприца.

С появлением Сети, пользователи перешли на скачку дистрибутивов с официальных серверов, а вирусам для размножения перестали требоваться люди. Используя дыры в системах безопасности, любой малварь может заразить уязвимые узлы, при этом ему совершенно необязательно внедряться в исполняемые объекты. Зачем привлекать к себе внимание, когда можно ограничиться проживанием в ОЗУ? Такие вирусы принято называть "червями" и это один из наиболее распространенных типов заразы на сегодняшний день.

Ещё существуют вирусы, представляющие обыкновенные ехе-файлы. Свою историю они ведут от "крэкеров". Этот подкласс заразы назвали "троянскими конями". Сейчас, первобытные времена остались позади и большинство троянов уже не уничтожают инфу, а похищают пароли или позволяют управлять компьютером по сети - такие компьютеры называются зомби или дронами.

В настоящее время, антивирусы полностью утратили былую значимость и усиленно пытаются отойти от пропасти, на дне которой они находятся. Вирусы, заражающие исполняемые файлы, сейчас фактически перевелись, а запретить запись в исполняемые файлы средствами ОС намного проще, чем устанавливать антивирусный пакет.

Вся проблема в том, что антивирус может ловить только те вирусы, о которых знает, а вирусы сейчас пишут все кому-не-лень, так что даже при любой оперативности никакой гарантии, что вся зараза будет распознана, у нас нет.

Обычно, бывает достаточно внедрить в точку входа "JMP" на инструкцию неизвестную эмулятору  (например, что-нибудь из набора команд SSE/SSE2) и антивирус скромно пропускает вирус между ног, поскольку переменная длина x86 инструкций не позволяет ему определить начало следующей машинной команды.

Что же касается червей, то это вообще отдельная песня. Удаляют его антивирусы, не удаляют - что толку? Пока есть дыра, он словно феникс из пепла будет появляться вновь-и-вновь.

Еще существует такой тип антивирусов, как ревизоры, в задачу которых входит проверка целостности файлов. Во времена MS-DOS это была хорошая штука, но сейчас винчестеры так разжирели, что процедура сканирования отнимает кучу времени (а если работает в фоне, то это уже тормоза), не говоря уже о том, что начиная с W2K, система сама контролирует целостность жизненно важных файлов через механизм SFC.

Эвристика - это вообще туши свет! Это спец/словечко, способное произвести впечатление на непосвящённого. Это бессмысленное слово используемое в жаргоне, для придания продукту тех черт, которыми он не обладает.

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

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

Ситуация осложняется тем, что многие вирусные приёмы сейчас активно используются протекторами и если эвристик не утихомирить, он отправит в топку добрую половину легальных программ, чего допускать ни как нельзя!

Кстати, ещё во времена MS-DOS была идея создать антивирус, распознающий не вирусы, а.. легальные программы! Тогда, количество существующих вирусов значительно превышало число популярных программ. В антивирусной базе содержатся контрольные суммы легальных программ, рассчитанные по алгоритму MD5, который очень сложно подделать. В результате, факт заражения распознается независимо от алгоритма внедрения, а все неизвестные антивирусу программы попадают в категорию потенциально заражённых. Забавно, но к этой идее антивирусная индустрия начала подходить только сейчас, предлагая услуги по сертификации ПО.

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


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#13 24-07-2014 10:25:04

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

6.НА ЗАДНЕМ ДВОРЕ У ВИРУСА

       Инъекция NOTEPAD'у
       NTFS-потоки на службе у пионера
       Кастрация вирусов


Инъекция NOTEPAD'у

Написать приличную программу в одиночку - практически нереально, поэтому хакеры предпочитают модифицировать уже существующие. Например, можно выпустить "новую" версию Notepad Pro, и выложить на варезный сайт, которую тут-же утянет голодный народ.

Конечно-же, это не руководство к действию, а скорее предостережение. Чтобы научиться разоблачать троянизированные приложения, необходимо научиться троянизировать самому. Сухая теория никого не радовала. Хочешь научиться самообороне - учись драться!

Наши эксперименты будут носить невинный характер. Мы возьмём стандартный блокнот хрюши и будем над ним издеваться (предварительно разорвав лицензионное соглашение от Microsoft на мелкие куски. Оно нам больше не понадобится).

..а вот что понадобится, так это:

    Hex-редакторы  : "HIEW", "HTE" и "WinHex"
    Дизассемблер   : "W32Dasm"
    Компилятор     : "FASM v1.67"

Как мы уже знаем, в Windows-NT транслятор выравнивает адреса по параграфам, размер которых составляет 200h байт. Типичный PE-заголовок (вместе с таблицей секций и MZ-заголовком) занимает чуть/больше 300h байт, ..и транслятору приходится выделять 400h. Таким образом, в нашем распоряжении оказывается ~100h незанятых байтиков. В упакованных файлах, РЕ-заголовок прижат к первой секции практически вплотную, поэтому перед началом внедрения его необходимо распаковать.

Теперь, вскармливаем "Notepad.exe" HIEW'у. Клавиша "Enter" в окне редактора, переводит его в различные режимы: Text, Hex, Decode (это-же можно проделать по F4), ..нам нужен режим "Нех". Прокручиваем файл до напаханной целины сплошных нулей. В нашем случае она начинается с адреса 320h (именно 320h, а не 31Еh, поскольку последние 2 нуля служат завершением строки USER32.DLL и трогать их нежелательно). Выравнивать начало Х-кода совершенно необязательно:

         ; хвост РЕ_заголовка блокнота, ждёт секса с Х-кодом
    0300   4E 54 44 4C 4C 2E 44 4C  4C 00 47 44 49 33 32 2E   NTDLL.DLL.GDI32.
    0310   64 6C 6C 00 55 53 45 52  33 32 2E 64 6C 6C 00 00   dll.USER32.dll..
    0320   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0330   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0340   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0350   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0360   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0370   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0380   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0390   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0400   EF 6F DC 77 17 6C DC 77  25 BA DE 77 05 BD DE 77   пoЬw.lЬw%єЮw.ЅЮw
    0410   AB 7A DC 77 42 78 DC 77  57 D7 DC 77 00 00 00 00   «zЬwBxЬwWЧЬw....

Теперь необходимо определить, по какому адресу в памяти ложится наш notepad.exe, т.е. его базовый адрес загрузки. Жмём в HIEW'e несколько раз клавишу F8 и ищем строку "Image base", ..это и есть базовый адрес в памяти, в нашем случае равный 1000000h. Чтобы указать виртуальный адрес, HIEW ставит перед адресом точку.

Так-же необходимо убедиться, что заголовок действительно распахнут на всю ширину. Он лежит в поле "Size of headers", и в нашем случае равен 400h. Это значит, что при загрузке файла в память, отображаются только первые 400h байт от его начала, а поскольку мы начинаем внедрение с 330h, то размер Х-кода не может превышать 400h-330h=D0h байт. Плохо! Очень плохо!

Следующим шагом необходимо убедиться, что файл не содержит перемещаемых элементов, которые могут испортить всю малину. Ищем поле "Relocations", и если оно НЕ равно нулю, лучше всего отказаться от внедрения.

Контрольную сумму (checksum) править необязательно, ..винда всё-равно её игнорирует (антивирусы, кстати, тоже). Ну разве это не дыра в системе безопасности? Впрочем, для перестраховки её можно обнулить, или рассчитать новую, утилитой "EditBin".

Помимо этого, можно внедряться в концы секций кода/данных/ресурсов, в хвостах которых обычно пасётся ~150h свободных байт, оставленных для выравнивания, чего для полноценной программы явно недостаточно, но на всякий-пожарный будем иметь и эту заначку.

Так, ..с поляной разобрались - едем дальше. Переводим HIEW в режим дизассемблера (F4-Decode), и смотрим, что здесь творится. Нулевым байтам соответствует команда "add [eax],al". Мда, не слишком-то длинный хвост. Бывают хвосты и подлиннее!

..битый, небитого везёт!

Х-код (если только это не вещь в себе), должен как-то взаимодействовать с внешним миром: открывать файлы, устанавливать сетевые соединения, обкладывать матом и т.д. Обычно, для этого используется прямой вызов API-функций, но это не лучший вариант. Намного удобнее использовать библиотечные функции, доставшиеся Х-коду в наследство от жертвы.

Библиотечные функции легко распознаются при помощи "W32Dasm".
Вот, например, адрес функции "MessageBoxW", которая выводит диалоговое окно:

Disassembly of File: NOTEPAD.EXE
Code Offset = 00000400, Code Size = 00007800
Data Offset = 00007C00, Data Size = 00000800

Number of Objects = 0003 (dec), Imagebase = 01000000h

Object01: .text  RVA: 00001000 Offset: 00000400 Size: 00007800 Flags: 60000020
Object02: .data  RVA: 00009000 Offset: 00007C00 Size: 00000800 Flags: C0000040
Object03: .rsrc  RVA: 0000B000 Offset: 00008400 Size: 00008000 Flags: 40000040

Number of Exported Functions = 0 (decimal)
Number of Imported Modules = 9 (decimal)

   Import Module 001: comdlg32.dll
   Import Module 002: SHELL32.dll
   Import Module 003: WINSPOOL.DRV
   Import Module 004: COMCTL32.dll
   Import Module 005: msvcrt.dll
   Import Module 006: ADVAPI32.dll
   Import Module 007: KERNEL32.dll
   Import Module 008: GDI32.dll
   Import Module 009: USER32.dll

Import Module 009: USER32.dll
   Addr:7E3B6534 hint(01E3) Name: MessageBoxW
   Addr:7E377B97 hint(01BE) Name: LoadImageW
   Addr:7E381F7B hint(01DB) Name: MessageBeep

Здесь мы видим, что функция "MessageBoxW" ждёт нас в памяти по адресу 7E3B6534h.
На самом деле, это ещё не сам адрес, а только указатель на него, инициализируемый на стадии загрузки. При необходимости, мы можем вызвать окно из памяти с нужными нам аргументами, типа "Заголовок окна, Текст сообщения, кол-во буттонов и хэндл окна". Вот код:

Код:

xor    eax,eax             ; обнуляем eax
push   30h                 ; буттон
push   lpCaption           ; заголовок окна
push   lpText              ; текст сообщения
push   eax                 ; окно-сирота
call   dword [7E3B6534h]   ; вызываем функцию MessageBoxW

lpCaption db "Hello",0,0
lpText    db "I love you!",0,0

Однако использовать библиотечные функции можно только после того, как отработает стартовый код, иначе нас ждёт облом. В этом вновь поможет WDasm, распознающий функцию "_main" языка Си++, и отправляющий нас прямиком на точку входа блокнота. Идём в меню WDasm и выбираем [Goto->EntryPoint]:

    //********** Program Entry Point *********
    :0100739D  6A70              push 00000070
    :0100739F  6898180001        push 01001898
    :010073A4  E8BF010000        call 01007568

В блокноте, её вызов расположен по адресу :010073A4h. Здесь находится "call 1007568", где 1007568 - адрес в памяти, где расположена точка входа в Notepad. Для перехвата управления, нам достаточно изменить "call 1007568" на свой адрес (в смысле адрес Х-кода).

Внедрение не во-сне, а наяву

Вот мы и подошли вплотную к внедрению. Создадим Х-код, выводящий простое диалоговое окно перед запуском блокнота. Открываем FASM и пишем. ..а что мы, собственно, пишем?!

Поскольку это не совсем обычный файл, транслятор должен знать с какого адреса начинать ассемблирование. Мы решили внедряться в жертву со смещения 330h, так? Базовый адрес загрузки равен 1000000h, следовательно, первый байт Х-кода соответствует адресу 1000330h. Так и запишем: "ORG 1000330h" (org - директива, отвечающая за базирование файла).

Ещё необходимо указать "USE32", чтобы FASM знал, что это 32-разрядный код. Вот, собственно, и все отличия от нормальных файлов. Дальше можно кодить как-обычно. И ещё.. Ведь это notepad.exe под NT и, следовательно, ASCII-функций в нём нет, а импортировать их вручную нам в лом.

..сделаем проще. Поскольку FASM не поддерживает юникода, перекодировку придётся сделать с помощью внешнего редактора, ..того-же Notepad.exe. Это будет последнее его телодвижение в неинфецированном состоянии. Загоняем текст и сохраняем как Юникод, с последующей вставкой в окно FASM'a при помощи директивы "db".

Законченный вариант Х-кода будет иметь следующий/ассемблерный вид:

Код:

org     1000330h               ; адрес начала х-кода в памяти
use32                          ; 32-разрядный код
        pushad                 ; сохраняем все регистры
        xor eax,eax            ; EAX := 0
        push eax               ; uType (диалог с кнопкой ОК)
        push caption           ; указатель на заголовок
        push text              ; указатель на текст в окне
        push eax               ; hWnd (нет владельца окна)
        call dword [7E3B6534h] ; MessageBoxW
        popad                  ; восстанавливаем регистры
        jmp 1007568h           ; прыжок на точку входа
        ret                    ; возвращаемся в стартовый код

caption db "Hello, Whatis!",0,0
text db "I'm infected Notepad.exe",0,0

Ассемблируем программу FASM'ом [F9] и на выходе получаем бинарный файл (пусть будет x_code.bin), с размером 43h байт. Теперь, запускаем WinHex, открываем в нём notepad.exe и открываем x_code.bin. Выделив мышью наш малварь, идём в меню [Правка->CopyBlock->Нех-значения] и перейдя в окно notepad.exe вставляем его с адреса 330h:

               ; x_code.bin, внедрённый в notepad.exe
    0300   4E 54 44 4C 4C 2E 44 4C  4C 00 47 44 49 33 32 2E   NTDLL.DLL.GDI32.
    0310   64 6C 6C 00 55 53 45 52  33 32 2E 64 6C 6C 00 00   dll.USER32.dll..
    0320   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0330   60 31 C0 50 68 3C 03 00  01 68 4A 03 00 01 50 FF   `1АPh<...hJ...Pя
    0340   15 34 65 3B 7E 61 E9 2D  72 00 00 C3 48 65 6C 6C   .4e;~aй-r..ГHell
    0350   6F 20 57 68 61 74 69 73  00 00 49 27 6D 20 69 6E   o Whatis..I'm in
    0360   66 65 63 74 65 64 20 4E  6F 74 65 70 61 64 2E 65   fected Notepad.e
    0370   78 65 00 00 00 00 00 00  00 00 00 00 00 00 00 00   xe..............

    0380   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0390   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    03F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0400   EF 6F DC 77 17 6C DC 77  25 BA DE 77 05 BD DE 77   пoЬw.lЬw%єЮw.ЅЮw

Необходимо отметить, что после внедрения нашей бацилы, размер жертвы увеличился на 43h байт, и хвост РЕ-заголовка вылетел за пределы второго параграфа. Чтоб сохранить структуру файла, необходимо оттяпать торчащий хвост, подогнав тем-самым начало первой секции к адресу 400h (см.дамп выше). Подтверждаем серьёзность своих намерений, нажав комбинацию [Ctrl+S] для notepad.exe.

Первый этап внедрения завершён! Можно проверить notepad.exe на вшивость, запустив его на исполнение, ..он должен просто открыться, не выдавая никаких (оскорбляющих нашу честь) сообщений. Если блокнот запустился, значит мы всё сделали правильно. В противном случае, нужно проверить выравнивание секции, т.к. мы имели контакт только с ней.

И вот наступает последний/завершительный этап: перехват управления у точки входа, вызов которой, как показал нам "W32Dasm", лежит по адресу 10073A4h. Переводим HIEW в режим дизассемблера [F4->Decode], жмём [F5] (Goto) и говорим: ".10073A4h" (с точкой впереди). Здесь должен быть переход на EntryPoint (инструкция CALL). Если таковая имеется, значит мы на месте!

..теперь жмём [F3->F2] (AsmEdit) и вводим "CALL 1000330h", где 1000330h - адрес начала нашего Х-кода. Кстати говоря, HIEW для этой цели непригоден, поскольку неправильно ассемблирует код и всё летит к чертям. Во всяком случае, версия 6.11 ведёт себя именно так. Хорошо подходит для этих целей дизассемблер/редактор "HTE", который необходимо будет скачать.

HTE всё ассемблирует правильно, но переходить к бацилле по перекрестной ссылке наотрез отказывается, считая, что её нет. Ну, нет - и не надо. Нажимаем [F2] (save), чтобы изменения возымели силу и выходим по [F10].

И вот, свершилось! Малварь написан и внедрён в дрозофилу. Осталось проверить, всё-ли мы сделали правильно?! Сердце, наше, стучит в режиме тротлинга, посылая пустые пакеты импульсов по жилам. Enter, и... вылетает долгожданное окно приветствия, подтверждающее присутствие в NOTEPAD.EXE нашего Х-кода:

    +------------------------------+
    | Hello, Whatis!             x |
    +------------------------------+
    |                              |
    |   I'm infected Notepad.exe   |
    |                              |
    |        +-----------+         |
    |        |    OK     |         |
    |        +-----------+         |
    |                              |
    +------------------------------+

По нажатию ОК в этом окне, управление должно передаться оригинальной точке входа в notepad.exe и он запустится в обычном для юзера режиме.

Созданная нами бацилла предельно проста и пользы от неё немного. Но ведь и вреда никакого! Более сложные программы пишутся аналогичным образом и каждый из нас сможет справиться с этой задачей самостоятельно.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#14 28-07-2014 01:21:00

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Тёмные переулки NTFS-потока

Под процессом будем понимать объект, создаваемый Windows (обычно, при загрузке исполняемого модуля) и получающий в единоличное пользование:

1. Виртуальную память, выделяемую для него операционной системой;
2. Дескрипторы открываемых им файлов;
3. Список загруженных им в его собственную память динамических модулей (DLL);
4. Созданные им потоки, исполняемые в собственной памяти процесса.

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

Теперь, что касается под/процесса. Смысл его достаточно прост: каждый процесс в отведенном для него адресном пространстве может порождать ещё процессы. Эти процессы выполняются независимо друг-от-друга и от порождающего их процесса. Однако, порождающий процесс может (при желании) "убить" любой из порождённых им процессов. Такие процессы называют ещё потоками.

Теперь, поговорим о типах многозадачности.
В старой/16-битной Windows, переключение между задачами происходило только тогда, когда задача отдавала управление ОС. Такая многозадачность называется НЕ/вытесняющей. Положение, существовавшее в старой Windows, требовало от программиста выполнения джентльменского правила - не захватывать надолго время ЦП.

В 32-битных ОС, реализована вытесняющая схема многозадачности, в которой переключением между процессами и потоками занимается сама ОС. Если процесс слишком долго выполняет некоторую операцию, то курсор над окном процесса преобразуется в "песочные часы". При этом другие процессы будут по-прежнему выполняться, и Вы сможете переключаться на них. А вот доступ к окну данного процесса может оказаться затруднительным. Решить данную проблему можно разбиением процесса на некоторое количество потоков.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#15 28-07-2014 01:23:26

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Поиск необходимых API-функций

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

Штатные средства Windows не поддерживают работы с именованными потоками и потому добраться до их содержимого не так-то просто. Не существует никакой (стандартной) возможности определить, имеет-ли данный файл именованные потоки или нет.

Давайте спрячем X-код внутрь "notepad.exe", поместив его в именованный поток. При копировании X-кода в NTFS-поток видимый размер "дрозофилы" не увеличивается. Более того, при передачи файла через http для проверки антивирусной службой в on-line, передается только безымянный поток и, естественно, антивирусы в ней ничего не обнаружат. Кстати, большинство антивирусов сканируют только безымянный поток, так что X-код может чувствовать себя в относительной безопасности, тепле, сухости и комфорте.

Стратегия размещения Х-кода внутри дрозофилы, будет выглядеть так:
  1. разместить Х-код в NTFS-потоке;
  2. написать и внедрить загрузчик Х-кода в дрозофилу;
  3. перехватить управление и передать его загрузчику Х-кода;
  4. вернуть управление дрозофиле.

Начнём с того, что создадим окно, и скопирум его в поток:x notepad'а. Код окна:

Код:

include 'include\win32ax.inc'
.code
  start:
    invoke    MessageBox,HWND_DESKTOP,"Matrix has you!","NEO",MB_OK
    invoke    ExitProcess,0
 .end start

После компиляции FASM'ом, получили "matrix.exe" весом 1.5 Кb, который копируем в поток блокнота через командную строку:

    type matrix.exe > notepad.exe:x
    ; ..проверим поток
    more < notepad.exe:x

..если окно cmd отобразило хоть что-нибудь, можно открыть пиво. Обмочив усы, едем дальше и шлифуем Х-загрузчик, который должен будет вызвать наш matrix.exe из именованного потока. Здесь нас поджидает проблема..

Так как наш "matrix.exe" представляет собой готовое приложение, то и вызывать его надо соответствующим образом. Он будет отображаться в своём адресном пространстве, а в коде загрузчика должна быть API-функция запускающая файл на исполнение. Для этой цели API имеет несколько функций, наиболее распространённые из которых: _fopen, CreateProcess, CreateFile.

В предыдущем варианте внедрения (когда мы размещали Х-код внутри дрозофилы), достаточно было обычного перехода на EntryPoint Х-кода, т.к. он располагался в адресном пространстве блокнота. Сейчас-же такой номер не пройдёт, и необходим именно загрузчик.

Запускаем W32Dasm и смотрим, какие из перечисленных API-функций имеет блокнот, чтоб использовать их в нашем загрузчике. Контекстный поиск в Dasm'e нашёл только функцию "CreateFileW", что не есть хорошо - лучше была бы "_fopen", т.к. она имеет меньше параметров и, соответственно, загрузчик получился-бы меньших размеров:

    ; Wdasm отображает VA-адрес функции в пространстве ОС
    Import Module 007: KERNEL32.dll
    Addr:7C8107F0 hint(0052) Name: CreateFileW

    ; ..тогда-как OllyDbg - RVA-адрес ссылки на функцию
    01001104 | F007817C    DD kernel32.CreateFileW

Ну и на том спасибо.. В противном случае, нас ждал-бы импорт библиотеки kernel32 в своё тело, которая раздула-бы наш загрузчик до полноценной программы. ..мда, параметров у "CreateFile" хоть отбавляй.

Важно! Чтоб не искать в сети справочник по API-функциям, достаточно заглянуть в файл [Fasm\source\win32\system.inc], где описаны все/доступные структуры функций. Выбираем какую надо и меняем её параметры на свой лад. Вот выписка из этого файла:

create:
    push    0
    push    0
    push    CREATE_ALWAYS
    push    0
    push    FILE_SHARE_READ
    push    GENERIC_WRITE
    push    edx  ; имя/путь до файла
    call    [CreateFile]
; проверка на ошибку:
    cmp    eax,-1
    je    file_error
    mov    ebx,eax
    clc
    ret

; ..и там-же идут значения параметров:
CREATE_NEW         = 1
CREATE_ALWAYS      = 2
OPEN_EXISTING      = 3
OPEN_ALWAYS        = 4
TRUNCATE_EXISTING  = 5

FILE_SHARE_READ    = 1
FILE_SHARE_WRITE   = 2
FILE_SHARE_DELETE  = 4

GENERIC_READ       = 80000000h
GENERIC_WRITE       = 40000000h


Здесь видно, что CreateFile имеет 7 параметров (push'ей). Два первых параметра (на самом деле последних, т.к. параметры заносятся в стек в обратном порядке) имеют значения нуль и ими можно пренебречь. Это хендл, с буфером временного файла, которые нужны при его создании.. а мы просто открываем файл, указав параметр со значением 4 (OPEN_ALWAYS: открывать не смотря на ошибки).

Следующие параметры в стеке устанавливаем: в 1 (FILE_SHARE_READ: читать) и 80000000h для (GENERIC_READ: читать). В регистр EBX, предварительно, должен быть помещён путь до файла. Мы будем брать его из локальной переменной.

Кстати, если нам нужно было-бы просто сохранить файл по [Ctrl+S], то параметры сократились-бы до трёх (т.к. третий можно было-бы тоже обнулить и проигнорировать его), о чём свидетельствует листинг W32Dasm'a:

* Possible Ref to Menu: MenuID_0001, Item: "Ctrl+S"
* Possible Reference to String Resource ID=00003
* Reference To: KERNEL32.CreateFileW, Ord:0052h
                                  |
:0100339D 6A03                    push 00000003
:0100339F 6800000080              push 80000000
:010033A4 BE28960001              mov esi, 01009628
:010033A9 56                      push esi
:010033AA FF1504110001            Call dword ptr [01001104]

Здесь видим, что имя сохраняемого файла лежит в регистре ESI, ..передаются два параметра, а остальные игнорируются. Переход на функцию CreateFile, валяется в адресном пространстве блокнота по адресу 01001104h, который нам необходимо запомнить.

Теперь, перейдём к исследованию дрозофилы, в нашем случае notepad.exe. В его потоке благополучно разместился наш matrix.exe. Именованный поток мы пока не будем трогать, а займёмся основным/безымянным потоком, т.е. самим блокнотом.

Ради повышения собственной квалификации, не помешало-бы по/эксперементировать с его заголовками - MZ, DOS и РЕ: заполнил кусок нулям - проверил на исполнение, очистил ещё - проверил, и т.д. Как notepad перестанет запускаться, значит вы дошли до критической зоны и нос сюда совать не стоит:

                    ; девственная DOS-заглушка
00000000   4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZђ.........яя..
00000010   B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ё.......@.......
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 00 00  00 00 00 00 E0 00 00 00   ............а...
00000040   0E 1F BA 0E 00 B4 09 CD  21 B8 01 4C CD 21 54 68   ..є..ґ.Н!ё.LН!Th
00000050   69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F   is program canno
00000060   74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20   t be run in DOS
00000070   6D 6F 64 65 2E 0D 0D 0A  24 00 00 00 00 00 00 00   mode....$.......
00000080   EC 85 5B A1 A8 E4 35 F2  A8 E4 35 F2 A8 E4 35 F2   м…[ЎЁд5тЁд5тЁд5т
00000090   6B EB 3A F2 A9 E4 35 F2  6B EB 55 F2 A9 E4 35 F2   kл:т©д5тkлUт©д5т
000000A0   6B EB 68 F2 BB E4 35 F2  A8 E4 34 F2 63 E4 35 F2   kлhт»д5тЁд4тcд5т
000000B0   6B EB 6B F2 A9 E4 35 F2  6B EB 6A F2 BF E4 35 F2   kлkт©д5тkлjтїд5т
000000C0   6B EB 6F F2 A9 E4 35 F2  52 69 63 68 A8 E4 35 F2   kлoт©д5тRichЁд5т

000000D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000000E0   50 45 00 00 4C 01 03 00  87 52 02 48 00 00 00 00   PE..L...‡R.H....

    ; после кастрации DOS-заглушки notepad по-прежнему запускается
00000000   4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZђ.........яя..
00000010   B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ё.......@.......
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 00 00  00 00 00 00 E0 00 00 00   ............а...
00000040   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000050   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000060   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000070   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000080   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000090   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000000A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000000B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000000C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

000000D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000000E0   50 45 00 00 4C 01 03 00  87 52 02 48 00 00 00 00   PE..L...‡R.H....

В наше распоряжение поступило 90h байт свободного пространства, в которое мы и поместим наш загрузчик Х-кода. Так подождите, ..мы-же его ещё не написали! Щас исправим...


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#16 02-08-2014 00:08:34

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

UNICODE - как подводный камень

Как известно, для отображения текстовых строк в NT применяется несколько вариантов, основными из которых являются Unicode и ANSI. API-функции (использующие в своём теле текстовые строки) отличаются друг-от-друга соответствующим литером на конце: "А" - ANSI, и "W" - Unicode. Например: "CreateFileA" (ANSI) и "CreateFileW" (Unicode).

ANSI-символ имеет длинну в 1 байт (1111 1111b) и позволяет закодировать 255 символов. Unicode-символ является расширенным вариантом и имеет длинну 2 байта, что позволяет закодировать уже 65535 символов.

С ANSI всё понятно, но зачем-же нужны ещё и Unicode? Они позволяют выводить всякие/экзотические символы, типа коды стрелок, математических, надстрочных, денежных и прочих единиц.

Экзотика - это так, ..для развлечения (хотя на некоторых сайтах, при регистрации просят ввести какой-нибудь/подобный символ, дабы отсеить танкистов). Для вставки таких символов в свой текст, вы можете запустить MS-WORD (или другой/продвинутый редактор) и вставить в нём символ, с последующим копированием в нужное место. Я пользуюсь текстовым редактором "AkelPad", который прекрасно справляется с поставленной задачей.

Но сейчас, мы поговорим о другом - как загнать Юникод-текст в API-функцию? В основном, этим страдают компиляторы ассемблера, которые не поддерживают Unicode без импорта соответствующих библиотек. В нашем случае, импорт не входит в наши планы, т.к. мы пишем бинарный загрузчик, поэтому следующий способ будет более приемлен.

Задача "NumberOne" - сделать из 1-байтового ANSI, 2-байтовый Unicode. Вот два варианта написания:

    text db "hello",0,0                         ; ANSI-вариант
    text db 'h',0,'e',0,'l',0,'l',0,'o',0,0,0   ; Unicode-вариант

Здесь, мы просто добавляем к каждой букве пустой символ "нуль", переводя тем-самым из 1-байтового, в 2-байтовый Unicode-вариант. Так, мы будем указывать путь до запускаемого файла, и (при надобности) выводить любые текстовые строки, без импорта библиотек.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#17 02-08-2014 00:09:46

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Пишем свой загрузчик

Обычно, загрузчик несёт в себе функцию передачи управления на нужный участок программного кода. Можно ограничится однобайтовой командой JMP, но не в нашем случае, т.к. JMP действует только в адресном пространстве запускаемого процесса. Если открыть в HEX-редакторе файл с вложенным потоком (:stream), то мы не увидим там никаких потоков, ..откуда следует вывод, что поток запускается в своём адресном пространстве и к своему носителю никакого отношения не имеет.

По этой причине, мы решили запускать поток на выполнение через API-функцию CreateFileW.
Пишем код:

Код:

use32
org 1000040h               ; адрес самого-себя

    pushad                 ; сохраняем все регистры
    push  4                ; аргумент открытия (можно создать)
    push  0                ; атрибут безопасности (нам не важно)
    push  1                ; флаг доступа (чтение)
    push  80000000h        ; тип доступа (чтение)
    push  path             ; что запускаем..
    call  dword [1001104h] ; адрес CreateFileW
    popad                  ; восстанавливаем регистры
    jmp   1007568h         ; entry_point блокнота
    ret                    ; всем пока!

path db 'n',0,'o',0,'t',0,'e',0,'p',0,'a',0,'d',0,'.',0,'e',0,'x',0,'e',0,':',0,'x',0,'.',0,'e',0,'x',0,'e',0,0,0

В Windows XP команда start не запускает поток на выполнение, если в названии потока нет ".exe", поэтому я чуть скорректировал загрузчик и переименовал бацилу с matrix.exe, на x.exe. После компиляции (F9 в FASM'е) получаем бинарный файл, который при помощи WinHex, вставляем в блокнот/дрозофилу с адреса 40h. Эта операция неизбежно вытолкнет РЕ-заголовок с адреса 00Е0h. Удаляем ненужный хвост DOS-заглушки и сохранив изменения, выводим из WinHex.

После всех манипуляций, дамп блокнота должен выглядеть так, и ни как иначе:

    0000   4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZђ.........яя..
    0010   B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ё.......@.......
    0020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0030   00 00 00 00 00 00 00 00  00 00 00 00 E0 00 00 00   ............а...
    0040   60 6A 04 6A 00 6A 01 68  00 00 00 80 68 5E 00 00   `j.j.j.h...Ђh^..
    0050   01 FF 15 04 11 00 01 61  E9 0B 75 00 00 C3 6E 00   .я.....aй.u..Гn.
    0060   6F 00 74 00 65 00 70 00  61 00 64 00 2E 00 65 00   o.t.e.p.a.d...e.
    0070   78 00 65 00 3A 00 78 00  2E 00 65 00 78 00 65 00   x.e.:.x...e.x.e.
    0080   00 00
00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    0090   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    00A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    00B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    00C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    00D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
    00E0   50 45 00 00 4C 01 03 00  87 52 02 48 00 00 00 00   PE..L...‡R.H....

Осталось найти точку входа в блокнот, и изменить там адрес на 40h, чтоб задействовать наш загрузчик.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#18 02-08-2014 00:12:37

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Держи ворА! ..или перехват/возврат управления

Вот мы и на финишной/прямой! Запускаем HEX-редактор HTE (HT Edit) и подсовываем ему модернизированный способом выше notepad.exe. Здесь, нам нужен EntryPoint: ..жмём [F6] (mode) и среди прочего барахла, выбираем -PE/IMAGE. Enter переносит нас прямиком к точке входа в программу:

    100739d !
    ....... ! ;****************************
    ....... ! ;  program entry point
    ....... ! ;****************************
    ....... ! entrypoint:
    ....... !   push        70h
    100739f !   push        offset_1001898
    10073a4 !   call        sub_1007568

До этого места, программный код грузил все DLL'ки, описанные в секции импорта ..и теперь мы можем использовать эти библиотеки в своих целях. У точки входа мы видим команду CALL, которая отправляет нас по адресу 1007568h. Если перейти по этому адресу, то мы увидим, что там создаётся окно блокнота, окну присвается хэндл, т.е. запускается блокнот.

..но нас не интересует, что будет потом - нам нужно просто перехватить этот CALL, подставив в него адрес нашего загрузчика, т.е. 1000040h. Орининальный адрес перехода 1007568h нам уже не нужен, ..мы прописали его в последней строке кода загрузчика.

Значит, переходим стрелками в HTE к команде CALL (адрес 10073А4h) и жмём [F4] (edit) и [Ctrl+A] (asm). В появившемся окне обязательно удаляем всё-что-видим [Del], и вводим "call 1000040h". Появилось ещё окно. Опкод команды call у нас 5-байтный, поэтому выбрав в списке вариант с пятью/парами цифр, жмём [Enter] и [F2] (save):

    ....... ! 6a70          push   70h
    100739f ! 6898180001    push   offset_1001898
    10073a4 ! e8978cffff    call   1000040h

Этой махинацией, мы передали управление нашему загрузчику, который вызовет бацилу с файлового потока :stream.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#19 02-08-2014 00:15:32

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Создание собственных библиотек

Описанные выше методы внедрения выручают в подавляющем большинстве случаях, но что делать есть в импорте дрозофилы нет нужных нам API-фукций? Для этого случая существует ещё один метод, и заключается он в импорте своей библиотеки-DLL, который мы сейчас и рассмотрим.

Это совсем нетрудно сделать! Понадобится лишь верный друг HIEW, минимальные навыки программирования на FASM, ..ну и, конечно-же, трава. Без травы - сознание коллапсирует в чёрную дыру, нос висит и мозг ни хрена не работает. Впрочем, мы увлеклись. Вернёмся к технической стороне проблемы, но прежде сделаем одно важное техническое замечание!

Примеры исполняемых файлов, прилагаемые к настоящей статье, совершенно безвредные и могут запускаться без опаски, как с правами администратора, так и без таковых. Хорошая идея - прогнать их через все/имеющиеся у читателя антивирусы и по/наблюдать за их реакцией.

Стратегия

Всякий exe-файл, импортирует несколько динамических библиотек (Dynamic Link Library или, сокращенно, DLL), прописанных в таблице импорта. При запуске exe-файла, системный загрузчик анализирует таблицу импорта, загружает все/перечисленные в ней динамические библиотеки, вызывая функцию DllMain для инициализации каждой DLL, и только после этого передает управление на оригинальную точку входа (Original Entry Point или, OEP) запускаемого *.exe.

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

Подготовка к экспериментам

Прежде чем вторгаться в базовые структуры PE-файла, неплохо-бы получить общее представление о его устройстве. Не буду повторяться и отправлю Вас на/пару постов выше, где описывался формат РЕ-файла, а здесь - просто приведу его графическое представление:

    +--------------------------+
    |      MZ-заголовок        |
    +--------------------------+
    |      DOS-заглушка        |
    +--------------------------+
    |      РЕ-заголовок        |
    +--------------------------+
    |      Опциональный        |
    |       заголовок          |
    +--------------------------+
    |     Заголовки секций     |
    | (text, idata, rscr, bss) |
    |          и т.д.          |
    +--------------------------+
    | Заголовок секции отладки |
    +--------------------------+
    |      Секция .text        |
    +--------------------------+
    |      Секция .idata       |
    +--------------------------+
    |      Секция .rscr        |
    +--------------------------+
    |      Секция .bss         |
    +--------------------------+
    |   Секция отладки DEBUG   |
    +--------------------------+
    |    Секция выравнивания   |
    +--------------------------+

Ок, теперь.. нет, курить пока не будем, а подготовим дрозофилу, предназначенную для внедрения X-кода, пример которой, написанный на FASM'e, приведён ниже:

Код:

include 'win32ax.inc'
include 'encoding\win1251.inc'

.code
  start:
    invoke  MessageBox,HWND_DESKTOP,"Тестовая программа","Импорт DLL",MB_OK
    ret
 .end start

Компилируем код и обзываем его inject.exe, который выдаст нам приветствие на экран:

    +---------------------------+
    | Импорт DLL             X  |
    +---------------------------+
    |    Тестовая программа     |
    |                           |
    |       +----------+        |
    |       |    ОК    |        |
    |       +----------+        |
    +---------------------------+


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#20 03-08-2014 23:27:05

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Трепанация динамических библиотек DLL

Дабы рассеить мутные воды сомнений, рассмотрим простой пример динамической библиотеки, в которой всего лишь одна функция: в нашем случае - вывод приветствия юзеру. Работа с библиотеками программ Win32 заключается в том, что приложение импортирует библиотеку, а библиотека экспортирует экзешнику описанную в своём теле API-функцию. Помоему, ничего мутного..

Ну, ..хватит болтовни и перейдём к действиям. Займёмся подготовкой динамической библиотеки, то есть, того/самого X-кода, который мы будем внедрять внутрь inject.exe. В простейшем случае, можно возыметь API-функцию DllEntryPoint. Вот описание этой функции:

    BOOL WINAPI DllEntryPoint
    Описание:
      HINSTANCE hinstDLL   ; хэндл DLL-модуля
      DWORD fdwReason      ; причина вызова функции
      LPVOID lpvReserved   ; резерв

    Параметры: fdwReason
      DLL_PROCESS_ATTACH   ; реагирует на запуск приложения
      DLL_PROCESS_DETACH   ; реагирует на завершение процесса

Название этой функции переводится как "Точка входа в DLL", а мы уже знаем, что при запуске исполняемого файла в первую очередь идёт инициализация библиотек, а только потом - переход на точку входа программного кода. Данная функия ждёт этой процедуры и реагирует на неё тем-или-иным способом. Эту функцию используют для контроля запускаемых процессов, но хакеры применяют её в своих (не всегда благородных) целях.

Ознакомится с примером вызова функции DllEntryPoint, можно в файле ERRORMSG.ASM, который лежит в папке с установленным FASM'ом: \examples\dll. Переделав этот пример на свой лад, получаем исходник нашей библиотеки x_code.dll :

Код:

    format PE GUI 4.0 DLL   ; // создаём DLL, а не EXE
    include 'win32a.inc'

  section '.code' code readable executable
    proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
        mov  eax,1
        call Malvare    ; // вытягиваем процедуру
        ret 
    endp
; // Создаём фиктивную процедуру
    proc Malvare
     invoke MessageBox,0,"Infected",0,MB_OK   ; // контакт с юзером
     ret
    endp

  section '.idata' import data readable writeable
    library user,'USER32.DLL'
      import user,\
        MessageBox,'MessageBoxA'

  section '.edata' export data readable
    export 'x_code.dll',\  ; // имя библиотеки
      Malvare,'Malvare'    ; // имя функции

После компиляции, на выходе получаем динамическую библиотеку x_code.dll, с вложенной функцией 'Malvare', которая (в зависимости от нашей/вашей фантазии) будет выполнять какие-либо действия.

Другими словами, DllEntryPoint позволяет отслеживать определенные системные события и адекватным способном реагировать на них. В данном случае мы выводим "Infected" перед запуском дрозофилы, ..хотя можно было-бы отследить и завершение процесса.


Знакомство с таблицей импорта

Берём HIEW, открываем в нём "inject.exe", переходим по [ENTER] в hex-режим, давим [F8] для отображения PE-заголовка, жмём [F7] (Dir) и среди прочих элементов, выбираем секцию импорта (Import). Видим, что она находится по RVA-адресу 2000h и имеет размер 92h байт. [ENTER] переносит нас к таблице импорта, о которой мы поговорим чуть/позже, а пока обсудим, как найти её в отсутствии HIEW'а.

Двойное слово, лежащее по смещению 80h от PE-сигнатуры, и будет RVA-адресом, указывающим на таблицу импорта, а следующее двойное слово - хранит её размер:

            ; RVA-адрес таблицы импорта 2000h, размер 92h
00000080   50 45 00 00 4C 01 02 00  67 E0 5A 47 00 00 00 00   PE..L...gаZG....
00000090   00 00 00 00 E0 00 0E 01  0B 01 01 43 00 00 00 00   ....а......C....
000000A0   00 00 00 00 00 00 00 00  00 10 00 00 00 00 00 00   ................
000000B0   00 00 00 00 00 00 40 00  00 10 00 00 00 02 00 00   ......@.........
000000C0   01 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00   ................
000000D0   00 30 00 00 00 02 00 00  34 2F 00 00 02 00 00 00   .0......4/......
000000E0   00 10 00 00 00 10 00 00  00 00 01 00 00 00 00 00   ................
000000F0   00 00 00 00 10 00 00 00  00 00 00 00 00 00 00 00   ................
00000100   00 20 00 00 92 00 00 00

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

    1. Каталог импорта (Impotr Directory Table) IDT
    2. Таблица просмотра импорта (Impotr LookUp Table) ILT
    3. Таблица импортируемых адресов (Impotr Address Table) IAT

Информация импорта начинается с Import Directory Table, которая описывает остальную информацию об импорте. IDT содержит адресную информацию на точки входа внутри образа библиотеки. Она состоит из отдельных входов, как минимум по одному на каждую импортируемую библиотеку, а последний вход, указывающий на конец таблицы - является пустым, т.е. заполнен нулями. В состав IDT входят:

       * Таблица ссылок на имена (LookUp Table)
       * Таблица имён (Name Table)
       * Таблица адресов импорта (IAT)

В реальных файлах нет никаких ограничений на порядок следования участков секции импорта и их можно перемещать в произвольном порядке. Формат одного входа, равен 14h байт и приведён в примере ниже:

             0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

.00402000:  56 20 00 00 00 00 00 00  00 00 00 00 3C 20 00 00
.00402010:  5E 20 00 00

    00 - 03:  ссылка на адрес имени функции в dll
    04 - 07:  DataStamp (время создания, обычно FF или 00)
    08 - 0B:  ForwardChain (передача в другие DLL, обычно FF или 00)
    0C - 0F:  RVA-адрес имени библиотеки (Name_RVA)
    10 - 13:  Ссылка на адрес IAT


              ; таблица импорта нашего Inject.exe,
                      с кастрированной библиотекой User32.dll

.00402000   56 20 00 00 00 00 00 00  00 00 00 00 3C 20 00 00   V ..........< ..
.00402010   5E 20 00 00 XX XX XX XX  XX XX XX XX XX XX XX XX   ^ ..t ..........
.00402020   XX XX XX XX XX XX XX XX  XX XX XX XX XX XX XX XX   ................
.00402030   XX XX XX XX XX XX XX XX  XX XX XX XX 4B 45 52 4E   ............KERN
.00402040   45 4C 33 32 2E 44 4C 4C  00 XX XX XX XX XX XX XX   EL32.DLL........
.00402050   XX XX XX XX XX XX 66 20  00 XX XX XX XX XX 66 20   .......f ......f
.00402060   00 XX XX XX XX XX 00 00  45 78 69 74 50 72 6F 63   ........ExitProc
.00402070   65 73 73 00 XX XX XX XX  XX XX XX XX XX XX XX XX   ess.............
.00402080   XX XX XX XX XX XX XX XX  XX XX XX XX XX XX XX XX   ................
.00402090   XX XX                                              ..

    ; графическое представление 'Impotr Directory Table'
    +-----+-----+-----+-----+-----+
    |     |  0  |  0  |     |     |
    +--+--+-----+-----+--+--+--+--+
       |                 |     |
       |                 |     +----> Таблица 'IAT.0'
       |                 +---> Имя библиотеки 'kernel32.dll.0'
       +-->'Ссылка.0'
              |
              +---> Имя функции '0.0.ExitProcess.0'

Думаю комменты здесь излишни. Нули в конце/начале означают, что имеются пустые вставки 00h.

Таблица просмотра импорта (Import LookUp Table).
Имена библиотек содержатся в NameTable. Ее формат довольно прост: ASCIZ-строка произвольного размера. Строка закрывается нулевым байтом, и при необходимости её длинна выравнивается до чётной границы ещё одним нулём. Имя содержащейся функции чувствительно к регистру, имя самой библиотеки - нет!

Таблица импортируемых адресов (IAT). Процесс импорта заключается в отображении нужных нам DLL в адресное пространство нашего процесса, и сохранении адресов функций из этой DLL, в специально/отведённом для этого месте ― таблице импортируемых адресов (Import Address Table). Эта таблица должна завершаться нулём. Интересным фактом является то, что во многих программах она уже заполнена. Это справедливо, по меньшей мере, для программ самой NT.

Пара/плюшек на заметку! Данная таблица может находиться на своём/старом месте, а вот 'Import Directory Table' можно перенести в другое место. Файл корректируется минимально, и этот вариант подходит нам как/нельзя лучше.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#21 03-08-2014 23:37:50

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Внедрение X-code.dll в таблицу импорта дрозофилы

Для подключения своей DLL, нам необходимо заполнить всего 3 поля:

* RVA-указатель на имя функции 'Malvare' в нашей библиотеке;
* указатель на имя самой библиотеки x_code.dll;
* заполнить таблицу IAT, импортирующую нашу функцию 'Malvare'.

Основная проблема состоит в самой структуре таблицы импорта. Она устроена так, что между таблицей (Import Directory Table) и самими именами, практически нет свободного места, ..а нам нужно вставить туда RVA-указатель на свою DLL.

Как быть? Если тупо записаться в хвост Import DirTable, то мы сместим всю таблицу на несколько десятков байт вниз, и весь программный код полетит к чертям. А что если перенести IDT в какое-нибудь другое место, чтоб ниже шли сплошные нули и мы смогли записаться в её начало/хвост, никому при этом не создавая проблем. А что?! Возьмём и перенесём!

Значит, берём HIEW, открываем в нём "inject.exe", переходим по [ENTER] в hex-режим, давим [F8]->[F7] и выбираем секцию импорта (Import). Видим, RVA-адрес 2000h и размер таблицы импорта 92h байт. [ENTER] переносит нас к таблице импорта (в нашем случае адрес .00402000h).

Здесь, давим [*] (звездочку на цифровой клавиатуре) и перемещаясь курсорными клавишами, выделяем красным цветом 92h байт, после чего давим [*] ещё раз, и нажав [F2] сохраняем блок в файл, для определенности назвав его 'IDT'. Судя по размеру (IDT=92h), ..диапазон копирования должен быть от 00402000h до 00402091h включительно.

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

Теперь, нам необходимо скопировать оригинальную Import Directory Table на новое место, не забыв при этом зарезервировать 14h байт для описания своей DLL, которая будет загружена самой первой (что очень полезно/вредно для борьбы с антивирусами).

Поскольку размер одной структуры составляет 14h байт, а незанятая область начинается с адреса 00402100h, мы должны передвинуть курсор по адресу 00402114h, задавить [*], выделить 92h байт (адреса от 402114 до 4021A5), задавить [*] ещё раз, обязательно переместить курсор в начало выделенного блока, нажать [Ctrl+F2] (Get Block), ввести имя файла, в который мы только/что сохранили "IDT", и считать его с диска:

      Оригинальная ID Table, перемещённая на новое место.
.00402100:  00 00 00 00-00 00 00 00  00 00 00 00-00 00 00 00
.00402110:  00 00 00 00-56 20 00 00  00 00 00 00-00 00 00 00      V
.00402120:  3C 20 00 00-5E 20 00 00  74 20 00 00-00 00 00 00  <   ^   t
.00402130:  00 00 00 00-4A 20 00 00  7C 20 00 00-00 00 00 00      J   |
.00402140:  00 00 00 00-00 00 00 00  00 00 00 00-00 00 00 00
.00402150:  4B 45 52 4E-45 4C 33 32  2E 44 4C 4C-00 00 55 53  KERNEL32.DLL  US
.00402160:  45 52 33 32-2E 44 4C 4C  00 00 66 20-00 00 00 00  ER32.DLL  f
.00402170:  00 00 66 20-00 00 00 00  00 00 00 00-45 78 69 74    f         Exit
.00402180:  50 72 6F 63-65 73 73 00  84 20 00 00-00 00 00 00  Process Д
.00402190:  84 20 00 00-00 00 00 00  00 00 4D 65-73 73 61 67  Д         Messag
.004021A0:  65 42 6F 78-41 00
00 00  00 00 00 00-00 00 00 00  eBoxA
.004021B0:  00 00 00 00-00 00 00 00  00 00 00 00-00 00 00 00

Теперь, возвращаемся в начало файла по [PageUp] и корректируем RVA-адрес таблицы импорта, который в данном случае составит 2114h (а не .00402114h, т.к. это RA-адрес). Причём, с учётом обратного порядка байт, мы должны записать 14 21.

Значит, находим PE-сигнатуру, опускаем курсор вниз на 80h байт, видим там 00 20, жмём [F3] для редактирования, меняем адрес на 14 21, сохраняем изменения по [F9] и выходим... за пивом. Пиво для хакеров - это святое!

Проверяем работоспособность дрозофилы/Inject.exe. Запускаем его на исполнение и (если все операции были проделаны правильно) на экране появится наше приветствие. В противном случае, система откажется загружать файл или выбросит исключение. Как видим, после переноса таблицы импорта на новое место, ни одного тушканчика не пострадало, и исполняемый файл благополучно запускается.

Смочив горло пивом, приступаем к самой сложной и самой ответственной части - заполнению структуры IMAGE_IMPORT_DESCRIPTOR. Начнём с того, что установим курсор в конец перемещённого Import Directory Table, подогнав его к адресу .004021А6 и запишем имя нашей функции 'Malvare', оканчивающееся нулем и предварённой двумя нулями (т.е. с адреса .004021А8), а следом за ним - имя внедряемой динамической библиотеки "x_code.dll". Впрочем, порядок их расположения может быть и другим, т.к. системный загрузчик на такие мелочи давно уже забил.

Сделав это, перемещаемся на первый байт, ранее зарезервированный нами 14h-байтной структуры (adr: .00402100h), и начинаем колдовать. Первые 4 байта оставляем равными нулю. В следующие 4 байта пишем RVA-адрес импортируемой функции. В нашем случае, эта функция зовётся 'Malvare', а её имя (предварённое двумя нулями) начинается с RVA-адреса 004021A6. Учитывая обратный порядок пишем: A6 21.

Пропустив следующие 4 байта, записываем RVA-адрес имени внедряемой библиотеки "x_code.dll", равный в нашем случае 21B0h (пишем B0 21). Остаётся заполнить последнее поле, содержащее RVA-адрес таблицы IAT, размещённой нами с RVA-адреса 2066h (пишем 66 20).

Вот, собственно и всё.. После добавления новой структуры IMAGE_IMPORT_DESCRIPTOR в таблицу импорта, последний будет иметь такой вид:

.00402100:  00 00 00 00-A6 21 00 00  00 00 00 00-B0 21 00 00      ж!      ░!
.00402110:  66 20 00 00-56 20 00 00  00 00 00 00-00 00 00 00  f   V
.00402120:  3C 20 00 00-5E 20 00 00  74 20 00 00-00 00 00 00  <   ^   t
.00402130:  00 00 00 00-4A 20 00 00  7C 20 00 00-00 00 00 00      J   |
.00402140:  00 00 00 00-00 00 00 00  00 00 00 00-00 00 00 00
.00402150:  4B 45 52 4E-45 4C 33 32  2E 44 4C 4C-00 00 55 53  KERNEL32.DLL  US
.00402160:  45 52 33 32-2E 44 4C 4C  00 00 66 20-00 00 00 00  ER32.DLL  f
.00402170:  00 00 66 20-00 00 00 00  00 00 00 00-45 78 69 74    f         Exit
.00402180:  50 72 6F 63-65 73 73 00  84 20 00 00-00 00 00 00  Process Д
.00402190:  84 20 00 00-00 00 00 00  00 00 4D 65-73 73 61 67  Д         Messag
.004021A0:  65 42 6F 78-41 00 00 00  4D 61 6C 76-61 72 65 00  eBoxA   Malvare
.004021B0:  78 5F 63 6F-64 65 2E 64  6C 6C 00 00-00 00 00 00  x_code.dll

Остается сущая мелочь. Вернуться в начало файла, отсчитать от "PE" заголовка 80h байт, исправив указатель на таблицу импорта с 2114h на 2100h (0021) и увеличить её размер с 92h на BBh. Сохраняем проделанные изменения и, ..набрав побольше воздуха в грудь, залпом выпиваем оставшееся пиво!

Перед тем как протестить дрозофилу, не помешает заглянуть внутрь файла и проверить, добавилась-ли наша библиотека к остальным. Запускаем 'W32Dasm' и видим, что наша DLL'ка появилась в списке, ..и не просто появилась, а проинициализировалась самой первой, что есть гуд:

    +++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
    Number of Imported Modules =  3 (decimal)

      Import Module 001: x_code.dll
      Import Module 002: KERNEL32.DLL
      Import Module 003: USER32.DLL

    +++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++
      Import Module 001: x_code.dll
         Addr:000021А6 hint(0000) Name: Malvare

      Import Module 002: KERNEL32.DLL
         Addr:00002066 hint(0000) Name: ExitProcess

      Import Module 003: USER32.DLL
         Addr:00002084 hint(0000) Name: MessageBoxA


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#22 05-08-2014 22:54:04

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

7. СЕТЕВЫЕ ТЕХНОЛОГИИ

С момента появления MS-DOS и до сегодняшних дней, вирусам и прочей нечисти пришлось преодолеть нелёгкий путь. В результате естесственного отбора, большая часть из них, отправилась к своим праотцам. Но им на смену, большими потоками поступают всё новые-и-новые экземпляры, впитавшие в себя все лучшие стороны своих предшественников.

В наш век компьютерных техногий, когда мир окутан паутиной сетей и информация облетает земной шар за несколько секунд, вирусы используют эти потоки в виде транспорта. Перехватив поток, хакеру ничё не стОит определить откуда/кем и куда пересылается инфа.

На данном этапе, давайте разберёмся, где хранится вся конфеденциальная инфа, позволяющая нашим недоброжелателям проникнуть внутрь святая-святых нашей системы. Для этого, необходимо иметь хотя-бы поверхностное представление об устройстве сетей, протоколах передачи файлов и т.д. и т.п. Попробую быть предельно кратким. За более подробной информацией по данному вопросу, отправляю Вас в гугл.

Сетевое аппаратное обеспечение

Существуют 2 основных типа сетей: LAN-локальные (покрывающие одно здание), и WAN-глобальные (которые могут охватывать весь мир). Важной разновидностью локальной сети является сеть Ethernet, поэтому мы рассмотрим её в качестве примера LAN. Глобальные сети мы рассмотрим на примере сети Интернет.

..сеть Ethernet

Суть классической сети Ethernet состоит в том, чтоб объеденить несколько компьютеров между собой, посредством кабеля. Чтобы послать пакет данных по такой сети, компьютер сначала прослушивает кабель, определяя, не передаёт-ли по нему какой-нибудь другой компьютер. Если кабель свободен, он начинает передавать пакет, состоящий из короткого заголовка, за которым следует от 0 до 1500 байт полезной нагрузки. Если кабель занят, то компьютер просто ждёт, пока не завершится текущая передача, после чего начинает передавать сам.

Если два компьютера начинают передачу одновременно, происходит конфликт, который обнаруживается обоими компьютерами. При этом оба компьютера прекращают передачу и ожидают в течении случайного интервала времени, после чего начинают всё/сначала. Если опять случается конфликт, то время ожидания удваивается, снижая вероятность следующего столкновения.

Типичным представителем сети Ethernet, является обычная LAN-сетка предприятия или учебного заведения.

..сеть Интернет

Сеть Интернет строилась на ошибках локальных сетей, и полностью финансировалось военными. Данная сеть должна была автоматически перенаправлять весь трафик в обход повреждённых (во время военных действий) узлов.

Интернет состоит из компьютеров двух типов: хостов и маршрутизаторов. Хостами являются персональные компьютеры компаний и частных лиц. Маршрутизаторы - это коммутирующие компьютеры, принимающие пакеты и отправляющие их дальше. Маршрутизаторы объединяются в большие сети, в которых каждый маршрутизатор связан между собой оптоволоконным кабелем.

Весь трафик в Интернете посылается в виде пакетов. Каждый пакет содержит адрес пункта назначения, который используется при выборе маршрута. Когда пакет попадант на маршрутизатор, он извлекает из него адрес получателя и ищет его в своей таблице, определяя по какой линии отправить его дальше. Эта процедура повторяется до тех пор, пока пакет не достигнет хоста.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#23 05-08-2014 22:56:08

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Сетевые протоколы

Протоколом называется набор правил с помощью которых общаются компьютеры в сети. Существует множество протоколов, включая протоколы для общения между собой маршрутизаторов, хоста с хостом и т.д.

Все сети используют 'стеки протоколов', т.е. разные протоколы на разном уровне. Так, на нижнем уровне протоколы описывают начало/конец битового потока, на более высоком уровне - занимаются выбором маршрута для пакета, на ещё более высоком - они гарантируют, что в "Багдаде всё спокойно", и все пакеты благополучно прибыли.

Ключевыми, являются два главных протокола: TCP и IP.
IP отправляет в сеть дейтаграмму размером 64 Кбайт и надеется, что она достигнет получателя, не предаставляя при этом никаких гарантий. На данный момент есть две версии протокола IP - это v4 и v6, где доминирует v4, поэтомо остановимся на ней.

Каждый пакет начинается с 40-байтового заголовка, содержащего помимо прочего 4-байтовый адрес отправителя и 4-байтовый адрес получателя. Эти адреса образуют основу маршрутизации в Интернет. Когда пакет прибывает на маршрутизатор, он извлекает из пакета адрес получателя, и использует его для маршрутизации данных.

Поскольку получение IP-дейтаграмм не подтверждаются получателем, для надёжной связи одного IP-протокола не достаточно. Надёжную связь обеспечивает другой протокол, устанавливаемый поверх IP, ..это протокол TCP. TCP добивается этого за счёт присваивания порядковой нумерации, пересчёта контрольных сумм, и повторной передачи неверно полученных пакетов.

Одним словом, TCP/UDP представляют собой протоколы транспортного уровня, а IP определяет протокол, который отвечает за передачу данных. TCP/IP - это обширный набор Интернет- и транспортных протоколов, который включает в себя UDP, ARP, FTP, TELNET, SMTP и др.. Ниже, приведена схема 'стека протоколов':

      прикладные процессы
    ... \ | /..... \ | / ...
       +-----+    +-----+
       | TCP |    | UDP |
       +---+-+    +-+---+
            \      /
    +---+   ++----++
    |ARP|   |  IP  |   * - IP-адрес
    +---+   +-*----+
      \       |     
       \   +--+---+
        +--|      | <--- сетевая карта
           +-@----+      @адрес узла
             |
         ----0----- кабель Ethernet

Здесь, нижним уровнем стека является драйвер сетевой карты, а высоким уровнем - прикладные программы Windows, отправляющие/ждущие данные.

Название блока данных зависит от того, на каком уровне стека они находится. Эти определения, конечно, несовершенны, но мы будем придерживать именно их:

* Кадр - блок данных, с которым имеет дело сетевая карта;
* Пакет - находится между сетевой картой и модулем IP;
* UDP-датаграмма - между модулем IP и модулем UDP;
* TCP-сегмент - между модулем IP и модулем TCP;
* Сообщение - находится на уровне прикладных процессов.

Когда Ethernet-кадр попадает в драйвер сетевой карты, он направляется в модуль IP. На то, куда должен быть направлен кадр, указывает значение поля 'тип' в заголовке кадра. Если IP-пакет попадает в модуль IP, то содержащиеся в нем данные могут быть переданы либо модулю TCP, либо UDP, что определяется полем 'протокол' в заголовке IP-пакета.

Если TCP-сообщение попадает в модуль TCP, то выбор прикладной программы, которой должно быть передано сообщение, осуществляется на основе значения поля 'порт' в заголовке TCP-сообщения.

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

Ethernet-кадр содержит 6-байтный адрес назначения, 6-байтный адрес источника, поле 'тип' и данные. Каждая сетевая карта (адаптер) имеет свой внутренний адрес. Адаптер контролирует обмен информацией в сети, и принимает адресованные ему кадры.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Хорошей аналогией взаимодействиям в среде Ethernet может служить разговор группы вежливых людей в тёмной комнате, где каждый слышит речь других людей. Все люди в комнате имеют одинаковые возможности вести разговор, но никто не говорит слишком долго, т.к. все вежливы. Если человек будет невежлив, то его попросят выйти. Все молчат, пока кто-то говорит.

Если два человека начинают говорить одновременно, то они сразу обнаруживают это, поскольку слышат друг/друга (столкновение). В этом случае они замолкают и ждут некоторое время, после чего один из них вновь начинает разговор. Другие люди слышат, что ведётся разговор, и ждут, пока он кончится, а затем могут начать говорить сами.

Каждый человек имеет своё имя. Каждый раз, когда кто-нибудь начинает говорить, он называет по имени того, к кому обращается, и своё имя, например: "Слушай Петя, это Андрей, ..бла-бла-бла!". Если кто-то хочет обратиться ко всем, то он говорит: "Слушайте все, это Андрей, ..бла-бла-бла!".
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Здесь, мы рассмотрели приём данных, ..а как происходит отправка? Как (при посылке IP-пакета) определяется Ethernet-адрес назначения?

Модуль ARP

Для преобразования IP-адресов в Ethernet-адреса сетевой карты, используется протокол ARP (адресный протокол). Заголовок заполняется только для отправляемых IP-пакетов, т.к. только в момент отправки создаются заголовки IP и Ethernet.

Преобразование адресов выполняется путем поиска в таблице. Эта таблица, называемая ARP-таблицей, хранится в памяти и содержит строки для каждого узла сети. В двух столбцах содержатся IP и Ethernet-адреса. Если требуется преобразовать IP-адрес в Ethernet-адрес, то ищется запись с соответствующим IP-адресом. Ниже приведен пример упрощенной ARP-таблицы:

    |    IP-адрес    |      Ethernet-адрес      |
    +----------------+--------------------------+

    +--- 192.168.0.1 ------ 08:00:39:00:2F:C3 --+
    +--- 192.168.0.2 ------ 08:00:5A:21:A7:22 --+
    +--- 192.168.0.3 ------ 08:00:10:99:AC:54 --+
    +--- 192.168.0.4 ------ 08:00:93:F0:B4:89 --+

Принято все байты 4-байтного IP-адреса записывать в DEC, разделенными точками, а при записи 6-байтного Ethernet-адреса, каждый байт указывается в HEX и отделяется двоеточием.

ARP-таблица заполняется автоматически (модулем ARP) по мере необходимости. Когда с помощью существующей ARP-таблицы не удается преобразовать IP-адрес, то происходит следующее:

1. По сети передается широковещательный ARP-запрос;
2. Исходящий IP-пакет ставится в очередь;
3. Каждый сетевой адаптер принимает широковещательные передачи.

Все драйверы Ethernet проверяют поле 'тип' в принятом Ethernet-кадре и передают ARP-пакеты модулю ARP. ARP-запрос можно интерпретировать так: "Если ваш IP-адрес совпадает с указанным, то сообщите мне ваш Ethernet-адрес!". Пакет ARP-запроса выглядит примерно так:

    +- IP-адрес отправителя ---------- 192.168.0.1 --------+
    +- Ethernet-адрес отправителя ---- 08:00:39:00:2F:C3 --+
    +------------------------------------------------------+
    +- Искомый IP-адрес -------------- 192.168.0.4 --------+
    +- Искомый Ethernet-адрес -------- FF:FF:FF:FF:FF:FF --+

Теперь, каждая машина приступает к проверке своего ARP-модуля на предмет искомого IP-адреса, и если искомый адрес совпадает с его собственным, то он посылает ответ прямо по Ethernet-адресу отправителя. Пакет с ARP-ответом выглядит так:

    +- IP-адрес отправителя ---------- 192.168.0.4 --------+
    +- Ethernet-адрес отправителя ---- 08:00:93:F0:B4:89 --+
    +------------------------------------------------------+
    +- Искомый IP-адрес -------------- 192.168.0.1 --------+
    +- Искомый Ethernet-адрес -------- 08:00:39:00:2F:C3 --+

Если в сети нет машины с искомым IP-адресом, то ARP-ответа не будет и не будет записи в ARP-таблице. Протокол IP будет уничтожать все IP-пакеты, направляемые по этому адресу.

Модуль IP

Модуль IP является базовым элементом технологии Интернет, а центральной частью IP является его таблица маршрутов. Имеется два вида маршрутизации: прямая и косвенная. Возьмём небольшую сеть, состоящую из трёх компьютеров А, В, С, использующих прямую маршрутизацию. Каждая машина имеет свой 'стек протоколов TCP/IP', как показано на первом рисунке. Каждый сетевой адаптер этих машин имеет свой Ethernet-адрес. Менеджер сети должен присвоить машинам уникальные IP-адреса:

         А     В     С
         |     |     |
    -----0-----0-----0-----
     Ethernet 1
     IP-сеть 192.168.1

Когда в машине B модуль-IP получает пакет от машины A, он сопоставляет IP-адрес места назначения со своим, и если адреса совпадают, то передает датаграмму протоколу верхнего уровня. В данном случае при взаимодействии A с B используется прямая маршрутизация.

Теперь, посмотрим на рисунок ниже. В данном случае, сеть состоит из трех сетей Ethernet, на базе которых работают три IP-сети, объединенные шлюзом D. Каждая IP-сеть включает четыре машины, каждая машина имеет свои собственные IP- и Ethernet-адреса:

         A     B     C       D      E     F     G
         |     |     |       |      |     |     |
    -----0-----0-----0-------0------0-----0-----0------
     Ethernet 1              |    Ethernet 2
     IP-сеть 192.168.1       |    IP-сеть 192.168.2
                             |
                             |      H     I     J
                             |      |     |     |
              ---------------+------0-----0-----0
                                  Ethernet 3
                                  IP-сеть 192.168.3

За исключением D, все машины имеют свой стек протоколов. Шлюз D соединяет все/три сети и, следовательно, имеет три IP-адреса и три Ethernet-адреса. Машина D имеет тройной стек протоколов TCP/IP, с тремя модулями ARP и тремя драйверами Ethernet, но только одним модулем IP.

Когда машина A посылает IP-пакет машине B, то процесс передачи идет в пределах одной сети. При всех взаимодействиях между машинами, подключенными к одной IP-сети, используется прямая маршрутизация. Когда машина D взаимодействует с машинами A, E, H, то это тоже прямое взаимодействие, т.к. каждая пара этих машин принадлежит одной IP-сети.

Однако, когда машина A взаимодействует с машинами другой IP-сети, то взаимодействие уже не будет прямым. Машина A должна использовать шлюз D для ретрансляции IP-пакетов в другую IP-сеть. Такое взаимодействие называется косвенной маршрутизацией.

Маршрутизация IP-пакетов выполняется модулями IP и является прозрачной для модулей TCP, UDP и прикладных процессов. В приведенном примере несколько сетей Ethernet объединяются шлюзом для того, чтобы локализовать широковещательный трафик внутри своей сети.

--------------  IP Statistics  -----------------

Default Time-To-Live value            : 128
Datagrams Received                    : 2024
Input Datagrams Delivered             : 2024
Input Datagrams with errors in header : 0
Input Datagrams with bad address      : 17
Input Datagrams with unknown protocol : 0

Output Requests                       : 1964
Output Datagrams Discarded (NoRoutes) : 0

Reassembly Timeout (sec)              : 60
Datagrams re-assembled (successfully) : 0
Datagrams fragmented (successfully)   : 0
Fragmentation failures                : 0
------------------------------------------------


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#24 05-08-2014 22:58:21

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

IP-адреса

Менеджер сети присваивает IP-адреса узлам в соответствии с тем, к каким IP-сетям они подключены. Старшие биты 4-хбайтного IP-адреса определяют номер IP-сети. Оставшаяся часть адреса - номер узла (хост-номер). Для машины с IP-адресом 192.168.0.1 сетевой номер равен 192.168.0, а хост-номер = 1.

Существуют 5 классов IP-адресов, отличающиеся количеством бит в сетевом- и хост-номере. Класс адреса определяется значениями его первых/трёх цифр. В таблице ниже, приведено соответствие классов, значениям этих цифр, и указано кол-во возможных IP-адресов каждого класса:

    ---------0 -------------- 8 ----------- 16 -------- 24 --------- 31
    Класс А  | |0| номер сети |<============= номер узла ===========>|
    -----------------------------------------------------------------
    Класс B  | |10|<====== номер сети =====>|<===== номер узла =====>|
    -----------------------------------------------------------------
    Класс C  | |110|<=========== номер сети ===========>| номер узла |
    -----------------------------------------------------------------
    Класс D  | |1110|<============= групповой адрес ================>|
    -----------------------------------------------------------------
    Класс E  | |11110|<============ зарезервировано ================>|
    -----------------------------------------------------------------

     Класс     Диапазон   Кол-во сетей   Кол-во узлов
    +-------+-----------+--------------+--------------+
    |  A    | 1 - 126   | 126          |  16777214    |
    +-------+-----------+--------------+--------------+
    |  B    | 128 - 191 | 16382        |  65534       |
    +-------+-----------+--------------+--------------+
    |  C    | 192 - 233 | 2097150      |  254         |
    +-------+-----------+--------------+--------------+
    |  D    | 224 - 239 |              |  2 - 28      |
    +-------+-----------+--------------+--------------+
    |  E    | 240 - 247 |              |  2 - 27      |
    +-------+-----------+--------------+--------------+

Адреса класса A предназначены для использования в больших сетях общего пользования. Они допускают большое кол-во номеров узлов. Адреса класса B используются в сетях среднего размера, например, сетях университетов и крупных компаний. Адреса класса C используются в сетях с небольшим числом компьютеров. Адреса класса D используются при обращениях к группам машин, а адреса класса E зарезервированы на будущее.

Некоторые IP-адреса являются выделенными и трактуются по-особому. Особый смысл имеет IP-адрес, первая троица которого равна 127. Он используется для тестирования программ и взаимодействия процессов в пределах одной машины. Когда программа посылает данные по IP-адресу 127.0.0.1, то образуется 'петля'. Данные не передаются по сети, а возвращаются модулям верхнего уровня, как только что принятые. Поэтому в IP-сетях запрещается присваивать машинам IP-адреса, начинающиеся со 127.

Подсети

Адресное пространство сети Интернет может быть разделено на непересекающиеся подпространства - подсети, с каждой из которых можно работать как с обычной сетью TCP/IP. Таким образом единая сеть организации может строиться как объединение подсетей. Как правило, подсеть соответствует одной физической сети, например, одной сети Ethernet.

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

Подсети позволяют избежать этих недостатков. Ваша организация должна получить один сетевой номер, например, номер класса B. Для IP-адресов класса B, первые две триады являются номером сети, а оставшаяся часть IP-адреса может использоваться как угодно. Например, вы можете решить, что третья триада будет определять номер подсети, а четвертая - номер узла в ней.

Все машины за прелами вашей организации видят одну большую IP-сеть. Следовательно, они должны поддерживать только маршруты доступа к шлюзам, соединяющим вашу IP-сеть с остальным миром. Изменения, происходящие в IP-сети организации, не видны вне её. Вы легко можете добавить новую подсеть, новый шлюз и т.п.

Протокол ARP с представителем

Протокол ARP с представителем применяется в сетях с широковещательной передачей, где для отображения IP-адресов в сетевые адреса используется протокол ARP. Проще всего продемонстрировать его использование при работе со всеми адресами.

Когда нужно послать IP-пакет узлу в локальной сети, ваша машина должна определить Ethernet-адрес этого узла. Для этого она использует ARP-таблицу. Если в ARP-таблице уже есть запись, соответствующая IP-адресу места назначения, то из неё просто берется Ethernet-адрес, и кадр отправляется. Если такой записи нет, то посылается широковещательный ARP-запрос. Узел с искомым IP-адресом назначения принимает его и в ARP-ответе сообщает свой Ethernet-адрес. Эти действия соответствуют обычному протоколу ARP, описанному выше.

Протокол ARP с представителем основан на том, что шлюзы работают как (!)представители удалённых узлов. Предположим, что в подсети 192.168.1 имеется узел 192.168.1.2. Он желает послать пакет узлу 192.168.2.100, который подключен к другой сети Ethernet. Существует шлюз с IP-адресом 192.168.0.1, соединяющий две подсети. Подсеть 192.168.1 будем считать узлом (А), подсеть 192.168.2 узлом (В), а 192.168.0 - это шлюз (R).

Если в ARP-таблице узла (A) нет маршрута к узлу (B), то узел (A) посылает ARP-запрос узлу (B). Фактически, машина (A) спрашивает: "Если кто-нибудь знает Ethernet-адрес узла 192.168.2.100, сообщите мне его!". Узел (B) не может ответить на запрос самостоятельно. Он подключен к другой сети Ethernet и никогда даже не увидит этот ARP-запрос.

Однако шлюз (R) может работать от его имени. Шлюз (R) отвечает: "Я здесь! IP-адресу 192.168.2.100 соответствует Ethernet-адрес 2:7:1:0:EB:CD!" (где 2:7:1:0:EB:CD является Ethernet-адресом шлюза-R). Это создает иллюзию, что узел (B) подключен непосредственно к той-же сетке Ethernet, что и узел (A). Кадр, содержащий IP-пакет, попадет в шлюз (R), а он переправит его по назначению.

Протокол UDP

Протокол UDP (протокол пользовательских датаграмм) является одним из двух основных протоколов, расположенных непосредственно над IP (см. стек протоколов). Он предлагает прикладным процессам (которые хотят отправить данные) транспортные услуги, и не/обеспечивает надежную доставку датаграмм. К заголовку IP-пакета он добавляет два поля: порт и контрольная сумма.

Взаимодействие между прикладными процессами и модулем UDP осуществляется через UDP-порты. Порты нумеруются начиная с нуля. Прикладной процесс, предоставляющий некоторые услуги другим прикладным процессам (сервер), ожидает поступления сообщений в порт, специально выделенный для этих услуг.

Когда модуль UDP получает датаграмму от модуля IP, он проверяет контрольную сумму, содержащуюся в её заголовке. Если CRC равна нулю - это означает, что отправитель датаграммы её не подсчитывал, и её нужно игнорировать.

Если контрольная сумма правильная (или равна нулю), то проверяется порт назначения, указанный в заголовке датаграммы. Если к этому порту подключен прикладной процесс, то сообщение становится в очередь. Если датаграммы поступают быстрее, чем их успевает обрабатывать прикладной процесс, то при переполнении очереди сообщений, поступающие датаграммы тупо удаляются модулем UDP.

    -----------  UDP Statistics  ------------

    Received Datagrams          : 138
    Datagrams for which No Port : 10
    Received Datagram Errors    : 2
    Sent Datagrams              : 148
    -----------------------------------------



Протокол TCP

Протокол TCP, так-же, предоставляет транспортные услуги, но отличающиеся от услуг UDP. Вместо ненадежной доставки датаграмм без установления соединений он обеспечивает гарантированную доставку с установлением соединений в виде байтовых потоков.

Протокол TCP используется в тех случаях, когда требуется надежная доставка сообщений. Он освобождает прикладные процессы от необходимости использовать таймауты и повторные передачи для обеспечения надежности. Наиболее типичными прикладными процессами, использующими TCP, являются FTP и TELNET.

Прикладные процессы взаимодействуют с модулем TCP через порты. Для отдельных приложений выделяются общеизвестные номера портов. Например, сервер TELNET использует порт номер 23. Клиент TELNET может получать услуги от сервера, если установит соединение с TCP-портом 23 на его машине.

---------  TCP Statistics  --------------

Retransmission timeout Min  : 300
Retransmission timeout Max  : 120000
Maximum Connections         : Dynamic
Active Opens                : 147
Passive Opens               : 0
Failed Attempts             : 0
Established Resets          : 11
Current Established         : 0
Segments Received           : 1840
Segments Sent               : 1740
Segments Retransmitted      : 73
Incoming Errors             : 0
Out Resets                  : 5
-----------------------------------------


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#25 05-08-2014 23:00:51

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: .: Вирусы под наркозом :.

Протоколы прикладного уровня

Почему существуют два транспортных протокола TCP и UDP, а не один из них? Дело в том, что они предоставляют разные услуги прикладным процессам. Вы, как программист, выбираете тот протокол, который наилучшим образом соответствует вашим требованиям. Если вам нужна надёжная доставка, то выбираем TCP, ..если нужна доставка датаграмм, то лучше UDP. Если вам нужна доставка по длинному и ненадежному каналу, то лучше TCP, если нужна эффективность на быстрых сетях с короткими соединениями, то UDP. Так сказать, хозяин - барин!

Какие-же прикладные программы доступны в сетях с TCP/IP? Общее их кол-во велико и продолжает постоянно увеличиваться. Некоторые приложения существуют с самого начала развития Интернет (например, TELNET и FTP), и ориентированы они на конкретные прикладные задачи.

Протокол TELNET

Протокол TELNET позволяет обслуживающей машине рассматривать все удаленные терминалы, как стандартные терминалы строчного типа, работающие в коде ASCII, а также обеспечивает возможность согласования более сложных функций (например, локальный/удаленный эхо, страничный режим, высота/ширина экрана и т.д).

TELNET работает на базе протокола TCP. На прикладном уровне над TELNET находится либо программа поддержки реального терминала, либо прикладной процесс в обсуживающей машине, к которому осуществляется доступ с терминала.
Для ознакомления с командами TELNET отправляю читателя по адресу: C:\Windows\help\telnet.chm

Протокол FTP

Протокол FTP (протокол передачи файлов) распространён также широко, как TELNET. Он является одним из старейших протоколов семейства TCP/IP. Также как TELNET он пользуется транспортными услугами TCP. Существует множество реализаций для различных ОС, которые хорошо взаимодействуют между собой.

Пользователь FTP может вызывать несколько команд, которые позволяют ему посмотреть каталог удалённой машины, перейти из одного каталога в другой, а также скопировать несколько файлов.

Протокол SMTP

Протокол SMTP (протокол передачи почты) поддерживает передачу электронной почты между произвольными узлами сети Интернет. Имея механизмы промежуточного хранения почты и механизмы повышения надежности доставки, протокол SMTP допускает использование различных транспортных служб. Он может работать даже в сетях, не использующих протоколы семейства TCP/IP.

Протокол SMTP обеспечивает как группирование сообщений в адрес одного получателя, так и размножение нескольких копий сообщения для передачи в разные адреса. Над модулем SMTP располагается почтовая служба конкретных вычислительных систем.

HTTP протокол

Для иллюстрации роли, которую TCP/IP играет в вычислительных сетях в реальном мире, рассмотрим, что происходит, когда Web-браузер использует HTTP (протокол передачи гипертекста) для извлечения страницы HTML-данных из Web-сервера.

Чтоб подключиться к серверу, браузер использует абстракцию программного обеспечения высокого уровня, называемую 'socket'. Чтобы извлечь страницу, он посылает на сервер команду GET HTTP, записывая её в сокет. Программное обеспечение сокет'а, в свою очередь, применяет TCP для пересылки байтов, составляющих команду GET на Web-сервер. TCP сегментирует данные и передает отдельные сегменты модулю IP, который пересылает сегменты в дейтаграммах на Web-сервер.

Если браузер и сервер работают на компьютерах, подключенных к различным физическим сетям (как это обычно бывает), дейтаграммы передаются от сети к сети до тех пор, пока не достигнут адресата. В конце/концов дейтаграммы достигают пункта своего назначения и вновь собираются таким образом, чтобы Web-сервер получил непрерывный поток данных.

В итоге, записанные в сокет данные на одном конце, как по волшебству, всплывают на другом конце. И это практически всё, чем занимается TCP/IP: превращением множества небольших сетей в одну большую и предоставлением услуг, которые нужны прикладным программам для обмена информацией друг с другом.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен


Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Рейтинг@Mail.ru