SYSENTER

Тема в разделе "WASM.ASSEMBLER", создана пользователем dr_dred, 3 авг 2005.

  1. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Что эта команда делает, и почему "туда" нельзя залезть и посмотреть.
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Команда выполняет системный вызов.(Аналогично int XX)
    Код (Text):
    1.  
    2. SYSENTER (0F 34)
    3. Fast call to privilege level 0 system procedures.
    4.  

    Код (Text):
    1.  
    2. Executes a fast call to a level 0 system procedure or routine. This instruction is a companion
    3. instruction to the SYSEXIT instruction. The SYSENTER instruction is optimized to provide the
    4. maximum performance for system calls from user code running at privilege level 3 to operating
    5. system or executive procedures running at privilege level 0.
    6. Prior to executing the SYSENTER instruction, software must specify the privilege level 0 code
    7. segment and code entry point, and the privilege level 0 stack segment and stack pointer by
    8. writing values into the following MSRs:
    9. •SYSENTER_CS_MSR—Contains the 32-bit segment selector for the privilege level 0
    10. code segment. (This value is also used to compute the segment selector of the privilege
    11. level 0 stack segment.)
    12. •SYSENTER_EIP_MSR—Contains the 32-bit offset into the privilege level 0 code
    13. segment to the first instruction of the selected operating procedure or routine.
    14. •SYSENTER_ESP_MSR—Contains the 32-bit stack pointer for the privilege level 0 stack.
    15. These MSRs can be read from and written to using the RDMSR and WRMSR instructions. The
    16. register addresses are listed in Table 4-3. These addresses are defined to remain fixed for future
    17. IA-32 processors.
    18.  
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    залезть и посмотреть можно при помощи soft ice.
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    ага, толкьо при трассировке данной инструкции айс умирает.
     
  5. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    может при этом задеваются какие то его личные интересы ?
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    CARDINAL

    У тебя айс глючит, всё трассируется!
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Интересно что WinXP имеет два участка кода в NTDLL, один для интеловского SYSENTER, другой для аймдешного SYSCALL.

    Но интересно как она будет себя вести на проце без этих инструкций. INT я не нашёл, может кто видел или знает как это реализовано? Проверить не могу, нету проца P2 или ниже.



    З.Ы. Ещё слышал утверждения что w2k быстрее хрюши. Однозначно это не так, так как SYSENTER гораздо быстрее INT.
     
  8. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > я не нашёл, может кто видел или знает как это реализовано?



    Инсталлятор поставит другую ntdll, заточенную под старые процы
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Dr.Golova

    >Инсталлятор поставит другую ntdll, заточенную под старые процы



    Значит в хрюше возможен переход в ядро через int, интересно по какому номеру? Вроде как через 2E не катит. Или инсталятор для других процев ставит ещё и другое ядро?
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вот фрагмент ntdll.dll 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
    Код (Text):
    1. ntdll.KiFastSystemCall            8BD4            mov     edx, esp
    2. 7C90EB8D                          0F34            sysenter
    3. 7C90EB8F                          90              nop
    4. 7C90EB90                          90              nop
    5. 7C90EB91                          90              nop
    6. 7C90EB92                          90              nop
    7. 7C90EB93                          90              nop
    8. ntdll.KiFastSystemCallRet         C3              retn
    9. 7C90EB95                          8DA424 00000000 lea     esp, [esp]
    10. 7C90EB9C                          8D6424 00       lea     esp, [esp]
    11. 7C90EBA0                          90              nop
    12. 7C90EBA1                          90              nop
    13. 7C90EBA2                          90              nop
    14. 7C90EBA3                          90              nop
    15. 7C90EBA4                          90              nop
    16. ntdll.KiIntSystemCall             8D5424 08       lea     edx, [esp+8]
    17. 7C90EBA9                          CD 2E           int     2E
    18. 7C90EBAB                          C3              retn
    Проц - Athlon XP, использует sysenter.

    syscall я что-то не нашёл, зато есть старый добрый int 2E.
     
  11. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    да, по этому поводу мы уже спорили тутhttp://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=10338

    Залезть "туда" и посмотреть можно только поставив бряк на адресе инструкции, выполняющейся по SYSENTER (смотри MSR-регистры чтоб вытащить этот адрес). При трассировке без бряка сайс вывалится. Бряк желательно (или обязательно, не помню) ставить аппаратный.
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ничего не вываливается, делаешь T (F8) и всё пучком !

    Разбирайся со своим сайсом ;)
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    S_T_A_S_

    Да, сейчас проверил на SP2 ntdll.dll 5.1.2600.2180 действительно так и есть.



    У меня до этого было: SP1 ntdll.dll 5.1.2600.1217 так там была и SYSENTER, и SYSCALL, а INT не видел.
     
  14. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Вообще, в мануале интела написано, что SYSCALL/SYSRET появились у них только в IA32e, до этого есть только SYSENTER/SYSEXIT.

    В мануале AMD говорят, что SYSCALL/SYSRET тоже для 64-бит, но могут и с 32-битным модом работать. Так что по идее, отличаться они у Intel и Amd не должны.



    Booster

    Да, инсталлятор еще и ядро другое подставит, если надо. Их у него много, выбор есть.
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    в 22007.pdf присутствуют описания команд syscall\sysenter, значит команды появились ещё в процессорах Athlon (ядро K7).

    по поводу других ядер OS - в дистрибе XP я нашёл только 2 файла:

    NTKRNLMP.EX_ и NTOSKRNL.EX_

    из названий видно, что одно из них для многопроцессорной конфигурации, а другое для унипроцессорной.
     
  16. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    S_T_A_S_

    У Руссиновича сказано, что вариантов ядра несколько, как и вариантов hal.dll. Выбираются они в процессе подготовки к установке, при этом имена у них будут отличаться.
     
  17. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Вот я как-то решил посмотреть из чего же устроен MessageBeep. Нашел один sysenter и все что с ним полагается. Переписал весь код в asm файл немного упростив. Запустил - раздался beep. Но тут обнаружил вверху asm файла несколько ненужных строчек:
    Код (Text):
    1. include windows.inc
    2. include user32.inc
    3. includelib user32.lib
    4. include kernel32.inc
    5. includelib kernel32.lib




    Удалил их, скомпилировал - винда просит отчет об ошибке отправить. Вернул строчки на место - beep. Кто что скажет?
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Кстати здесь походу возможен один из методов перехвата фунок. Все функции в ntdll.dll имеют приблизительно такой вид:
    Код (Text):
    1.  
    2. ZwSetValueKey
    3. :7C90E7BC mov eax, 0f7h
    4. :7C90E7C1 mov edx, 7ffe0300h
    5. :7C90E7C6 call dword ptr [edx]
    6. :7C90E7C8 ret 018
    7.  




    в ячейку 7ffe0300h заносится адрес участка кода с SYSENTER или INT. Заменив этот адрес, мы можем перехватить все функи. Ещё одна фича хрюши, и не надо лезть в SST как на w2к.



    dr_dred





    А на каком этапе выполнения вываливается?
     
  19. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Booster

    Вся программа состояла примерно из следующего:

    push ...

    push ...

    push ...

    push esp

    mov edx,...

    call dword [edx]



    Очевидно это вываливается во время выполнения sysenter.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Видно, звёзды не так расположились. Приводи полный код программы.