В статье "Обнаружение скрытых процессов" - http://www.wasm.ru/article.php?article=hiddndt , многоуважаемого господина Ms-Rem сказано, что: "Особенность Windows XP в том, что системный вызов может быть произведен как через sysenter, так и через int 2Eh, поэтому нам нужно заменить оба обработчика своими." Но в когде такая картина Код (Text): switch (*NtBuildNumber) { case 2195 : //win 2k pIdOffset = 0x09C; ActPsLink = 0x0A0; NameOffset = 0x1FC; ppIdOffset = 0x1C8; ThreadProc = 0x22C; WaitProcOffset = 0x1D0; HandleTableOffset = 0x128; HandleTableListOffset = 0x054; QuotaProcessOffset = 0x00C; SetSyscallHook = Set2kSyscallHook; SyscallUnhook = Win2kSyscallUnhook; ScanHandleTable = ScanWin2KHandleTable; Win2KGetKiDispatcherReadyListHead(); Win2KGetKiWaitInOutListHeads(); break; case 2600 : //win xp pIdOffset = 0x084; NameOffset = 0x174; ppIdOffset = 0x14C; ActPsLink = 0x088; ThreadProc = 0x220; WaitProcOffset = 0x1C0; HandleTableOffset = 0x0C4; HandleTableListOffset = 0x01C; QuotaProcessOffset = 0x004; SetSyscallHook = SetXpSyscallHook; SyscallUnhook = XpSyscallUnhook; ScanHandleTable = ScanXpHandleTable; XPGetKiWaitListHead(); XPGetKiDispatcherReadyListHead(); break; т.е. обработчик устанавливается в зависимости от версии ОС. Получается разногласие с тем что написано. При попытке установить оба перехватчика, естествнно oldsyscallы сохранять в разных местах, появляется бсод с ошибкой 0x0000007E ( система Xp Sp 2 ). Почему??? Дело в том, что используя этот обработчик я пытаюсь перехватить все обращения к системным ф-ция, ведь номер ф-ции в момент обработки будет в eax. Но, отлавливая только sysener проходят не все ф-ции. Судя повсему, действительно, часть ф-ций вызывается через int 2Eh.
У Ms-Rem сказано, что команда системного вызова зависит от версии Windows. У Руссиновича и Соломона (внутреннее устройство Windows) - от архитектуры процессора (типа до Pentium 2 использовался int, далее - Sysenter, специально определенный Intel для более быстрой диспетчеризации вызовов). Где истина?
В "Внутреннее устройство Microsoft Windows 2003, XP, 2000" нет оговорок насчёт версии операционной системы на эту тему. Вначале сказано: "...если не оговорено иное, всё написанное имеет отношение ко всем 3м версиям..."
Запускаем Windows 2000 под VmWare, процессор Intel Pentium 4. Подключаем WinDbg, даем команду 'u ntdll!ZwCreateFile'. Видим: Код (Text): <bla-bla-bla> int 2e <bla-bla-bla> Вывод: Windows 2000 всегда использует вызов int 2e ЗЫ: А выбор способа вызова в зависимости от возможностей процессора добавлен только в Windows XP и старше
Windows 2000 uses an interrupt gate to switch the CPU`s privelege level from user mode to kernel mode. Свен Шрайбер "Недокументированные возможности Windows 2000" Похоже, gilg прав - Windows 2000 всегда использует int 2Eh. WinXP же предназначен не только для процессоров Intel, а в других sysenter может и не быть.
Я имею в виду совсем не это. SysEnter и SysCall независимо разработаны Intel и AMD соответственно, это разные команды с разными опкодами. Поэтому при запуске ОС, например на Атлоне, SysEnter нет. Но в любом случае при каждом системном вызове в XP не нужно определять способ вызова вручную. Вызов передается ф-ии SystemCallStub, содержащейся в "SharedUserData" page, которая отображается во все процессы. P.S. Если я ошибаюсь - поправьте, я в этих дебрях не силен.
В XP и старше принцип выбора способа вызова такой. Во время загрузки системы определяются возможности процессора. Приоритет выбора способа вызова следующий: syscall, sysenter, int 2e. Далее патчится функция nt!KiSystemService и система производит вызов всегда через выбранный метод. В то же время KiSystemService сохраняет флаг, который определяет способ вызова сервиса и используется при выходе из сервиса в KiFastCallExit (точно название не помню). Поэтому в Windows XP по-прежему может использоваться вызов через int 2e. В более поздних системах, в частности, в Win64 используется только один фиксированный способ, для остальных служебные структуры данных просто не заполняются.
afaik ничего нигде не патчится, просто адрес косвенного перехода на эти Ki*SystemCall'ы выставляется соответствующий возможностям компьютера.