|
NTSTATUS WriteKernelMemory(PVOID Address, ULONG Size, PVOID InBuffer)
{
NTSTATUS st = STATUS_UNSUCCESSFUL;
PMDL pMdl = 0;
PVOID pAddress = 0;
if (!Address) return st;
pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
if (pMdl)
{
MmBuildMdlForNonPagedPool(pMdl);
pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
if (pAddress)
{
__try
{
WpOffAndToDpcLevel();
RtlCopyMemory(pAddress, InBuffer, Size);
WpOn();
st = STATUS_SUCCESS;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
IoFreeMdl(pMdl);
}
return st;
}
代码取自管理员的 《关于强制读取内存的一点研究成果》 ,不明白的是那个参数Address是用户空间的地址还是内核空间的地址,如果是用户空间的地址,那么怎么判断是哪个进程空间的地址,换言之就是哪个进程上下文的地址? 如果是内核地址,那么理论上 IoAllocateMdl ,MmGetSystemAddressFormdlsafe 得到的还是内核空间的那个地址?
怎么切换到指定进程的用户空间的? 貌似代码中没有给出。。 |
|