Как получить адрес SSDT
Я пытаюсь написать программу на c, которая перечисляет адреса SSDT, поэтому, если какая-то функция подключена, я вижу другой адрес. Как я могу получить адрес SSDT? Я использовал WinDbg и перечислил с KeServiceDescriptorTable, теперь, как я получаю этот адрес в c. Я искал в Интернете это и увидел программы, которые использовали NtQuerySystemInformation с SystemModuleInformation. Я не нашел никакой документации для этих программ или каких-либо статей или объяснений для этого.
Спасибо за помощь
1 ответ
Ниже показано, когда вы находитесь в режиме ядра.
В 32-разрядных средах KeServiceDescriptorTable экспортируется NTOSKRNL, и, таким образом, вы можете получить адрес с помощью MmGetSystemRoutineAddress.
Однако в 64-разрядных средах вам нужно найти KeServiceDescriptorTable самостоятельно при сканировании памяти, потому что он не будет экспортирован NTOSKRNL. Это довольно просто, когда вы узнаете, где используется таблица в ядре Windows, проверьте процедуры, связанные с внутренним системным вызовом, в NTOSKRNL.
Примечание: вам потребуется сдвиг байтов при извлечении адреса в 64-битной среде.
Теперь, когда у вас есть адреса, вы можете выполнить сравнение, чтобы определить, находятся ли адреса в определенном диапазоне в памяти, и попытаться определить, является ли адрес неправильным (например, был ли он манипулирован). Вы также можете выполнить экспертизу операндов в памяти для углубленного анализа.