关于强制读取内存的一点研究成功阅读代码遇到的问题
NTSTATUS WriteKernelMemory(PVOID Address, ULONG Size, PVOID InBuffer){
NTSTATUS st = STATUS_UNSUCCESSFUL;
PMDLpMdl = 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 得到的还是内核空间的那个地址?
怎么切换到指定进程的用户空间的?貌似代码中没有给出。。 个人没看 《关于强制读取内存的一点研究成果》。但是 看看这个函数、是个写 内存的。
pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
MmBuildMdlForNonPagedPool(pMdl);
pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
好像是个映射地址。Address应该是用户层的。。。。。 xmlpull 发表于 2011-12-16 22:33 static/image/common/back.gif
个人没看 《关于强制读取内存的一点研究成果》。但是 看看这个函数、是个写 内存的。
pMdl = IoAllocate ...
但是怎么知道是那个进程的用户空间呀? 看看
页:
[1]