Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #64, МАРТ 2006 г.

защита игр от взлома

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #064, стр. 064-066-11


отладочные регистры

Аппаратную точку останова можно обнаружить чтением регистров Drx. Команда mov eax,DrX на прикладном уровне приводит к исключению, кроме того, отладчик (теоретически) может отслеживать обращение к отладочным регистрам, чтобы маскировать свое присутствие, — x86 процессоры предоставляют все необходимое для этого. Но если распаковщик прочитает свой контекст, он сможет дотянуться и до Drx, причем не только на чтение, но и на запись! Получается, что можно не только обнаружить точки останова, но и обезвредить их. Весь вопрос в том, как получить контекст. Чтение SDK выявляет API-функцию GetThreadContext, которая как раз для этого и предназначена, однако пользоваться ей нельзя, иначе хакер установит сюда точку останова и защита проиграет войну.

Нужно действовать так. Регистрируешь из распаковщика собственный обработчик SEH, возбуждаешь исключение (делишь на ноль, обращаешься по недействительному указателю) и получаешь контекст в одном из аргументов структурного обработчика. Остается установить точку останова на fs:0, где и хранится указатель на SEH-обработчик (но до этого додумается не каждый хакер).

структурные исключения

Кстати о fs:0. Первое, что делает стартовый код, — это регистрация собственного SEH-обработчика, поэтому установка точки останова на fs:0 позволяет хакеру всплыть сразу же после завершения распаковки, следовательно, распаковщик должен обращаться к этой ячейке как можно чаще. Десятки или даже тысячи раз, причем следует класть туда не что угодно, а именно ESP, иначе хакер установит условную точку останова (soft-ice это позволяет) и легко обойдет защиту.

поиск по сигнатуре

Есть такой козырный хакерский трюк. Взломщик снимает дамп с работающей программы, находит там стартовый код по сигнатуре, определяет его адрес и ставит на его начало аппаратную точку останова (программную ставить нельзя, она будет затерта при распаковке). Разработчику защиты необходимо либо распознавать аппаратные точки останова и снимать их, действуя по методике, описанной выше, либо использовать модифицированный стартовый код, который не сможет распознать хакер.

контроль $pc

Еще один трюк. Большинство распаковщиков располагаются в стороне после распакованного кода и при передаче управления на оригинальную точку входа прыгают куда-то далеко. Хакер может использовать этот факт как сигнал о том, что распаковка уже завершена. Конечно, установить аппаратную точку останова на это условие уже не удастся, и придется прибегнуть к пошаговой трассировке (ей легко противостоять), но ради подобного случая хакер может написать и трейсер нулевого кольца. Несложно. Сложно определить, когда же заканчивается распаковка. Контроль на $pc (в терминологии x86 — «eip») — единственный универсальный способ, который позволяет сделать это без особых измен и, чтобы обломать хакера, распаковщик должен как бы «размазывать» себя вдоль программы. Тогда он победит!

Назад на стр. 064-066-10  Содержание  Вперед на стр. 064-066-12