Сейчас на форуме: Magister Yoda, vasilevradislav (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Int 2e vs sysenter
Посл.ответ Сообщение

Ранг: 16.5 (новичок), 5thx
Активность: 0.01=0.01
Статус: Участник
iOS expert

Создано: 07 января 2014 16:27
· Личное сообщение · #1

Вопрос знатокам ядра и винды.
Code:
  1. .text:7C90D040                 mov     eax, 20h        ; NtContinue
  2. .text:7C90D045                 mov     edx, 7FFE0300h
  3. .text:7C90D04A                 call    dword ptr [edx]
  4. .text:7C90D04C                 retn    8
  5. .text:7C90D04C _ZwContinue@8   endp

1-ый вопрос который возник - в этом коде используется адрес 7FFE0300h, который лежит за пределами ntdll.dll. Но там находится ссылка на функцию из ntdll.dll - KiFastSystemCall, которая выглядит следующим образом:
Code:
  1. ntdll_KiFastSystemCall proc near
  2. mov     edx, esp
  3. sysenter
  4.  
  5. ntdll_KiFastSystemCallRet:
  6. retn
  7. ntdll_KiFastSystemCall endp

Зачем так сделано, если все равно не используется рандомизация базы, да и что мешало явно вызвать системный вызов, который находится в этом же образе? Т.е. зачем-то есть внешняя ссылка, которая ссылается все равно на внутреннюю функцию модуля. Это защита от чего-то, костыль или что-то иное вне зоны моего понимания?

Далее. Если попытаться расшифровать название, имеется в виду "быстрый системный вызов". Рядом есть еще вот такая функция:
Code:
  1. ntdll_KiIntSystemCall proc near
  2. lea     edx, [esp+8]
  3. int     2Eh
  4. retn
  5. ntdll_KiIntSystemCall endp

Это тогда что? "Медленный" системный вызов?

Если тут нужен RTFM и понимание этих механизмов достигается чтением матчасти, а не опытом, то ссылки на статьи, поясняющие эти моменты, приветствуются.



Ранг: 16.5 (новичок), 5thx
Активность: 0.01=0.01
Статус: Участник
iOS expert

Создано: 07 января 2014 17:32 · Поправил: Katana
· Личное сообщение · #2

Если внимательно посмотреть на эту ссылку, то увидим там следующее:
Code:
  1. 7FFE0300 off_7FFE0300 dd offset ntdll_KiFastSystemCall
  2. 7FFE0304 dd offset ntdll_KiFastSystemCallRet

Я предположил, что FastSystemCall и IntSystemCall симметричные методы. Поиск по форуму дал несколько тем, в которых номера сервисов для Int 2E и Syscall/Sysenter совпадают. Значит, это типа альтернативные методы. Пробуем запатчить на метод IntSystemCall. Вот скрипт для IDA (ест-но под отладкой, "жертва" - блокнот)

Code:
  1. PatchDword(0x7FFE0300, 0x7C90E500); // ссылка на IntSystemCall
  2. PatchDword(0x7FFE0304, 0x7C90E506); // ссылка на его retn


И ничего! Ни ошибки, ни изменения этих ссылок. Вывода может быть два: IDA блокирует изменение этих ссылок (хотя зачем ей это было бы надо), или же, что вероятней, ядро контролирует эту память, и не позволяет ее менять. Механизм защиты?




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

Создано: 07 января 2014 17:35 · Поправил: reversecode
· Личное сообщение · #3

виндовс инсайд вас спасет
sysenter не всеми cpu поддерживается, поэтому это проверяется и патчится на ходу под int если не поддерживается

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

Ранг: 16.5 (новичок), 5thx
Активность: 0.01=0.01
Статус: Участник
iOS expert

Создано: 07 января 2014 17:47
· Личное сообщение · #4

reversecode
Примерно так и предполагал, спасибо за разяснения.

Windows Inside это типа Руссинович что ли? Всегда хотел прочитать, пожалуй этим и займусь.


 eXeL@B —› Крэки, обсуждения —› Int 2e vs sysenter
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати