我用内核ZwOpenProcess 打开进程。。。驱动初始化的时候打开一次。打印。得到的是内核地址。。。同时R3 通信指挥R0打开进程。返回的是句柄。。
HANDLE 进程_打开(HANDLE PID)
{
HANDLE 进程句柄 = 0;
CLIENT_ID 进程ID;
NTSTATUS 返回值;
OBJECT_ATTRIBUTES 对象;
进程ID.UniqueThread = 0;
进程ID.UniqueProcess = PID;
对象.Length = sizeof(对象);
对象.RootDirectory = 0;
对象.ObjectName = 0;
对象.Attributes = 0;
对象.SecurityDescriptor = 0;
对象.SecurityQualityOfService = 0;
返回值 = ZwOpenProcess(&进程句柄, STANDARD_RIGHTS_ALL, &对象, &进程ID);
if (!NT_SUCCESS(返回值))
return 0;
DbgPrint("打开后返回的进程句柄=%p\n", 进程句柄);
NTSTATUS status;
PKEVENT userEvent;
HANDLE handle;
status = ObReferenceObjectByHandle(
进程句柄,
STANDARD_RIGHTS_ALL,
*PsProcessType,
UserMode,
(PVOID*)&userEvent,
NULL);
if (NT_SUCCESS(status))
{
// do something interesting here
// KeSetEvent(userEvent, IO_NO_INCREMENT, FALSE);
// ObDereferenceObject(userEvent);
}
DbgPrint("转换后的句柄地址=%p\n", userEvent);
ULONG64 ADD = 0x4a4610;
ULONG64 LEN = 4;
ULONG 读取结果 = 0;
ULONG 成功读写数量 = NULL;
ZwReadVirtualMemory(userEvent, (ULONG64*)ADD, (ULONG64*)读取结果, LEN, &成功读写数量);
DbgPrint("读取结果=%d \n", 读取结果);
return 进程句柄;
}