记两个用于修改用户态内存的函数

Posted 黑月教主的空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记两个用于修改用户态内存的函数相关的知识,希望对你有一定的参考价值。

//用于在LoadImageRoutine中使用,修改用户态内存
PMDL MapUserModeAddrWritable(PVOID BaseAddr,ULONG Length, PVOID *pNewAddr);
VOID UnmapMemory(PVOID pAddr, PMDL pMdl);

PMDL MapUserModeAddrWritable(PVOID BaseAddr,ULONG Length, PVOID *pNewAddr)
{
    PVOID pMapedAddr = NULL ;
    //创建一个MDL
    PMDL pMdl = IoAllocateMdl(BaseAddr,Length,FALSE,FALSE,NULL);
    if (pMdl == NULL)
    {
        dprintf("pMDL == NULL\n");
        return NULL;
    }
    
    __try
    {
        MmProbeAndLockPages(pMdl,UserMode,IoReadAccess);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        dprintf("MmProbeAndLockPages exception. Code  = 0x%08X\n",GetExceptionCode());
        IoFreeMdl(pMdl);
        return NULL;
    }
    
    
    pMapedAddr = MmMapLockedPagesSpecifyCache(pMdl,KernelMode,MmCached,NULL,FALSE,NormalPagePriority);
    if (!pMapedAddr)
    {
        dprintf("pMapedAdd == NULL\n");
        MmUnlockPages(pMdl);
        IoFreeMdl(pMdl);
        return NULL;
    }
    
    *pNewAddr = pMapedAddr ;
    return pMdl;
    
}

VOID UnmapMemory(PVOID pAddr, PMDL pMdl)
{
    if (pAddr != NULL)
    {
        MmUnmapLockedPages(pAddr,pMdl);
    }
    
    if (pMdl != NULL)
    {
        MmUnlockPages(pMdl);
        IoFreeMdl(pMdl);
    }
    
}

 

以上是关于记两个用于修改用户态内存的函数的主要内容,如果未能解决你的问题,请参考以下文章

linux进程为啥有用户栈和内核栈,

例说linux内核与应用数据通信:映射设备内核空间到用户态

#2021年底大盘点#内核态和用户态

golang中的CSP并发模型

windows内核态调用readfile

瞬态内存中的 Java Card 对象实例