И снова KiSystemService/ sysenter

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

  1. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Доброго времени суток, уважаемые господа программисты, в статье "Запуск процесса из режима ядра", говорилось, что можно перехватить вызов KiSystemService, но блуждая по данному форуму, я узнал, что оказывается в современных процессорах присутствует спецальный вызов для перехода в режим ядра - sysenter и он применяется практически повсеместно. Так вот мой вопрос заключается в следующем: а можно ли как-нибудь "перехватить" ( ну или отследить этот вызов ). Т.е., грубо говоря, перехватывать все попытки обращения к системным вызовам. Вопрос намбр ту, в KiSystemService, если я не ошибаюсь, регистр eax являлся индексом ф-ции, которую необходимо вызвать, а как дела обстоят с sysenter, т.е. номер ф-ции предварительно загружается в регистр или через стек. Будуте любезны, раскажи плз об этом поподробнее или же просто дайте линк на информацию... Заранее благодарен всем ответившим.
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    2) номер вызова передается через eax, как и раньше
    1) адрес, на который передает управление sysenter (также как и syscall в AMD-64), загружается в MSR`ы процессора. Более подробно см. в Intel Manual
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    То же самое, правишь KiSystemTable, заменяя адрес нужной тебе функции своим.
     
  4. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    ProfessorNimnull
    нет там ничего. всё то же самое. Только в этой статье глюк некоторый. Там осуществляется поиск KiSystemService, подразумевая что код функции неизменен и определённые команды находятся по фиксированным адресам. Что не всегда соблюдается. Разницу между командами Int 2e и SysCall/SysEnter посмотри в дизасемблре. Вообще её практически нет.
     
  5. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Спасибо большое за ответы, но все что мне было нужно я уже нашел и знаете где, конечно же на Васме, в статье " обнаружение скрытых процессов"http://www.wasm.ru/article.php?article=hiddndt
     
  6. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Вобщем-то одна проблема решилась и тут возникла новая. Проблема заключается в том, что бы из полученного номера ф-ции получить имя этой ф-ции.
    Может многоуважаемые программисты помогут мне решить ее. Например, получил какой-то номер, допустим 100. А как мне программным путем определить имя этой ф-ции. Может эта инфа хранится в ntdll.dll, а как ее оттуда получить? Буду благодарен каждому, кто даст соответствующую инфу или линк, где это рассмотрено.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Пробежатся по таблице экспорта, просмотреть код каждой функции на номер syscall'a, если он конечно есть для текущей функции экспорта.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    ProfessorNimnull
    Кстати перехватить обращение к sysenter можно. В XP SP2 это очень удобно делать, так как адрес процедуры в SP2 заноситься в регистр, а потом производится jmp [reg], какой регистр не помню. Можно потрейсить OLLY у увидишь как там сделано. Таким образом можно легко перенаправить на свою процедуру. Очень удобно перехватить из юзер мода. Когда-то давно была тема про SYSENTER на этом форуме, где я об этом писал, когда обнаружил.

    Вот эта тема.
    http://www.wasm.ru/forum/viewtopic.php?id=10962
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    На всякий случай привожу тот пост.

    Кстати здесь походу возможен один из методов перехвата фунок. Все функции в ntdll.dll имеют приблизительно такой вид:

    Код (Text):
    1. ZwSetValueKey
    2. :7C90E7BC mov eax, 0f7h
    3. :7C90E7C1 mov edx, 7ffe0300h
    4. :7C90E7C6 call dword ptr [edx]
    5. :7C90E7C8 ret 018
    в ячейку 7ffe0300h заносится адрес участка кода с SYSENTER или INT. Заменив этот адрес, мы можем перехватить все функи. Ещё одна фича хрюши, и не надо лезть в SST как на w2к.
     
  10. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Проблему перехвата решена, а вот проблема идентификации имени функции по ее номеру осталась. Я для начала решил посмотреть все экспортируемые ф-ции ntdll.dll и обнаружил, что номер ф-ции, который выдает dumpbin, не соответствует тому, что выдает мой перехватчик. Я решил, что дело в перехватчике, но решил проверить. Раздизассемблировав ntdll.dll, оказалось, что перехватчик работает правильно. Вот пример, мой перехватчик на ф-цию NtCreateFile выдавал номер 37 ( 25h ).
    Вот, что выдал ида
    public ZwCreateFile
    .text:7C90D682 ZwCreateFile proc near ; CODE XREF: LdrLoadAlternateResourceModule+34C3Cp
    .text:7C90D682 ; RtlCreateBootStatusDataFile+D6p ...
    .text:7C90D682 mov eax, 25h ; NtCreateFile
    .text:7C90D687 mov edx, 7FFE0300h
    .text:7C90D68C call dword ptr [edx]
    .text:7C90D68E retn 2Ch
    .text:7C90D68E ZwCreateFile endp

    Тоже самое подтвердилось с другими вызовами, значит перехватчик работает правильно. То, что в ntdll.dll ф-ции нумеруются по другому, это нормально. Но... как ИДА узнал, что 25h - это NtCreateFile для меня остается нерешимой загадкой, может кто из вас, многоуважаемые, поможет мне решить ее.
     
  11. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Ну так сказали же уже, что можно перебрать все номера и получить имя. Это же обратная задача, все тоже самое но наоборот
     
  12. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Перебрать откуда, если в ntdll.dll номер ф-ции не совпадает. Вот пример, CreateFile в eax - 25H, а в ntdll.dll 123 ( 73h )


    123 73 0000D682 NtCreateFile = _NtCreateFile@44
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Очень просто. Адрес этой функции сопоставила с адресом в экспорте.
    А то что 25h - это NtCreateFile, она узнать немогла.

    Ты видимо смотришь в экспорте только на AddressOfNames, советую также постмотреть на AddressOfFunctions.
     
  14. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Делаешь масив строк с именами всех сервисов, в цикле по-очереди перебираем все имена и получаем их номера, если полученый номер совпадает с тем который ты ищешь, то имя сопоставленное с этим номером и есть имя функции.