06.02.2005

Реверс в вирмейке. Глава 2. Прощание с царями

Вторая глава вступления из цикла статей «Реверс в вирмейке». Теперь речь пойдет про быстрое снятие защиты с мирового антивируса NOD32. Сегодня вы убедитесь, что заразить антивирус скрытно можно быстрее, чем подумать об этом. Однако в статье предоставлена только теория и данные для самостоятельного размышления, готового практически ничего нет. На то она и безопасность.

Автор: Shturmovik (Shturmovik[at]gh0sts.org)

[Бредисловие]

Вопреки первой главе, здесь я поведу речь об антивирусе ESET NOD32, а с антивирусом Касперского закончу в третьей. Почему? Много причин, это то, что я просто решил передохнуть от исследования кода Касперского, так же, поскольку вышли новые обновления под Антивирус Касперского, что естественно изменило структуру кода антивируса и т.д. В любом случае здесь я разбираю поверхностно антивирус Nod32, почему именно поверхностно узнаете в самом конце.

[Цель]

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

[Анализ.]

Ну, думаю, достаточно прелюдии перейдем к делу. Поскольку наша цель – это заставить антивирусную машину забыть про известные ей вирусы, а так же получить контроль над самой антивирусной машиной, то я начну свою повесть со второго. Дабы проверить, как программа реагирует на изменение своего кода, необходимо собственно изменить код программы. Логично, не правда ли? В этом нам поможет наш уже известный редактор ресурсов Restorator. И так я просто поменял пару строк в ресурсах файла. При запуске сразу видно, что и где закопано. Первым делом высвечивается наше любимое окошко MessageBoxW с недвусмысленной надписью «Checking CRC of the NOD32.EXE file: the NOD32.EXE file is damaged, possibly infected», после нажатия кнопочки ОК, программа продолжает свою работу. Да это вам не Антивирус Касперского, который из всех исследованных мной антивирусов до конца так и не остался побежденным. В общем, это лирика, переходим дальше. В главном окне антивируса опять же надпись наподобие этой о том, что проверка CRC закончилась ошибкой. Честно говоря, после этого мнение об этом продукте у меня очень сильно упало. Простому пользователю не понять, что это за проверка и хорошо или плохо ли это, в таком случае надо было бы полностью приостанавливать работу и, большими плакатными буквами писать на экране что антивирус накрылся. Итак, перейдем непосредственно к избавлению от этой неприятности, а именно от проверки четности в целом. В этом нам поможет kWinDasm 10, доступен этот дизассемблер повсеместно, поэтому с его приобретением проблем, думаю, ни у кого не возникнет.

Открываем поиск и ищем строку “Checking CRC of the NOD32.EXE file” в результате я оказался на интересном месте. Смотрим листинг.

* Possible Reference to String Resource ID=00284: 
"Checking CRC of the NOD32.EXE file..."
                                  |
:0040885C 681C010000              push 0000011C
:00408861 8D4C240C                lea ecx, dword ptr [esp+0C]

* Reference To: MFC42u.Ordinal:103B, Ord:103Bh
                                  |
:00408865 E8EA590200              Call 0042E254
:0040886A 8B442408                 mov eax, dword ptr [esp+08]
:0040886E 8B0DB4044700        mov ecx, dword ptr [004704B4]
:00408874 6A00                         push 00000000
:00408876 50                              push eax
:00408877 6AFF                         push FFFFFFFF
:00408879 E892080000         call 00409110
:0040887E 8BF0                    mov esi, eax
:00408880 A1A4904500        mov eax, dword ptr [004590A4]
:00408885 83E800                 sub eax, 00000000
:00408888 7434                      je 004088BE
:0040888A 48                        dec eax
:0040888B 741A                    je 004088A7 	
	<=Если проверка CRC успешна то срабатывает этот переход.

:0040888D 48                        dec eax
:0040888E 754F                    jne 004088DF

* Possible Reference to String Resource ID=00283: 
"Checking CRC of the NOD32.EXE file: the NOD32.EXE file is da"
                                  |
:00408890 681B010000              push 0000011B
:00408895 8D4C240C                lea ecx, dword ptr [esp+0C]

* Reference To: MFC42u.Ordinal:103B, Ord:103Bh
                                  |
:00408899 E8B6590200              Call 0042E254
:0040889E 8B4C2408                 mov ecx, dword ptr [esp+08]

* Possible Reference to Dialog: DialogID_008C, CONTROL_ID:0004, "&Delete"
                                  |
:004088A2 6A04                     push 00000004
:004088A4 51                          push ecx
:004088A5 EB2C                    jmp 004088D3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040888B(C)

* Possible Reference to String Resource ID=00286: 
"Checking CRC of the NOD32.EXE file: status OK"
                                  |
:004088A7 681E010000              push 0000011E
:004088AC 8D4C240C                lea ecx, dword ptr [esp+0C]

* Reference To: MFC42u.Ordinal:103B, Ord:103Bh
                                  |
:004088B0 E89F590200              Call 0042E254
:004088B5 8B542408                  mov edx, dword ptr [esp+08]
:004088B9 6A01                          push 00000001
:004088BB 52                              push edx
:004088BC EB15                         jmp 004088D3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408888(C)
|

