找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4872|回复: 3

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

  [复制链接]

1

主题

8

回帖

0

精华

初来乍到

积分
10
发表于 2011-12-16 17:32:55 | 显示全部楼层 |阅读模式
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 得到的还是内核空间的那个地址?   

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

9

主题

117

回帖

0

精华

银牌会员

积分
422
发表于 2011-12-16 22:33:17 | 显示全部楼层
个人没看 《关于强制读取内存的一点研究成果》  。但是 看看这个函数、是个写 内存的。
pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
MmBuildMdlForNonPagedPool(pMdl);
pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);

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

1

主题

8

回帖

0

精华

初来乍到

积分
10
 楼主| 发表于 2011-12-16 23:21:29 | 显示全部楼层
xmlpull 发表于 2011-12-16 22:33
个人没看 《关于强制读取内存的一点研究成果》  。但是 看看这个函数、是个写 内存的。
pMdl = IoAllocate ...

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

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-9 22:17:48 | 显示全部楼层
看看
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表