Доброго времени суток, уважаемые господа программисты, в статье "Запуск процесса из режима ядра", говорилось, что можно перехватить вызов KiSystemService, но блуждая по данному форуму, я узнал, что оказывается в современных процессорах присутствует спецальный вызов для перехода в режим ядра - sysenter и он применяется практически повсеместно. Так вот мой вопрос заключается в следующем: а можно ли как-нибудь "перехватить" ( ну или отследить этот вызов ). Т.е., грубо говоря, перехватывать все попытки обращения к системным вызовам. Вопрос намбр ту, в KiSystemService, если я не ошибаюсь, регистр eax являлся индексом ф-ции, которую необходимо вызвать, а как дела обстоят с sysenter, т.е. номер ф-ции предварительно загружается в регистр или через стек. Будуте любезны, раскажи плз об этом поподробнее или же просто дайте линк на информацию... Заранее благодарен всем ответившим.
2) номер вызова передается через eax, как и раньше 1) адрес, на который передает управление sysenter (также как и syscall в AMD-64), загружается в MSR`ы процессора. Более подробно см. в Intel Manual
ProfessorNimnull нет там ничего. всё то же самое. Только в этой статье глюк некоторый. Там осуществляется поиск KiSystemService, подразумевая что код функции неизменен и определённые команды находятся по фиксированным адресам. Что не всегда соблюдается. Разницу между командами Int 2e и SysCall/SysEnter посмотри в дизасемблре. Вообще её практически нет.
Спасибо большое за ответы, но все что мне было нужно я уже нашел и знаете где, конечно же на Васме, в статье " обнаружение скрытых процессов"http://www.wasm.ru/article.php?article=hiddndt
Вобщем-то одна проблема решилась и тут возникла новая. Проблема заключается в том, что бы из полученного номера ф-ции получить имя этой ф-ции. Может многоуважаемые программисты помогут мне решить ее. Например, получил какой-то номер, допустим 100. А как мне программным путем определить имя этой ф-ции. Может эта инфа хранится в ntdll.dll, а как ее оттуда получить? Буду благодарен каждому, кто даст соответствующую инфу или линк, где это рассмотрено.
Пробежатся по таблице экспорта, просмотреть код каждой функции на номер syscall'a, если он конечно есть для текущей функции экспорта.
ProfessorNimnull Кстати перехватить обращение к sysenter можно. В XP SP2 это очень удобно делать, так как адрес процедуры в SP2 заноситься в регистр, а потом производится jmp [reg], какой регистр не помню. Можно потрейсить OLLY у увидишь как там сделано. Таким образом можно легко перенаправить на свою процедуру. Очень удобно перехватить из юзер мода. Когда-то давно была тема про SYSENTER на этом форуме, где я об этом писал, когда обнаружил. Вот эта тема. http://www.wasm.ru/forum/viewtopic.php?id=10962
На всякий случай привожу тот пост. Кстати здесь походу возможен один из методов перехвата фунок. Все функции в ntdll.dll имеют приблизительно такой вид: Код (Text): ZwSetValueKey :7C90E7BC mov eax, 0f7h :7C90E7C1 mov edx, 7ffe0300h :7C90E7C6 call dword ptr [edx] :7C90E7C8 ret 018 в ячейку 7ffe0300h заносится адрес участка кода с SYSENTER или INT. Заменив этот адрес, мы можем перехватить все функи. Ещё одна фича хрюши, и не надо лезть в SST как на w2к.
Проблему перехвата решена, а вот проблема идентификации имени функции по ее номеру осталась. Я для начала решил посмотреть все экспортируемые ф-ции 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 для меня остается нерешимой загадкой, может кто из вас, многоуважаемые, поможет мне решить ее.
Ну так сказали же уже, что можно перебрать все номера и получить имя. Это же обратная задача, все тоже самое но наоборот
Перебрать откуда, если в ntdll.dll номер ф-ции не совпадает. Вот пример, CreateFile в eax - 25H, а в ntdll.dll 123 ( 73h ) 123 73 0000D682 NtCreateFile = _NtCreateFile@44
Очень просто. Адрес этой функции сопоставила с адресом в экспорте. А то что 25h - это NtCreateFile, она узнать немогла. Ты видимо смотришь в экспорте только на AddressOfNames, советую также постмотреть на AddressOfFunctions.
Делаешь масив строк с именами всех сервисов, в цикле по-очереди перебираем все имена и получаем их номера, если полученый номер совпадает с тем который ты ищешь, то имя сопоставленное с этим номером и есть имя функции.