首页
社区
课程
招聘
[求助]驱动如何在指定进程中内存写入
发表于: 2013-9-12 20:49 13268

[求助]驱动如何在指定进程中内存写入

2013-9-12 20:49
13268
现在read流程是成功的

1. 根据Pid 获取EPROCESS
2. 交换cr3
3. read进程内存, -》 把这个read操作改成write 就是蓝屏了。

是不是write 不能这么操作

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不能这样,可以用MDL把内存映射到内核中操作
2013-9-13 01:27
0
雪    币: 34
活跃值: (734)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
求指导。。
2013-9-13 09:29
0
雪    币: 1234
活跃值: (297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
太高深了
2013-9-13 21:19
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
直接操作用户态内存可能出现缺页或是访问违规异常,你上面能读不能写估计是因为内存是只读的,总之方法是错的,驱动不应该直接操作用户态内存,也不应该自己去操作CR3。给你个通过MDL写内存的函数,可以写用户太内存,用之前先attach到目标进程上就行了

NTSTATUS
KernelVmWrite(
        IN PVOID WriteAddress,
        IN ULONG WriteLength,
        IN PVOID InputBuffer
        )
{
        PMDL mdl;
        PVOID *pMappedMemory;

        mdl = MmCreateMdl(NULL, WriteAddress, WriteLength);
        if(!mdl)
                return STATUS_UNSUCCESSFUL;

        MmBuildMdlForNonPagedPool(mdl);
        mdl->MdlFlags |= MDL_MAPPED_TO_SYSTEM_VA;
        pMappedMemory = MmMapLockedPages(mdl, KernelMode);

        if (!pMappedMemory)
        {
                IoFreeMdl(mdl);
                return STATUS_UNSUCCESSFUL;
        }

        RtlCopyMemory(pMappedMemory, InputBuffer, WriteLength);

        MmUnmapLockedPages(pMappedMemory, mdl);
        IoFreeMdl(mdl);
        return STATUS_SUCCESS;
}
2013-9-14 20:14
0
雪    币: 34
活跃值: (734)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
根据你的指导,我现在代码是这样的,不过会蓝屏
NTSTATUS WriteUserProcessMemory(
                 IN PVOID             pBaseAddr,  
                 IN unsigned char * pszBuffer,
                 IN unsigned long    dwBufferSize)
{
        NTSTATUS status = STATUS_SUCCESS;
        ULONG        dwAllocSize        = (dwBufferSize  / 4) * 4;
        dwAllocSize += (dwBufferSize % 4) * 4 ;
        PMDL pMdl = IoAllocateMdl(pBaseAddr,
                                     dwAllocSize,
                                     FALSE,
                                     FALSE,
                                     NULL);
        if (pMdl == NULL)
        {
                return ~status;
        }
        MmProbeAndLockPages(pMdl, UserMode, IoWriteAccess);
        PVOID pDest = MmMapLockedPagesSpecifyCache( pMdl,
                        KernelMode,
                        MmNonCached
                        NULL,
                        FALSE
                        NormalPagePriority
                       );
        if (pDest == NULL)
        {
                MmUnmapLockedPages(pDest, pMdl);
                IoFreeMdl(pMdl);
                return ~status;
        }

                //向pDest 写入蓝屏,存在这个问题

        return status;
}
2013-9-16 11:03
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
关键词,内存写保护
2013-9-16 11:07
0
雪    币: 34
活跃值: (734)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
内存写保护,mdl不是帮我们自动搞定吗
2013-9-16 11:27
0
雪    币: 2063
活跃值: (1752)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
内存页的权限问题吧,是不是只读啊
2013-9-16 12:26
0
雪    币: 326
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
MmBuildMdlForNonPagedPool?
2013-9-16 16:47
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
11
KeStackAttachProcess到目标进程之后,你的CR3已经被切换为目标进程的了,这个时候可以直接操作目标进程的用户内存,注意处理下同步和内存保护属性的问题。为啥要MDL呢?这个时候就算缺页理论上也能正常处理的吧。

但依赖attach后只要hook一下KiAttachProcess就会被发现……
2013-9-16 17:36
0
雪    币: 7085
活跃值: (3612)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
MmProbeAndLockPages 应该在__try   和__except中使用.
2013-9-16 18:15
0
雪    币: 34
活跃值: (734)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
=。= 那怎么用MDL操作指定进程内存呢
2013-9-27 12:18
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我们交个朋友吧
2014-1-7 09:47
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
给你段代码看能否用
PMDL NTAPI IoCreateWriteMdlForAddress(PVOID InAddress,PVOID *OutAddress,size_t Size) ////创建内存可写;
{
        PMDL pMdl=NULL;
        if(Size>0)
        {
                if((InAddress==NULL)|(Size==0))
                        return NULL;
                //  if(!MmIsAddressValid(InAddress))
                //    return NULL;
                if(OutAddress==NULL)
                        return NULL;
                if(!MmIsAddressValid(OutAddress))
                        return NULL;
        }
        else
        {
                return NULL;
        }
        pMdl=MmCreateMdl(NULL,InAddress,Size);
        if(pMdl==NULL)
        {
                return NULL;
        }
        MmBuildMdlForNonPagedPool(pMdl);
        //  My_Mdl->MdlFlags = My_Mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
        if(!FlagOn(pMdl->MdlFlags,MDL_MAPPED_TO_SYSTEM_VA))
                SetFlag(pMdl->MdlFlags,MDL_MAPPED_TO_SYSTEM_VA);
        *OutAddress=MmMapLockedPages(pMdl, KernelMode);
        return pMdl;
}
VOID NTAPI IoFreeMdlForAddress(PVOID Address,PMDL pMdl)
{
        MmUnmapLockedPages(Address,pMdl);
        IoFreeMdl(pMdl);
}
2014-1-7 10:36
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
写之前探测下是否可写 try住
2014-1-9 23:10
0
雪    币: 37
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
先用try  catch抱起来,防止发生意外
2014-1-10 09:01
0
游客
登录 | 注册 方可回帖
返回
//