Здравствуйте, у меня такой вопрос: Есть драйвер работающий в ринг-0. Я прочитал, что для того, чтобы получить индекс zw функции на ssdt надо открыть код функции и прочитать второй байт. Может кто нибудь пожалуйста показать как ето сделать? Вот как я ето пробовал реализовать: Код (Text): GetIndex proc function:DWORD mov ebx, function xor eax, eax mov eax, byte ptr [ebx][1] ret GetIndex endp
спасибо за ответ, пробовал и так, вот результат: ZwCreateFile: 334025ff ZwDeleteFile: 334425ff Позиция ZwCreateFile должна быть 25h, здесь она 40h. Ешё резуьтат функции почему то меняетсья каждий раз когда запускаю драйвер. Я думал, что физические адреса неменяются? К тому же первая команда должна быть 8bNumber (mov eax, number) а здесь её нет.
AFAIR mov eax. Imm32/16 = B8 Imm32/16 Я изначально некорректно понял вопрос, сорри. Получить номер syscall'a можно посмотрев второй байт в ntdll.dll, тк большинство функций являются обертками над r0. Для драйвера тоже можно открыть ntdll.dll(найти в памяти) и проччитать номер syscall'a.
спасибо за пояснение, но у меня тогда появляется новий вопрос: почему такая фукция работает: #define SYSCALL_INDEX(_Function) *(PULONG) ((PUCHAR) _Function+1) простите, ето даже не функция, а обычний c макрос мне кажется что там делатся впринципе то же самое, что и я сделал... Простите за мои весьма глупые вопросы, просто мне до вас ещё далеко. P.S. Да, я перепутал B8 с 8B сорри.
Макрос работает таким образом: Сначала берется указатель _Function и преводится к типу char - это значит, что в памяти мы "смотрим" на 1 байт. Прибавляя еденицу, мы смещаемся на 1 байт, таким образом, смотрим мы уже на номер функции - он занимает целый лонг, поэтому приводится указатель к типу указатель на лонг. Если в переменной func лежит адрес начала Код (Text): mov ebx, func mov eax, [ebx+1] ]
Именно, сам пока нетестил, но в книжке Rootkits: Subverting the Windows Kernel прочитал, что данний макрос используется в драйвере и помогает поставить хук в ссдт. Я понимаю, что он необязателен, но раз начал портировать, то хотел бы и закончить. Поменял фунцию, на ту, которую ти запостил, и вот результат: ZwCreateFile: b8934025 ZwDeleteFile: b8934425 типа есть b8 , но селдующий байт неменяется.