|
Chanel: #TGBR, #hack-psihoz, Service: irc.dalnet.ru, Port: 6667
Содержание
TGBR E-ZineS #1:
Автор: Dr.Cert
Как обмануть антивирус или антиотладка II
Эх, все труднее и труднее становится жить, ведь серьезно, как не грустно это признавать, а ведь реально за 2007 год защитные системы скакнули очень даже хорошо вверх, наверное виста так повлияла, мобилизировала всех так сказать :) Сравнение Outpost 4 с Outpost 2008 только чего стоит, но это еще что, но новый уровень перешли антивирусы со своими эмуляторами и эвристиками, средства анализа очень прибавили, чего только одна IDA 5.2 стоит. Но не все так страшно, как кажется на первй взгляд, ведь по любому главное - эт правильный подход всегда, как посмотреть внимательнее, так нубов число уменьшилось, веселее жить стало, ну ведь совершенно точно, что у нас с тобой подход правельный, раз читаешь эту статью? Да одна фигня эта защита, еще не скоро она станет такой, чтобы обламывать наши планы, ведь по любому приятно, когда софт работает отлично, стабильно обламывая даже не столько антивирус, а антивирусных аналитиков, которые будут по любому покушаться на наш софт.
Тоже недавно решил выйди на сцену так сказать, наклацкал себе кое какой софт, и на тебе, как начал палиться, пришлось хорошенько покопаться в коде, чтобы все было гуд, вот и думаю, что, совершенно точно эта информация пригодится любому человеку в теме, да честно говоря даже просто тому, кто хочет защитить свой код от анализа. Итак, начинаем наш новогодний обзор! :)
=1 Назад в прошлое
Есть в Windows один очень занимательный механизм под названием TLS, что в расшифровке и переводе на русский означает "локальная память потока", создана сия поделка как довес очень удобной библиотечной технологии, которая была принята начиная для 32 разрядников, создатели механизма планировали связывать с его помощью определенные данные с определенным потоком исполнения, что это дает? Это дает возможность создать в итоге почти не ограниченное число потоков исполнения еще до выхода на реальную точку входа! То есть еще до начала исполнения нашего проекта одна, две, три ветки программы могут уже быть исполнены, потрясающее зрелище, когда запускаешь отладчик, а еще до запуска запускается антиотладочная ветка определяющая, что используется отладчик во всеми последствиями :) Что это нам дает? Это дает отличный способ запутать антивирус и внести в свой проект отличное средство антиотладки, которое легко сбережет нас от начинающего аналитика, заставив его долго думать, в чем же тут дело. С технической части все просто элементарно и умещается в буквально несколько строк, TLS на самом деле просто небольшая структура, которая будет у нас заполнена нулями и одним калбэком, там просто заполняем структуру
TLS_DIRECTORY STRUCT
lpTlsDataStart dd ? ;copy block starting here
lpTlsDataEnd dd ? ;and ending here + block (size=ZeroFillSize) filled with 0 to
lpTlsIndex dd ? ;DS:[FS:[2CH]]+TlsIndex*4
lpTlsCallbacks dd ? ;pointer to 0 terminated array of pointers to callbacks
ZeroFillSize dd ? ;overall size=lpTlsDataEnd-lpTlsDataStart+ZeroFillSize
TLS_DIRECTORY ENDS
Примерно такого вида
public _tls_used
_tls_used TLS_DIRECTORY <nullPr, nullPr, nullPr, callBack, 0>
Где callBack будет указателем на наши калбэки, например
callBack dd TlsProc ; запускаем первую ветку
или
callBack dd TlsProc ; запускаем первую ветку
dd TlsProc ; вторую, эту можно вобще убрать, она совершенно не обязательна
И уже можно отлично работать, все будет просто потрясающе смотреться :)
=2 ЁП :)
Второй способ более экстравагантный я бы сказал, там смысл у нас будет заключаться в том, что когда файл мапится в оперативную память, мапится он с адреса базы(ImageBase), который обычно равен 00400000, дальше EIP переходит на точку входа, которая в памяти у нас будет равна ImageBase + EntryPoint в PE заголовке, то есть если EntryPoint у нас равен 00001000, EIP будет на адресе 00401000, то есть это точка входа в программу у нас такая. А что же будет если взять Lord Pe и быстренько поставить EntryPoint например в 0? наша точка входа будет в 00400000, а ждут нас там опкоды 4D5Ah (те самые MZ), которые в переводе на асм будут выглядеть как
00400000 4D DEC EBP
00400001 5A POP EDX
Что вполне нормально, в чем мы можем легко совершенно убедиться набрав в OllyDbg Ctrl + G и введем 00400000. Ну как? Есть мысли что делаем дальше? Конечно же мы ставим jmp на 00401000(в реальную точку входа) по адресу 00400002, просто щелкаем на пробел и вводим jmp 00401000 и нажимаем Assemble, Cencel и получаем отличную картину
00400000 4D DEC EBP
00400001 5A POP EDX
00400002 - E9 F90F0000 JMP 00401000
Чего мы и собирались собтно сделать, мы просто прыгаем на реальную точку входа при этом обламывая все эмуляторы и отладчики(да, OllyDbg в том числе), которые полагают, что точка входа EntryPoint не может быть 0(можно кстати даже не 0 поставить, а скажем 00000002). Наша фитча готова и теперь смело щелкаем правой кнопкой по окну с кодом "Copy to executable -> All Modifications -> Copy All " в появившемся окне не раздумывая, клацаем правой кнопкой на "Seve file" и благополучно сохраняем наш измененный проект, ну а дальше как по маслу все, элементарно открываем сохраненный .exe в Lord Pe и моментально ставим EntryPoint 0 и при попытке открытия нашего проекта в Olly удивленно смотрим, файл не отлаживается! А как антивирусные анализаторы то рады, все молчат, все гуд грят, но злобный антивирус маккафи сразу подумал, что мы злобные хакиры пишет "New", типа маст хэв :) Все просто, ну а вы думали? ;)
=3 Легко и просто
Хоть и вышли на новый уровень антивирусные анализаторы, а все равно они еще очень глупые, чем мы цинично воспользуемся :) Все легко как 2 байта, просто пишем исполнение основного кода, рабочей нагрузки в новой ветке программы, которую элементарно создаем примерно так
mov eax, offset PayLoad
invoke CreateThread, NULL, NULL, eax, NULL, NULL, addr ThreadID
Антивирус просто не сможет проанализировать созданную ветку и легко одобрит наш отличный проект, а так и правильно совершенно ;) Даже вот для наглядности пример приведу, антивирус Avira встречая функции на подобие WinExec и UrlDownloadToFile начинает ругаться, ну а если поставить то же самое, но уже с CreateThread, то все будет по высшему гуд ;)
=4 Обработчик исключений на страже порядка
Я плакаю, когда вижу, как антивирусы(или аналитики) не могут понять куда делся EIP, после самого заезженного и элементарного антиотладочного приема с подменой обработчика исключений, ну че тут поделаешь, не доросли пока, чем мы коварно воспользуемся :) Код будет просто элементарный
push offset Payload ; продолжение нашего кода
assume fs: nothing
push fs:[0]
mov fs:[0],esp
mov dword ptr[0], 123 ; допускаем ошибку
В итоге мы в отладчике попадаем глубоко в кору, а проект между тем продолжает отлично выполняться как ни в чем не бывало :) Есть правда менее заезженный способ, но WinApi там, как-то не красиво получается
invoke RtlAddVectoredExceptionHandler, 1, addr PayLoad
В итоге у нас отличная антиотладка и защита от некоторых эмуляторов, что несомненно есть гуд :) Правда некоторые будучи не в состоянии чета сделать с ситуацией просто тупо называют нас всякими суспекусами, мол куда улетел код-то? :)
=5 Трэш - эт по нашему :)
Как и совершенно не странно механизмы дизассемблеров не идеальны и их часто можно элементарно запутать, да и вследствие того, кто работает за этим отладчиком, что думаете мы увидим в отладчике, скомпилировав код
jmp offset Codes
jmp offset start + 67137
mov eax, 123
add ebx, 888
Codes:
; полезный код
xor ebx, ebx
DB 0EAh
Правильно! Мы увидим мясо :) А в чем же фишка спросите вы? А в том, что очень многие дизассемблеры(эмуляторы тоже их содержат) имеют один общий глюк, можно сбить дизассемблер с толку, если выставить переход jmp, после него вполне работающий код, а после него опкод джампа, в нашем случае DB 0EAh, в итоге просто он выстроит не правельную последовательность команд и усе, да будет ему мясо! :)
=6 Нулл дэй
Вот мы и добрались до небольшого продолжения 5го пункта, и по совместительству свеженького средства антиотладки, на самом деле частицы этой технологии известны еще со времен ДОС, но были благополучно забыты(спасибо Крису большое за то, что напомнил), суть идеи в том, что в одну большую, пятибайтовую команду, например mov eax, 0DDAADDAAh можно впихнуть еще парочку команд и запутать тем самым отладчик, который выполнит mov eax, 0DDAADDAAh, вместо того, что там у нас спрятано, а вдруг там спрятаны пара бат защитного механизма, по которым можно определить трэйсят нас или нет? так конечно! Есть у нас скажем
00401001 BA 69668ED1 MOV EDX,D18E6669
Ну нормальная команда, как полагается все, а что будет если посмотреть эту команду с другого угла так сказать :) Например зайти на середину команды по адресу 00401004, мы увидем уже другую совсем картину ;)
00401004 8ED1 MOV SS,CX
И вот так спрятав части команд в таких же командах более длинных командах, можем легко наклацать отличный антитрэйсинг, ой, я разве сказал, можем... Так мы уже все сделали, все сорцы можешь найти в архиве к статье, ну и конечно же тестовый .exe, попробуй-ка потрейсить сайсом или оллей, везде буит работать просто отлично ;)
Все таки не все так плохо, как может показаться, а вполне даже хорошо, главное подход правильный, ведь на самом деле решение всех проблем часто элементарное и находится прямо перед глазами :) А в новом году пожелаю только огромных творческих успехов, и чтобы взгляд был всегда жире, чем могут увидеть другие, с новым годом!
Материалы к статье - ../soft/dr.cert.rar Вес - 94,2кб
Only for TGBR E-ZineS, by Dr.Cert, TGBR.ORG 27.12.07
Содержание
|
|