bingle 发表于 2011-12-16 17:32:55

关于强制读取内存的一点研究成功阅读代码遇到的问题

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 得到的还是内核空间的那个地址?   

怎么切换到指定进程的用户空间的?貌似代码中没有给出。。

xmlpull 发表于 2011-12-16 22:33:17

个人没看 《关于强制读取内存的一点研究成果》。但是 看看这个函数、是个写 内存的。
pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
MmBuildMdlForNonPagedPool(pMdl);
pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);

好像是个映射地址。Address应该是用户层的。。。。。

bingle 发表于 2011-12-16 23:21:29

xmlpull 发表于 2011-12-16 22:33 static/image/common/back.gif
个人没看 《关于强制读取内存的一点研究成果》。但是 看看这个函数、是个写 内存的。
pMdl = IoAllocate ...

但是怎么知道是那个进程的用户空间呀?

kk1025 发表于 2013-4-9 22:17:48

看看
页: [1]
查看完整版本: 关于强制读取内存的一点研究成功阅读代码遇到的问题