Четверг
2024-05-02, 0:42 AM
SITE LOGO
Приветствую Вас Ламер | RSS
Главная страница Регистрация Вход
Меню сайта

Наш опрос
Оцените мой сайт
Всего ответов: 7

Начало » 2006 » Ноябрь » 5 » Основные способы обнаружения SoftICE и собственноручное скрытие навсегда
Основные способы обнаружения SoftICE и собственноручное скрытие навсегда
Прячем 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, однако основный его недостаток - ужасно медленная работа из-за полной эмуляции процессора, НО ЗАТО виртуальный точки отанова можно ставить куда-угодно, хоть на процедуры обработки прерываний.

Просмотров: 2040 | Добавил: Haker | Рейтинг: 0.0 |
Всего комментариев: 1
1 Даниил  
0
Сенкс, очень благодарен!

Имя *:
Email *:
Код *:
Форма входа

Календарь новостей
«  Ноябрь 2006  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930

Поиск по новостям

Друзья сайта

Статистика


Copyright MyCorp © 2006
Сайт управляется системой uCoz