Хочу создать защиту для своей 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 регистры, отследить, где искажение ?
Если мои рассуждения неверны, пожалуйста поправьте меня. Спасибо.
Содержимое сервисных стабов в данном случае абсолютно никакого значения не имеет. Какой сервис вызывается ?
_>_>.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 лазить не может