Неявный самоконтроль как средство создания не ломаемых защит [Крис Касперски] (pdf) читать постранично, страница - 9

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

какой, северный
олень! Буквально за однудве секунды мы вышли на след защитного кода, который
по замыслу автора мы ни за что не должны были обнаружить! А обнаружили мы его
только "благодаря" тому обстоятельству, что и смещение, и содержимое контроль
ной точки хранилось в программе в открытом виде. Вот если бы оно вычислялось
на лету на основе запутанных математических операций… впрочем, не будет повто
ряться, мы об этом уже говорили.
Хорошо, условимся считать, что поиск по содержимому не дал результатов
и хакер остался с защитой один на один. Что он еще может предпринять? А вот
что – аппаратная точка останова на модифицированный байт! Да, конечно, мы уже
устанавливали ее, но ранее слишком быстро отсекали "лишние" срабатывания.
Теперь же настало время заняться этим вопросом вплотную. Вновь запустив поряд
ком затосковавший за это время WDB, мы даем ему уже знакомую команду
"ba r4 0x401057" (не обязательно набивать ее на клавиатуре, достаточно лишь на
жать стрелку вверх и отладчик сам извлечет ее из истории команд). Первое сраба
тывание приходится на следующий код:
04010C8 C1E902
004010CB F3A5
004010CD 8BCA

shr
rep movs
mov

ecx,2
dword ptr [edi],dword ptr [esi]
ecx,edx

Узнаете? Ну да, были мы здесь недавно и все тщательно проанализировали,
так и не обнаружив ничего интересного. Идем дальше? Стоп! А точку останова на
буферприемник кто будет ставить? ОК, отдаем отладчику следующую команду:
"ba r4 (edi4)". Почему (edi4)? Так ведь точки останова срабатывают после выпол
нения соответствующей им команды, т. е. на момент всплытия отладчика, регистр
EDI указывает на следующее двойное слово, а совсем не на то, которые содержит
только что скопированный в буфер код.
Очередное всплытие отладчика приводит нас к коду расшифровщика, уже
знакомому нам и не содержащему абсолютно ничего интересного. Не тратя на не
го понапрасну свое драгоценное время мы отдаем команду "G" и… через серию по
следовательных всплытий отладчика, отождествляем расшифровку защитного ко
да, его обратное копирование, явную проверку контрольной суммы и, наконец,
сталкивается с малопонятным на первый взгляд кодом, про который можно сказать
лишь одно: он использует значение тех самых ячеек защитного кода, которые мы
варварски "модернизировали":
Крис Касперски

18

Неявный самоконтроль как средство создания не ломаемых защит
0040113F
0401144
00401148
0040114C
00401152
00401158
0040115D
00401161

E80CFFFFFF
8B4C2463
8B54244F
81F174156848
81F20F94C05E
B802000000
8D4C1104
8D54240C

call
mov
mov
xor
xor
mov
lea
lea

00401050
ecx,dword ptr [esp+63h]
edx,dword ptr [esp+4Fh]
ecx,48681574h
edx,5EC0940Fh
eax,2
ecx,[ecx+edx+4]
edx,[esp+0Ch]

Конечно, в данном демонстрационном примере алгоритм "балансировки"
распознается без особого труда и серьезных умственных усилий, но как бы там ни
было, аппаратные точки останова позволили выявить тот самый код, что осущест
вляет неявный контроль целостности защиты. Кстати, аппаратных контрольных
точек всего четыре, а количество буферов, в которые можно запихать "клоны" ко
пий оригинального кода программы – не ограничено много. Словом, если чуть
чуть постараться, можно очень сильно умерять хакерский пыл – за всеми буфера
ми так просто не уследить, придется анализировать огромное количество кода,
лишь часть из которого непосредственно относится к защитному механизму, а все
остальное – мусор. Чтобы еще больше запутать хакера можно осуществлять неяв
ный контроль целостности не при каждом запуске программы, а, скажем, на осно
ве датчика случайных чисел, – один раз, эдак, из десяти. "Плавающая" защита –
что может быть хуже?! Да, теоретически можно и ее сломать, но: вопервых, даже
трудно себе представить сколько на нее придется угробить времени, а, вовторых,
никто не даст и кончика хвоста на отсечение, что выявлены и нейтрализованы все
уровни защиты. Ведь аппаратные точки срабатывают лишь в момент обращения
к ним, а дизассемблирование бессильно выявить адреса, получаемые на основе
сложных математических манипуляций с указателями.
Но всетаки давайте доломаем нашу защиту. В данном конкретном случае
мы можем нейтрализовать защитный механизм, просто заменив команду
xor ecx, 48681574h на xor ecx, 48689090h, т. е. просто скорректировав "балансир".
Однако, при взломе реальной программы хакер должен убедиться, что корректиру
емый им балансир и не балансирует чтото еще.

Крис Касперски

19