Прячем SoftICE от обнаружения Ring3-защитами. Установив Айс из оригинального дистрибутива и попытавшись с помощью него исследовать защищенные проги у нас ничего хорошего не получится, т.к. Айс давно уже находится в черном списке, и лучшем случае получишь сообщение об отладчике, а в худшем - Винда вывалится в синий экран (HASP) или зависнет намертво (StarForce 3.3). Не понадеевшись на IceExt, мне надоело прятать айс от ring3-защит и решил один раз и навсегда спрятать айс. Поэтому пришлось самому исправлять все бэкдоры и баги, оставленные разработчиками. Надеюсь еще у кого-то не осталось гимора, перехватывая CreateFile, пытаясь скрыть свой любимый отладчик, поэтому мы сделаем это один раз и навсегда, пропатчив дрова Айса твоими руками с помощью инфы, приведенной ниже. Не бойся патчить дрова - если все правильно сделано то все сообщения об обнаруженном отладчике исчезнут. Исправление нижеприведенных баг и бэкдоров поможет только прогам, не имеющих своих собственных драйверов. Прога, получая выход в Ring 0 может делать что попало с системой, а т.к. Айс работает в Ring 0, то оставляет там огромное количество следов, начиная с почти полностью перехваченной IDT и заканчивая бряками на системных функциях и исправить все это невозможно, и поэтому там будет совершенно индивидуальный подход к каждой защите. Описанные здесь методы подходят к Виндам на ядре NT, под 9x будут некоторые различия. После всех модификаций драйверов необходимо пересчитать их контрольную сумму, иначе система вообще откажется их загружать. У всех дров, загружамой системой, проверяется контрольная сумма. К счастью алгоритм подсчета суммы уже есть в IMAGEHLP.DLL и выполняет это функция MapFileAndCheckSum: DWORD MapFileAndCheckSum( PTSTR Filename, PDWORD HeaderSum, PDWORD CheckSum); Основные баги и бэкдоры 1. Файл "\\.\Ntice", "\\.SICE" Это первый и самый популярный метод - открыть файл. Где только я не находил это имя - даже в видеокодеках. Здесь и далее мы заменим "Ntice" на какое-нибудь другое слово из 5 букв - например "Icent", далее по тексту новое имя я просто буду называть "XXXXX"; обязательно придумай свое имя, иначе в черный список защит попадет еще одно имя. Также необходимо спрятать видеодрайвер SIWVID, переименовываем в какое-нибудь другое имя, назовем его условно "YYYYYY". Переименовываем ntice.sys в XXXXX.sys и siwvid.sys в YYYYYY.sys. Нам нужен любой hex-редактор с возможностью поиска текста в обычном 1-байтовом формате и 2-байтовом (Unicode), например WinHex. В редакторе открываем ntice.sys и ищем и заменяем следующие строчки в формате ASCII и UNC, заканчивающиеся на 1 ноль ( 2 в UNC): Важно: некоторые строчки встречаются по нескольку раз, поэтому надо заменять все. "Device\Ntice" - "Device\XXXXX" "DosDevices\NTice" - "DosDevices\XXXXX" "Driver\NTice" - "Driver\XXXXX" "HKLM\System\CurrentControlSet\Services\NTice\" - "HKLM\System\CurrentControlSet\Services\XXXXX\" "Device\Siwvid" - "Device\YYYYYY" Далее ищем целое слово "Siwvid" и заменяем его на "YYYYYY". В редакторе открываем siwvid.sys и в нем заменяем следующие строчки: "Registry\Machine\System\CurrentControlSet\Services\NTice" - "Registry\Machine\System\CurrentControlSet\Services\XXXXX" "Device\Siwvid" - "Device\YYYYYY" "Registry\Machine\System\CurrentControlSet\Services\Siwvid" - "Registry\Machine\System\CurrentControlSet\Services\YYYYYY" "DosDevices\SiwvidStart" - "DosDevices\YYYYYYStart" Далее в реестре необходимо изменить названия служб: "HKLM\SYSTEM\CurrentControlSet\Services\NTice" - "HKLM\SYSTEM\CurrentControlSet\Services\XXXXX" "HKLM\SYSTEM\CurrentControlSet\Services\Siwvid" - "HKLM\SYSTEM\CurrentControlSet\Services\YYYYYY" соответственно надо исправить в этих разделах пути к файлам в "ImagePath". Также необходимо найти в папке, где заинсталлен Айс библиотеку nmtrans.dll и в ней исправить "\\.\Ntice" на "\\.\XXXXX". Если юзаешь IceExt, то с ним нужно провести аналогичную модификацию. :) Переименование служб не дает возможности выяснить через QueryServiceStatus состояние служб. 2. Обнаружение по INT 3(Magic SI/DI) При запущенном Айсе такой код не вызовет исключения, а продолжит спокойно выполняться: mov si, 4647h mov di, 4a4dh int 3 Этот старый бэкдор со времен ДОС широко используется почти во всех защитах. Далее необходимо отправить ntice.sys в Иду и выяснить адреса обработчиков int 3, int 41, int 68. В Айсе даем команду "IDT" и получаем базу таблицы N. Командой "DW N+3*8" (каждый дескриптор занимает 8 байт) дампим в виде слов и увидем примерно такое: X 0008 EE00 Y подставив слова X и Y, даем команду "U Y<<10h | X" и увидем "код" обработчика прерывания № 3: push A jmp B B - это и есть настоящий адрес обработчика прерывания внутри Айса. Нам нужен относительный адрес: Получаем базу Айса через команду "driver ntice" и вычитаем ее из адреса. К реальной базе (обычно это 10000h) прибавляем относительный адрес и переходим по нему в Иде: .text:00031070 INT3_Handler proc near .text:00031070 ; DATA XREF: sub_3299A+68o .text:00031070 cld .text:00031071 call sub_46CB6 .text:00031076 cmp cs:byte_D7B4D, 1 .text:0003107E jnz short loc_31081 .text:00031080 retn .text:00031081 loc_31081: ; CODE XREF: INT3_Handler+Ej .text:00031081 call sub_3315A .text:00031086 lea esp, [esp+4] .text:0003108A cmp si, 4647h .text:0003108F jnz short loc_310BB .text:00031091 cmp di, 4A4Dh .text:00031096 jnz short loc_310BB .text:00031098 call sub_318EA .text:0003109D jnb short loc_310B5 .text:0003109F mov dword_D29CA, 10004h .text:000310A9 mov byte_B7166, 0 .text:000310B0 call sub_319AA .text:000310B5 .text:000310B5 loc_310B5: ; CODE XREF: INT3_Handler+2Dj .text:000310B5 call sub_33114 .text:000310BA iret Заменой в выделенном тексте JNZ на JMP, этот бэкдор убивается навсегда. 3. INT 1 ( неверный DPL) Следующий код при запущенном Айсе выполнится без исключения: int 1 При запуске Айс прехватывает прерывание № 1, устанавливая уровень доступа 3 ( User mode) вместо 0. В той же Иде возле начала кода обработчика прерывания 3 видно сcылку".text:00031070 ; DATA XREF: sub_3299A+68o", перейдем на функцию, которая использует смещение данной, а также установливает другие обработчики прерываний: mov dl, 1100000b mov edi, offset INT1_handler call SetInterruptHandler mov eax, 2 xor dl, dl mov edi, offset INT2_NMI call SetInterruptHandler mov eax, 3 mov dl, 1100000b mov edi, offset INT3_Handler call SetInterruptHandler mov eax, 6 mov eax, 41h mov dl, 60h mov edi, offset INT41 call SetInterruptHandler mov eax, 2Dh mov dl, 60h mov edi, offset INT2D_handler call SetInterruptHandler B EAX записывается номер прерывания, DL отвечает за DPL, если выполнить DL >> 5 то и получишь уровень доступа, если покопать глубже в SetInterruptHandler то можно увидеть, что DL пишется в поле DPL дескриптора в IDT. INT41 также разрешается исполнять в Ring 3, поэтому заменив DL c 60h на 0 мы разрешим исполнять эти прерывания только из Ring 0. 4. Бряк на UnhandledExceptionFilter Айс устанавливает бряк на kernel32.UnhandledExceptionFilter,заменея на код СС прямо первый байт и всплывая, когда сдыхает очередная глючная прога, но всякие защиты очень любят проверять первый байт функций на равенство СС. Поэтому заменим в ntice.sys строчку "kernel32!UnhandledExceptionFilter" на неправильную - kernel32!UnhandledExceptionFilte_" 5. Использование драйверов Если же все-таки защита использует дрова, то нужно отлаживать драйвер и смотреть как он определяет присутствие отладчика. Например SafeDisc поступает крайне тупо - сравнивает адреса обработчиков прерываний №3 и №4, причем их младшие слова и если разница меньше 256 байт то вылетает. Старшие слова адресов могут быть разнесены на МБ! Вообще под ring0 существует масса способов противодействовать Айсу например установить esp в 0 или использовать прерывания 1 и 3 в своих целях. Тогда крэкеры переходят на новый уровень взлома - использование эмуляторов, например я использую VMWare и Bochs. Однако под VMWare все болезни отладчиков переносятся из системы-хозяйки в систему-гость, разве что смерть виртуальной машины не воспринимается та серьезно как ребут всего компа, так что Bochs - идеальный эмулятор для взлома самых извращенных защит, работающих в ring0, однако основный его недостаток - ужасно медленная работа из-за полной эмуляции процессора, НО ЗАТО виртуальный точки отанова можно ставить куда-угодно, хоть на процедуры обработки прерываний.
|