Команда выполняет системный вызов.(Аналогично int XX) Code (Text): SYSENTER (0F 34) Fast call to privilege level 0 system procedures. Code (Text): Executes a fast call to a level 0 system procedure or routine. This instruction is a companion instruction to the SYSEXIT instruction. The SYSENTER instruction is optimized to provide the maximum performance for system calls from user code running at privilege level 3 to operating system or executive procedures running at privilege level 0. Prior to executing the SYSENTER instruction, software must specify the privilege level 0 code segment and code entry point, and the privilege level 0 stack segment and stack pointer by writing values into the following MSRs: •SYSENTER_CS_MSR—Contains the 32-bit segment selector for the privilege level 0 code segment. (This value is also used to compute the segment selector of the privilege level 0 stack segment.) •SYSENTER_EIP_MSR—Contains the 32-bit offset into the privilege level 0 code segment to the first instruction of the selected operating procedure or routine. •SYSENTER_ESP_MSR—Contains the 32-bit stack pointer for the privilege level 0 stack. These MSRs can be read from and written to using the RDMSR and WRMSR instructions. The register addresses are listed in Table 4-3. These addresses are defined to remain fixed for future IA-32 processors.
Интересно что WinXP имеет два участка кода в NTDLL, один для интеловского SYSENTER, другой для аймдешного SYSCALL. Но интересно как она будет себя вести на проце без этих инструкций. INT я не нашёл, может кто видел или знает как это реализовано? Проверить не могу, нету проца P2 или ниже. З.Ы. Ещё слышал утверждения что w2k быстрее хрюши. Однозначно это не так, так как SYSENTER гораздо быстрее INT.
> я не нашёл, может кто видел или знает как это реализовано? Инсталлятор поставит другую ntdll, заточенную под старые процы
Dr.Golova >Инсталлятор поставит другую ntdll, заточенную под старые процы Значит в хрюше возможен переход в ядро через int, интересно по какому номеру? Вроде как через 2E не катит. Или инсталятор для других процев ставит ещё и другое ядро?
Вот фрагмент ntdll.dll 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158) Code (Text): ntdll.KiFastSystemCall 8BD4 mov edx, esp 7C90EB8D 0F34 sysenter 7C90EB8F 90 nop 7C90EB90 90 nop 7C90EB91 90 nop 7C90EB92 90 nop 7C90EB93 90 nop ntdll.KiFastSystemCallRet C3 retn 7C90EB95 8DA424 00000000 lea esp, [esp] 7C90EB9C 8D6424 00 lea esp, [esp] 7C90EBA0 90 nop 7C90EBA1 90 nop 7C90EBA2 90 nop 7C90EBA3 90 nop 7C90EBA4 90 nop ntdll.KiIntSystemCall 8D5424 08 lea edx, [esp+8] 7C90EBA9 CD 2E int 2E 7C90EBAB C3 retn Проц - Athlon XP, использует sysenter. syscall я что-то не нашёл, зато есть старый добрый int 2E.
да, по этому поводу мы уже спорили тутhttp://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=10338 Залезть "туда" и посмотреть можно только поставив бряк на адресе инструкции, выполняющейся по SYSENTER (смотри MSR-регистры чтоб вытащить этот адрес). При трассировке без бряка сайс вывалится. Бряк желательно (или обязательно, не помню) ставить аппаратный.
S_T_A_S_ Да, сейчас проверил на SP2 ntdll.dll 5.1.2600.2180 действительно так и есть. У меня до этого было: SP1 ntdll.dll 5.1.2600.1217 так там была и SYSENTER, и SYSCALL, а INT не видел.
Вообще, в мануале интела написано, что SYSCALL/SYSRET появились у них только в IA32e, до этого есть только SYSENTER/SYSEXIT. В мануале AMD говорят, что SYSCALL/SYSRET тоже для 64-бит, но могут и с 32-битным модом работать. Так что по идее, отличаться они у Intel и Amd не должны. Booster Да, инсталлятор еще и ядро другое подставит, если надо. Их у него много, выбор есть.
в 22007.pdf присутствуют описания команд syscall\sysenter, значит команды появились ещё в процессорах Athlon (ядро K7). по поводу других ядер OS - в дистрибе XP я нашёл только 2 файла: NTKRNLMP.EX_ и NTOSKRNL.EX_ из названий видно, что одно из них для многопроцессорной конфигурации, а другое для унипроцессорной.
S_T_A_S_ У Руссиновича сказано, что вариантов ядра несколько, как и вариантов hal.dll. Выбираются они в процессе подготовки к установке, при этом имена у них будут отличаться.
Вот я как-то решил посмотреть из чего же устроен MessageBeep. Нашел один sysenter и все что с ним полагается. Переписал весь код в asm файл немного упростив. Запустил - раздался beep. Но тут обнаружил вверху asm файла несколько ненужных строчек: Code (Text): include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib Удалил их, скомпилировал - винда просит отчет об ошибке отправить. Вернул строчки на место - beep. Кто что скажет?
Кстати здесь походу возможен один из методов перехвата фунок. Все функции в ntdll.dll имеют приблизительно такой вид: Code (Text): ZwSetValueKey :7C90E7BC mov eax, 0f7h :7C90E7C1 mov edx, 7ffe0300h :7C90E7C6 call dword ptr [edx] :7C90E7C8 ret 018 в ячейку 7ffe0300h заносится адрес участка кода с SYSENTER или INT. Заменив этот адрес, мы можем перехватить все функи. Ещё одна фича хрюши, и не надо лезть в SST как на w2к. dr_dred А на каком этапе выполнения вываливается?
Booster Вся программа состояла примерно из следующего: push ... push ... push ... push esp mov edx,... call dword [edx] Очевидно это вываливается во время выполнения sysenter.