Проблема с компиляцией кода, содержащего sysenter

Тема в разделе "WASM.BEGINNERS", создана пользователем Dzutte, 2 апр 2007.

  1. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Пытался перенести код из статьи Ms-Rem'a "Обнаружение скрытых процессов" на С/С++.
    При компиляции следующего кода (MS Visual Studio 2005):

    Код (Text):
    1. DWORD __declspec( naked ) XpZwQuerySystemInfoCall( DWORD dwASystemInformationClass,
    2.                                 PVOID pASystemInformation,
    3.                                 DWORD dwASystemInformationLength,
    4.                                 PDWORD pdwAReturnLength)
    5.  {
    6.      __asm
    7.      {
    8.             pop ebp
    9.             mov eax, 0xAD
    10.             call SystemCall
    11.             retn 0x10
    12.         SystemCall:
    13.             mov edx, esp
    14.             syscall
    15.      }
    16.  }
    получил ошибку вида:
    error C2400: inline assembler syntax error in 'opcode'; found 'newline'

    Не могу разобраться, в чём же проблема... Подскажите плиз, буду признателен =)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    1) syscall - команда для x64. это раз я думаю тебе больше интересен SYSENTER, а не SYSCALL.

    2) SYSENTER можно заменить на
    Код (Text):
    1. _asm
    2. {
    3.   _emit 0x0f
    4.   _emit 0x34
    5. }
    3)
    retn уже не нужен. возврат из sysenter'а будет отнюдь не на точку после sysenter, а на ntdll!KiFastSystemCallRet
     
  3. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Сорри, там действительно был сперва sysenter... это потом уже, пока экспериментировал, воткнул syscall - на нём, впрочем, вышла та же ошибка.
    Скомпилил через _emit - всё заработало, пасиба огромное :)
    Чисто из академического интереса - почему всё же могло не компилиться в обычном виде? ^__~
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    видимо, встроенный ассемблер не распознает эту команду. хз че мелкомягкие там нахимичили :)
     
  5. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Хм, проследил выполнение в ольке - после sysenter'a переходит на retn 0x10.. так что всё же, видно, нужен ^__^
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ессно переходит к тебе, но сначала на KiFastSystemCallRet, а он уже твоему коду управление передаёт.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вообще дело обстоит не так.
    пример: ZwTerminateProcess:
    Код (Text):
    1. 7C90E88E > B8 01010000      MOV EAX,101
    2. 7C90E893   BA 0003FE7F      MOV EDX,7FFE0300
    3. 7C90E898   FF12             CALL DWORD PTR DS:[EDX]
    4. 7C90E89A   C2 0800          RETN 8
    DS:[EDX] (ntdll.KiFastSystemCall)
    Код (Text):
    1. 7C90EB8B > 8BD4             MOV EDX,ESP
    2. 7C90EB8D   0F34             SYSENTER
    после сисентера попадаем в: KiFastSystemCallRet( RET ), а потом в
    7C90E89A C2 0800 RETN 8 (конец ZwTerminateProcess)
    а потом выходим обратно в программу.

    Но фишка в том, что куда мы попадаем после sysenter (точнее после sysexit в ядре) - этот адрес задается в ядре перед вызовом SYSEXIT в регистре EDX (селектор CS берется из SYSENTER_CS_MSR+16) и этот адрес всегда равен KiFastSystemCallRet. А только потом после RET мы попадаем туда, откуда была вызвана KiFastSystemCall, то есть в тело ZwTerminateProcess
     
  8. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Спасибо =) Буду в курсе.
     
  9. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Однако же без retn 0x10 не выходит... Ибо стек остаётся непочищенным =\