![]() |
eXeL@B —› Вопросы новичков —› Некорректная передача управления из Sysenter. |
Посл.ответ | Сообщение |
|
Создано: 24 июня 2013 23:48 · Поправил: constant · Личное сообщение · #1 Хочу создать защиту для своей DLL. Для того, чтобы понять что делать взял пример защищенной DLL без исходного кода, только бинарник. Первое, что я решил сделать – загрузить ее через LoadLibrary. Загрузки не происходит, выкидывается исключение. Загрузил в IDA, включил трассировку. Трассировка доходит до следующего места: Code:
После этого происходит передача управления сюда: Code:
При этом выводится сообщение: «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 регистры, отследить, где искажение ? Если мои рассуждения неверны, пожалуйста поправьте меня. Спасибо. ![]() |
|
Создано: 02 июля 2013 07:59 · Личное сообщение · #2 Да, MSR можно подменить, но длл это сделать не может, а только драйвер режима ядра. Тем более, что до sysenter исполняется только Ваш и системных длл код. Вы же не подменяли MSR, правда? ![]() Управление передается не на 5F30670E, а на точку входа dll. Почему она далее решает "умереть" - надо изучать алгоритм от точки входа. ![]() |
|
Создано: 02 июля 2013 08:38 · Поправил: reversecode · Личное сообщение · #3 |
|
Создано: 02 июля 2013 09:23 · Личное сообщение · #4 constant Реально, не создаётся процесс перед этим? Поставьте бряк на NtCreateProcess/NtCreateProcessEx. Не мешало бы проверить несколько API на хуки/бряки. Проверку на хуки, используются ли они, быстрее можно установить бряком на VirtualProtect/VirtualProtectEx, NtProtectVirtualMemory, хотя может реально и напрямую соответсвующий сервис использоваться (через sysenter/int 2e), для чего для полной совместимости по идее должна бы ранее выполняться инструкция cpuid, а также GetVersion, чтобы определить возможности проца и ос. ----- IZ.RU ![]() |
|
Создано: 02 июля 2013 09:27 · Личное сообщение · #5 |
|
Создано: 02 июля 2013 11:32 · Личное сообщение · #6 |
|
Создано: 02 июля 2013 11:51 · Личное сообщение · #7 |
![]() |
eXeL@B —› Вопросы новичков —› Некорректная передача управления из Sysenter. |
Эта тема закрыта. Ответы больше не принимаются. |