Вопрос по phunter`у

Тема в разделе "WASM.NT.KERNEL", создана пользователем ProfessorNimnull, 18 май 2007.

  1. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    В статье "Обнаружение скрытых процессов" - http://www.wasm.ru/article.php?article=hiddndt , многоуважаемого господина Ms-Rem сказано, что: "Особенность Windows XP в том, что системный вызов может быть произведен как через sysenter, так и через int 2Eh, поэтому нам нужно заменить оба обработчика своими."

    Но в когде такая картина

    Код (Text):
    1. switch (*NtBuildNumber)
    2.     {
    3.         case 2195 :  //win 2k
    4.          pIdOffset                 = 0x09C;
    5.          ActPsLink                 = 0x0A0;
    6.          NameOffset                = 0x1FC;
    7.          ppIdOffset                = 0x1C8;
    8.          ThreadProc                = 0x22C;
    9.          WaitProcOffset            = 0x1D0;
    10.          HandleTableOffset         = 0x128;
    11.          HandleTableListOffset     = 0x054;
    12.          QuotaProcessOffset        = 0x00C;
    13.          SetSyscallHook            = Set2kSyscallHook;
    14.          SyscallUnhook             = Win2kSyscallUnhook;
    15.          ScanHandleTable           = ScanWin2KHandleTable;
    16.          
    17.          Win2KGetKiDispatcherReadyListHead();
    18.          Win2KGetKiWaitInOutListHeads();     
    19.          break;
    20.        
    21.         case 2600 : //win xp
    22.          pIdOffset                 = 0x084;
    23.          NameOffset                = 0x174;
    24.          ppIdOffset                = 0x14C;
    25.          ActPsLink                 = 0x088;
    26.          ThreadProc                = 0x220;
    27.          WaitProcOffset            = 0x1C0;
    28.          HandleTableOffset         = 0x0C4;
    29.          HandleTableListOffset     = 0x01C;
    30.          QuotaProcessOffset        = 0x004;
    31.          SetSyscallHook            = SetXpSyscallHook;
    32.          SyscallUnhook             = XpSyscallUnhook;
    33.          ScanHandleTable           = ScanXpHandleTable;
    34.          
    35.          XPGetKiWaitListHead();
    36.          XPGetKiDispatcherReadyListHead();
    37.          break;
    т.е. обработчик устанавливается в зависимости от версии ОС. Получается разногласие с тем что написано. При попытке установить оба перехватчика, естествнно oldsyscallы сохранять в разных местах, появляется бсод с ошибкой 0x0000007E ( система Xp Sp 2 ). Почему???

    Дело в том, что используя этот обработчик я пытаюсь перехватить все обращения к системным ф-ция, ведь номер ф-ции в момент обработки будет в eax. Но, отлавливая только sysener проходят не все ф-ции. Судя повсему, действительно, часть ф-ций вызывается через int 2Eh.
     
  2. Slavic

    Slavic New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    14
    У Ms-Rem сказано, что команда системного вызова зависит от версии Windows. У Руссиновича и Соломона (внутреннее устройство Windows) - от архитектуры процессора (типа до Pentium 2 использовался int, далее - Sysenter, специально определенный Intel для более быстрой диспетчеризации вызовов). Где истина?
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Я склонен верить Руссиновичу&Соломону.
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Если не ошибаюсь то W2K не обрабатывает SYSENTER, вот собственно поэтому и от версии Windows.
     
  5. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    В "Внутреннее устройство Microsoft Windows 2003, XP, 2000" нет оговорок насчёт версии операционной системы на эту тему. Вначале сказано: "...если не оговорено иное, всё написанное имеет отношение ко всем 3м версиям..."
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Запускаем Windows 2000 под VmWare, процессор Intel Pentium 4. Подключаем WinDbg, даем команду 'u ntdll!ZwCreateFile'. Видим:
    Код (Text):
    1. <bla-bla-bla>
    2. int 2e
    3. <bla-bla-bla>
    Вывод: Windows 2000 всегда использует вызов int 2e

    ЗЫ: А выбор способа вызова в зависимости от возможностей процессора добавлен только в Windows XP и старше
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    вроде как WinXP стартует только на PII+ и соответсвенно там всегда есть sysenter
     
  8. Slavic

    Slavic New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    14
    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 может и не быть.
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Alpha? Вроде тока Win NT 4.0 выпускались под Alph'у.
     
  10. Slavic

    Slavic New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    14
    Я имею в виду совсем не это. SysEnter и SysCall независимо разработаны Intel и AMD соответственно, это разные команды с разными опкодами. Поэтому при запуске ОС, например на Атлоне, SysEnter нет.
    Но в любом случае при каждом системном вызове в XP не нужно определять способ вызова вручную. Вызов передается ф-ии SystemCallStub, содержащейся в "SharedUserData" page, которая отображается во все процессы.

    P.S. Если я ошибаюсь - поправьте, я в этих дебрях не силен.
     
  11. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    В XP и старше принцип выбора способа вызова такой. Во время загрузки системы определяются возможности процессора. Приоритет выбора способа вызова следующий: syscall, sysenter, int 2e. Далее патчится функция nt!KiSystemService и система производит вызов всегда через выбранный метод. В то же время KiSystemService сохраняет флаг, который определяет способ вызова сервиса и используется при выходе из сервиса в KiFastCallExit (точно название не помню). Поэтому в Windows XP по-прежему может использоваться вызов через int 2e. В более поздних системах, в частности, в Win64 используется только один фиксированный способ, для остальных служебные структуры данных просто не заполняются.
     
  12. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    afaik ничего нигде не патчится, просто адрес косвенного перехода на эти Ki*SystemCall'ы выставляется соответствующий возможностям компьютера.