|
|
|
constant |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2011 Репутация: нет Всего: нет |
Хочу создать защиту для своей DLL. Для того, чтобы понять что делать взял пример защищенной DLL без исходного кода, только бинарник.
Первое, что я решил сделать – загрузить ее через LoadLibrary. Загрузки не происходит, выкидывается исключение. Загрузил в IDA, включил трассировку. Трассировка доходит до следующего места:
После этого происходит передача управления сюда:
При этом выводится сообщение: «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 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: нет Всего: 6 |
Из юзермода это невозможно, запись осуществляется привилегированной инструкцией wrmsr. Значения соответствующих MSR регистров заполняются ядром при старте системы. В вашем случае, вероятно, сказалась разница в способе трассировки в первом случае и во втором. Разница в том, что если sysenter исполняется с возведённым флагом трассировки (EFLAGS_TF), что произошло в первый раз, то sysexit при переходе в ring3 не обязан восстанавливать значения регистров которые были на момент перехода в ring0, что и стало причиной неверного поведения в дальнейшем. Однако, ещё раз, это лишь моя догадка, т.к. я не знаю подробностей ваших тестов. |
|||
|
||||
Правила форума "Asm для Windows/DOS" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для Windows/Dos | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |