MmGetSystemRoutineAddress函数获取内存地址

#include "ntddk.h"


ULONG GetCidAddr()
{

	PUCHAR addr;
	PUCHAR p;
	UNICODE_STRING pslookup;  
	ULONG cid;

	RtlInitUnicodeString (&pslookup, L"PsLookupProcessByProcessId");  
	//RtlInitUnicodeString (&pslookup, L"PsLookupProcessThreadbyCid");  
	addr = (PUCHAR) MmGetSystemRoutineAddress(&pslookup);//MmGetSystemRoutineAddress可以通过函数名获得函数地址
	KdPrint(("PsLookupProcessByProcessId addr=0x%x\r\n", addr));
	RtlInitUnicodeString (&pslookup, L"NtOpenProcess");
	addr = (PUCHAR) MmGetSystemRoutineAddress(&pslookup);//MmGetSystemRoutineAddress可以通过函数名获得函数地址
	KdPrint(("NtOpenProcess addr=0x%x\r\n", addr));
	for (p=addr;p<addr+PAGE_SIZE;p++)
	{
		if((*(PUSHORT)p==0x35ff)&&(*(p+6)==0xe8))
		{
			cid=*(PULONG)(p+2);
			return cid;
			//break;
		}
	}
	return 0;
}

VOID Uload(PDRIVER_OBJECT obj)
{
	KdPrint(("驱动被卸载咯\n"));
}


NTSTATUS DriverEntry( 
			IN PDRIVER_OBJECT  DriverObject, 
			IN PUNICODE_STRING  RegistryPath 
			)
{
	DriverObject->DriverUnload = Uload;
	GetCidAddr();
    

}

在 Windows 内核模式下,我们可以使用 Zw 拦截函数获取 NtFlushKey 函数的地址。Zw 拦截函数是 Windows 内核中的一种机制,它可以拦截用户态进程调用的系统调用,并将其转换为内核态下的函数调用。因此,我们可以通过 Zw 拦截函数获取 NtFlushKey 函数的地址。 以下是一个示例代码,用于在 Windows 内核模式下获取 NtFlushKey 函数的地址: ```cpp #include <ntddk.h> // 定义 NtFlushKey 函数原型 typedef NTSTATUS (__stdcall* PFN_NTFLUSHKEY)(HANDLE); // 定义全局变量保存 NtFlushKey 函数地址 PFN_NTFLUSHKEY g_NtFlushKey = NULL; // Zw 拦截函数,用于获取 NtFlushKey 函数地址 NTSTATUS MyZwFlushKey(HANDLE KeyHandle) { // 获取 NtFlushKey 函数地址 if (g_NtFlushKey == NULL) { UNICODE_STRING functionName; RtlInitUnicodeString(&functionName, L"NtFlushKey"); g_NtFlushKey = (PFN_NTFLUSHKEY)MmGetSystemRoutineAddress(&functionName); if (g_NtFlushKey == NULL) { DbgPrint("Failed to get address of NtFlushKey\n"); return STATUS_UNSUCCESSFUL; } DbgPrint("Address of NtFlushKey: %p\n", g_NtFlushKey); } // 调用 NtFlushKey 函数 return g_NtFlushKey(KeyHandle); } // 驱动入口函数 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { // 注册 ZwFlushKey 拦截函数 UNICODE_STRING functionName; RtlInitUnicodeString(&functionName, L"ZwFlushKey"); DriverObject->MajorFunction[IRP_MJ_CREATE] = NULL; DriverObject->MajorFunction[IRP_MJ_CLOSE] = NULL; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NULL; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = NULL; DriverObject->DriverUnload = NULL; DriverObject->MajorFunction[IRP_MJ_CREATE] = NULL; DriverObject->MajorFunction[IRP_MJ_CLOSE] = NULL; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NULL; DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NULL; DriverObject->MajorFunction[IRP_MJ_PNP] = NULL; DriverObject->MajorFunction[IRP_MJ_POWER] = NULL; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyZwFlushKey; IoCreateDevice(DriverObject, 0, NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, NULL); IoCreateSymbolicLink(RtlInitUnicodeString(&functionName, L"\\??\\MyZwFlushKey"), RtlInitUnicodeString(&functionName, L"\\Device\\MyZwFlushKey")); return STATUS_SUCCESS; } ``` 上面的代码定义了 MyZwFlushKey 函数作为 ZwFlushKey 的拦截函数,在第一次调用该函数获取 NtFlushKey 函数的地址,并保存到全局变量 g_NtFlushKey 中。在后面的调用中,直接使用 g_NtFlushKey 函数指针调用 NtFlushKey 函数。注意,在驱动入口函数中,我们需要将 ZwFlushKey 拦截函数注册到 IRP_MJ_DEVICE_CONTROL 处理函数中,以便驱动程序能够接收到系统调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值