Некорректная передача управления из Sysenter.
От: constant_arapov  
Дата: 25.06.13 04:14
Оценка:
Хочу создать защиту для своей 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 регистры, отследить, где искажение ?
Если мои рассуждения неверны, пожалуйста поправьте меня. Спасибо.
Re: Некорректная передача управления из Sysenter.
От: _stun_ Россия  
Дата: 25.06.13 11:29
Оценка:
Здравствуйте, constant_arapov, Вы писали:


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


....

_>Верны ли мои дальнейшие рассуждения ?


Рассуждения, может, и верны. Но будет гораздо проще, если Вы еще и сall stack приведете для того места, до которого доходит трассировка.
Re: Некорректная передача управления из Sysenter.
От: Аноним  
Дата: 25.06.13 13:57
Оценка:
Содержимое сервисных стабов в данном случае абсолютно никакого значения не имеет. Какой сервис вызывается ?
Re: Некорректная передача управления из Sysenter.
От: ononim  
Дата: 25.06.13 14:18
Оценка:
_>
_>.vmp1:5F30670E in      eax, dx
_>.vmp1:5F30670F push    ecx
_>.vmp1:5F306710 call    sub_5F306FFC
_>

_>При этом выводится сообщение:
_>«5F30670E: Priveleged instruction (exc.code c0000096, tid 8328 )»
Типичный антидебаг прием — кинуть эксцепшн и обычным или какимнить ни хитрым способом про который никто не знает его словить и обработать.
Хитрые способы, про которые никто не знает:
1) Поставить vectored exceoptin handler
2) похукать ntdll!KiUserExceptionDispatcher
3) запустить процесс-"дебаггер", который будет ловить исключения в нашем процессе и обрабатывать их как надо


_>Инструкция sysenter обеспечивает быстрый доступ с прикладного уровня на уровень ядра (ринг 0). Инструкция принимает три скрытых аргумента из MSR регистров: SYSENTER_CS_MSR (174h), SYSENTER_ESP_MSR (175h), SYSENTER_EIP_MSR, по которым и будет передаваться управление. Однако, их можно и подменить. В этом случае, можно перенаправить поток выполнения на «левый» код. Что, возможно и произошло в моем случае. Если это так, то существуют ли способы мониторить эти MSR регистры, отследить, где искажение ?

Юзермод в msr лазить не может
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.