驱动代码
时间: 2023-08-04 11:06:17 浏览: 44
以下是一个简单的驱动代码,用于获取 `nt!CmpTraceRoutine` 符号在 `ntoskrnl.exe` 模块中的地址,并输出到调试器中:
```c
#include <ntddk.h>
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{
UNREFERENCED_PARAMETER(pDriverObj);
DbgPrint("Driver unloaded.\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryPath)
{
UNREFERENCED_PARAMETER(pRegistryPath);
PVOID pAddr = NULL;
UNICODE_STRING usName;
RtlInitUnicodeString(&usName, L"ntoskrnl.exe");
PPEB pPeb = PsGetProcessPeb((PEPROCESS)PsGetCurrentProcess());
if (pPeb != NULL)
{
PPEB_LDR_DATA pLdr = pPeb->Ldr;
if (pLdr != NULL)
{
PLIST_ENTRY pList = &(pLdr->InLoadOrderModuleList);
PLIST_ENTRY pEntry = pList->Flink;
while (pEntry != pList)
{
PLDR_DATA_TABLE_ENTRY pEntryData = CONTAINING_RECORD(pEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
if (RtlEqualUnicodeString(&(pEntryData->BaseDllName), &usName, TRUE))
{
pAddr = (PVOID)MmGetSystemRoutineAddress((PUNICODE_STRING)&("CmpTraceRoutine"));
if (pAddr != NULL)
{
DbgPrint("nt!CmpTraceRoutine address: %p\n", pAddr);
}
break;
}
pEntry = pEntry->Flink;
}
}
}
pDriverObj->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
```
该驱动在加载时会遍历当前进程的 Peb 结构中的模块信息,查找 `ntoskrnl.exe` 模块,并获取 `CmpTraceRoutine` 符号在其中的地址,最后输出到调试器中。注意,由于驱动运行在内核模式下,因此无法使用标准的动态链接库函数来获取符号地址,而必须使用 `MmGetSystemRoutineAddress` 函数。