Сейчас на форуме: asfa, Rio (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Некорректная передача управления из Sysenter.
Посл.ответ Сообщение

Ранг: 0.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 июня 2013 23:48 · Поправил: constant
· Личное сообщение · #1

Хочу создать защиту для своей DLL. Для того, чтобы понять что делать взял пример защищенной DLL без исходного кода, только бинарник.
Первое, что я решил сделать – загрузить ее через LoadLibrary. Загрузки не происходит, выкидывается исключение. Загрузил в IDA, включил трассировку.

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

Code:
  1.  
  2. 00002088 ntdll:ntdll_KiFastSystemCall        mov     edx, esp                  EDX=001FF728    
  3. 00002088 ntdll:ntdll_KiFastSystemCall+2      sysenter 


После этого происходит передача управления сюда:

Code:
  1.  
  2. .vmp1:5F30670E in      eax, dx
  3. .vmp1:5F30670F push    ecx
  4. .vmp1:5F306710 call    sub_5F306FFC
  5.  


При этом выводится сообщение:

«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 регистры, отследить, где искажение ?
Если мои рассуждения неверны, пожалуйста поправьте меня. Спасибо.



Ранг: 27.7 (посетитель), 2thx
Активность: 0.01=0.01
Статус: Участник

Создано: 02 июля 2013 07:59
· Личное сообщение · #2

Да, MSR можно подменить, но длл это сделать не может, а только драйвер режима ядра. Тем более, что до sysenter исполняется только Ваш и системных длл код. Вы же не подменяли MSR, правда? Копаете не в ту сторону.

Управление передается не на 5F30670E, а на точку входа dll. Почему она далее решает "умереть" - надо изучать алгоритм от точки входа.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 июля 2013 08:38 · Поправил: reversecode
· Личное сообщение · #3

ему уже давно на rsdn ответили

--> Link <--

| Сообщение посчитали полезным: Abraham


Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 02 июля 2013 09:23
· Личное сообщение · #4

constant
Реально, не создаётся процесс перед этим? Поставьте бряк на NtCreateProcess/NtCreateProcessEx. Не мешало бы проверить несколько API на хуки/бряки. Проверку на хуки, используются ли они, быстрее можно установить бряком на VirtualProtect/VirtualProtectEx, NtProtectVirtualMemory, хотя может реально и напрямую соответсвующий сервис использоваться (через sysenter/int 2e), для чего для полной совместимости по идее должна бы ранее выполняться инструкция cpuid, а также GetVersion, чтобы определить возможности проца и ос.

-----
IZ.RU




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 02 июля 2013 09:27
· Личное сообщение · #5

.vmp1 это не вм_прот случаем? там же на TLS код еще. если я не ошибаюсь.. а вы поймали антидебаг.. управление по SEH передаваться должно

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 27.7 (посетитель), 2thx
Активность: 0.01=0.01
Статус: Участник

Создано: 02 июля 2013 11:32
· Личное сообщение · #6

VodoleY пишет:
там же на TLS код еще. если я не ошибаюсь..

а оно в DLL разве работает?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 июля 2013 11:51
· Личное сообщение · #7

TLS Callback в DLL работает, если она грузится статически.
Раз ответили на рсдн, то закрыто.
И по созданию защит-это не сюда, форумом ошиблись.


 eXeL@B —› Вопросы новичков —› Некорректная передача управления из Sysenter.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати