Некорректная передача управления из Sysenter.

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
constant
Сообщения: 1
Зарегистрирован: 25 июн 2013, 08:58

25 июн 2013, 09:00

Хочу создать защиту для своей DLL. Для того, чтобы понять что делать взял пример защищенной DLL без исходного кода, только бинарник.
Первое, что я решил сделать – загрузить ее через LoadLibrary. Загрузки не происходит, выкидывается исключение. Загрузил в IDA, включил трассировку.

Трассировка доходит до следующего места:


00002088 ntdll:ntdll_KiFastSystemCall mov edx, esp EDX=001FF728
00002088 ntdll:ntdll_KiFastSystemCall+2 sysenter

После этого происходит передача управления сюда:

.vmp1:5F30670E in eax, dx
.vmp1:5F30670F push ecx
.vmp1:5F306710 call sub_5F306FFC
При этом выводится сообщение:

«5F30670E: Priveleged instruction (exc.code c0000096, tid 8328 )»

Ну и исключение генерируется.
После этого я попробовал написать простенькую DLL, загрузить ее и также оттрассировать. В результате: выполнение кода почти что «один в один», но с той разницей, что sysenter передает управление обратно в вызывающую exe-программу (из которой загрузка DLL происходит), т.е. сразу после LoadLibrary, т.е. здесь все нормально.
Верны ли мои дальнейшие рассуждения ?
Инструкция sysenter обеспечивает быстрый доступ с прикладного уровня на уровень ядра (ринг 0). Инструкция принимает три скрытых аргумента из MSR регистров: SYSENTER_CS_MSR (174h), SYSENTER_ESP_MSR (175h), SYSENTER_EIP_MSR, по которым и будет передаваться управление. Однако, их можно и подменить. В этом случае, можно перенаправить поток выполнения на «левый» код. Что, возможно и произошло в моем случае. Если это так, то существуют ли способы мониторить эти MSR регистры, отследить, где искажение ?
Если мои рассуждения неверны, пожалуйста поправьте меня. Спасибо.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 июн 2013, 11:24

Однако, их можно и подменить. В этом случае, можно перенаправить поток выполнения на «левый» код. Что, возможно и произошло в моем случае. Если это так, то существуют ли способы мониторить эти MSR регистры, отследить, где искажение ?
Загрузка библиотеки упала на однобайтовой команде in eax, dx. Эта инструкция не может быть выполнена в текущем кольце защиты и ее применение здесь, мягко говоря, очень странно. Ни к селу она там.
Это значит, что перед тем, как сделать LoadLibrary - эту команду меняют на NOP или меняют не только эту команду, но и другие "байтики" в нужных местах. На этом и строится защита.
Для подмены MSR регистров для SYSENTER нужно выполнить WMSR, а она из прикладного уровня работать не будет - просто GP0 вылезет и всем по башне даст. Подмену можно выполнить через драйвер, но ведь и его нужно как-то подгрузить. Так что не все так просто.
Если это так, то существуют ли способы мониторить эти MSR регистры, отследить, где искажение ?
конечно можно, делай RDMSR и сравнивай с эталоном. Только как это поможет в защите библиотеки?
It's a long way to the top if you wanna rock'n'roll
Ответить