Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Некорректная передача управления из Sysenter.


Автор: constant 24.6.2013, 23:08
Хочу создать защиту для своей 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 регистры, отследить, где искажение ? 
Если мои рассуждения неверны, пожалуйста поправьте меня. Спасибо.




Автор: DarthTon 1.7.2013, 21:04
Цитата

Однако, их можно и подменить. В этом случае, можно перенаправить поток выполнения на «левый» код. Что, возможно и произошло в моем случае

Из юзермода это невозможно, запись осуществляется привилегированной инструкцией wrmsr. Значения соответствующих MSR регистров заполняются ядром при старте системы. 

В вашем случае, вероятно, сказалась разница в способе трассировки в первом случае и во втором. Разница в том, что если sysenter исполняется с возведённым флагом трассировки (EFLAGS_TF), что произошло в первый раз, то sysexit при переходе в ring3 не обязан восстанавливать значения регистров которые были на момент перехода в ring0, что и стало причиной неверного поведения в дальнейшем. Однако, ещё раз, это лишь моя догадка, т.к. я не знаю подробностей ваших тестов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)