* Possible Reference to String Resource ID=00285: 
"CRC check of NOD32.EXE file: disabled"
                                  |
:004088BE 681D010000              push 0000011D
:004088C3 8D4C240C                 lea ecx, dword ptr [esp+0C]
Итак, я (крайне просто) нашел место, где происходит выбор, какие данные выводить. Я специально отметил переход при срабатывании, которого выводится сообщение об успешной CRC. Естественно можно либо править переход, либо разбираться в самой проверке четности файла (CRC). Я пошел первым методом, поскольку это проще намного и потому, что для начала я протрассировал программу под отладчиком и увидел, что проверка больше ни на что не влияет. Итак, значит, нам достаточно переменить условный переход на безусловный.

0040888B 741A je 004088A7

меняем на

0040888B EB1A jmp 004088A7

После мы видим то, что мы и ожидали. Остается только убрать MessageBoxW с плохими словами. Собственно, как бы сказал Шерлок Холмс: «Элементарно!». Все делается точно так же и, вскоре мы попадаем вот сюда, Однако не следует вставлять всю строку из окошка в поисковый диалог дизассемблера, а то у него едет крыша и просто bof.

:0040754F A154044700            mov eax, dword ptr [00470454]
:00407554 85C0                        test eax, eax
:00407556 7406                         je 0040755E
:00407558 8B442418                mov eax, dword ptr [esp+18]
:0040755C 5E                           pop esi
:0040755D C3                           ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407556(C)
|
:0040755E 8B442414                mov eax, dword ptr [esp+14]
:00407562 8B4C2410                mov ecx, dword ptr [esp+10]
:00407566 8B542408                mov edx, dword ptr [esp+08]
:0040756A 0D00200100              or eax, 00012000
:0040756F 50                           push eax
:00407570 51                           push ecx
:00407571 56                           push esi
:00407572 52                           push edx

* Reference To: USER32.MessageBoxW, Ord:01C3h
                                  |
:00407573 FF15B4074300            Call dword ptr [004307B4]
:00407579 5E                      pop esi
:0040757A C3                      ret

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

То есть вместо

:00407556 7406 je 0040755E

теперь красуется

.00407556: 90 nop

.00407557: 90 nop

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

Теперь настала очередь перейти еще к одному нюансу. Если вы захотите превратить антивирусную машину в троянского коня, то наверняка безопаснее отсылать, допустим, пароли по почте в то время когда, например, идет обновление антивирусных баз, дабы умолчал наш доблестный фаерволл о таком нахальстве. Для этого сейчас мы просто найдем процедуру обновления антивируса. Не думайте, это минутное дело и глобального ничего тут нет, я просто покажу вам, где она находится, а уж как ее использовать вы придумаете сами. Можно, например, заменить просто функцию обновления на отправку, тога и обновления не буде, впрочем, это ваша фантазия, разжевывать я материал прямо до мелочей не буду, можете кричать на меня даже матом. Значит, как всем известно, у нас имеется 2 исполняемых файла, это файл антивирусного сканера nod32.exe, который мы сейчас победили в честном поединке, и файл службы управления, в котором, кстати, и находится модуль обновления. Итак, перейдем к нашему модулю управления. Тест на CRC он успешно заваливает и остается только в нем найти процедуру обновления, дабы поглумиться над ней. Скажу сразу, процедуры таковой нет в этом файле, однако уже не трудно догадаться, за что отвечает библиотека pc_upd.dll и pu_upd.dll. Причем pc_upd.dll хранит в себе форму, а так же отвечает за настройку автоматического обновления, в то время как pu_upd.dll за сам процесс. Тепарь скажу несколько слов про открывшиеся возможности, можно превратить антивирусную машину в кейлоггер, троян, просто файловый вирус. В общем, все, что душе пожелаете. Естественно, как бы вы обо мне не говорили, делать я этого не буду, я всего лишь могу указать на дверь, войти вы должны в нее сами.

Тут наверняка у многих возникнет каверзный вопрос, что вирус будет обнаружен антивирусной машиной. Что я могу вам на это ответить? До того как Nod32 будет поражен, конечно, стоит задуматься о скрытности. Этой теме я посвятил статью «Написание недектируемого кода» которая в скором времени выйдет в свет. А после заражения уже это волновать в принципе не должно. Если быть честным, то я просто торопился и не сумел до конца изучить антивирусную машину, именно сердце. Думаю, по мере возможностей я помещу в комментариях к статье, пометку, где и что надо изменить. В любом случае исходник патчера антивируса вы найдете на моем сайте, чем дальше буду углубляться, тем больше будет в патчере строк, а так же тем больше будет вообще патчеров на каждый антивирус.

[Заключение]

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

[Анонс на будущее]

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

[некоторые погрешности]

Как уже говорили, Outpost сразу же проинформирует пользователя, если файл будет изменен.… Тут я ничего поделать не могу, это тема для другой статьи…

Сердце антивирусной машины нашел но поздно уже не успевал по срокам, потому про сердце Касперского и НОДа я посвятил две другие статьи уже для детального рассмотрения, не для новичков.

[Главное]

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

или введите имя

CAPTCHA