Как получить адрес SSDT

Я пытаюсь написать программу на c, которая перечисляет адреса SSDT, поэтому, если какая-то функция подключена, я вижу другой адрес. Как я могу получить адрес SSDT? Я использовал WinDbg и перечислил с KeServiceDescriptorTable, теперь, как я получаю этот адрес в c. Я искал в Интернете это и увидел программы, которые использовали NtQuerySystemInformation с SystemModuleInformation. Я не нашел никакой документации для этих программ или каких-либо статей или объяснений для этого.

Спасибо за помощь

1 ответ

Ниже показано, когда вы находитесь в режиме ядра.

В 32-разрядных средах KeServiceDescriptorTable экспортируется NTOSKRNL, и, таким образом, вы можете получить адрес с помощью MmGetSystemRoutineAddress.

Однако в 64-разрядных средах вам нужно найти KeServiceDescriptorTable самостоятельно при сканировании памяти, потому что он не будет экспортирован NTOSKRNL. Это довольно просто, когда вы узнаете, где используется таблица в ядре Windows, проверьте процедуры, связанные с внутренним системным вызовом, в NTOSKRNL.

Примечание: вам потребуется сдвиг байтов при извлечении адреса в 64-битной среде.

Теперь, когда у вас есть адреса, вы можете выполнить сравнение, чтобы определить, находятся ли адреса в определенном диапазоне в памяти, и попытаться определить, является ли адрес неправильным (например, был ли он манипулирован). Вы также можете выполнить экспертизу операндов в памяти для углубленного анализа.

Другие вопросы по тегам