能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不能这样,可以用MDL把内存映射到内核中操作
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
求指导。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
太高深了
|
能力值:
( 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;
}
|
能力值:
( 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;
}
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
关键词,内存写保护
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
内存写保护,mdl不是帮我们自动搞定吗
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
内存页的权限问题吧,是不是只读啊
|
能力值:
( LV3,RANK:30 )
|
-
-
10 楼
MmBuildMdlForNonPagedPool?
|
能力值:
(RANK:50 )
|
-
-
11 楼
KeStackAttachProcess到目标进程之后,你的CR3已经被切换为目标进程的了,这个时候可以直接操作目标进程的用户内存,注意处理下同步和内存保护属性的问题。为啥要MDL呢?这个时候就算缺页理论上也能正常处理的吧。
但依赖attach后只要hook一下KiAttachProcess就会被发现……
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
MmProbeAndLockPages 应该在__try 和__except中使用.
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
=。= 那怎么用MDL操作指定进程内存呢
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
我们交个朋友吧
|
能力值:
( 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);
}
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
写之前探测下是否可写 try住
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
先用try catch抱起来,防止发生意外
|
|
|