能力值:
( LV4,RANK:50 )
2 楼
你确认你打开的时候 他没UnMapView
能力值:
( LV2,RANK:10 )
3 楼
感谢楼上的兄弟,的确在用winhex打开目标进程之前,目标经常已经unmap了视图,修改之后,在winhex中可以看到内存0xca0000上记事本中的内容了。
现在,我进行第二步,在驱动程序中hook ZwMapViewOfSection这个内核函数,我想在驱动上拦截memfile.exe进程内存映射的过程,如果正常情况下ZwMapViewOfSection也会返回一个视图地址BaseAddress,这个地址与应用层中mapviewoffile返回的地址应该是一样的。
现在我遇到的问题是:我把memfile .exe调用到的ZwMapViewOfSection函数视图地址BaseAddress都打印出来,但是没有拦截到与mapviewoffile返回值相同的地址。开始以为没有映射成功,后来我在驱动中直接打印 0xca0000 (mapviewoffile返回值)这个内存地址,却得到了记事本文档的内容,证明已经映射成功。
既然已经映射成功,ZwMapViewOfSection中BaseAddress返回的地址为什么没有 0xca0000 ?有很多其他地址都打印出来了,唯独没有这个,感到很疑惑
请大侠们指点迷津
能力值:
( LV4,RANK:50 )
4 楼
你把代码贴出来看看?。
能力值:
( LV2,RANK:10 )
5 楼
NTSTATUS HookZwMapViewOfSection(
IN HANDLE SectionHandle,
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG_PTR ZeroBits,
IN SIZE_T CommitSize,
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
IN OUT PSIZE_T ViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Win32Protect
)
{
NTSTATUS Status;
ANSI_STRING AsiProcessName;
UNICODE_STRING UniProcessName;
UNICODE_STRING UniWinword;
ANSI_STRING Content;
PVOID *temp = BaseAddress;
PVOID lpbase = (PVOID)0xca0000;//这里指定了0xca0000这个内存地址
// 打印进程信息
PEPROCESS pEProcess = PsGetCurrentProcess();
PTSTR ProcessName = (PTSTR)((ULONG)pEProcess + 0x174);
RtlInitAnsiString(&AsiProcessName,ProcessName);
DbgPrint(":: ZwMapViewOfSection ProcessName = %s",ProcessName);
UniProcessName.Buffer = (PWCHAR)ExAllocatePool(NonPagedPool,1024);
if(UniProcessName.Buffer == NULL)
{
DbgPrint("BIG ERROR");
Status = STATUS_INSUFFICIENT_RESOURCES;// errror code
return Status;//return error code
}
UniProcessName.MaximumLength = 1024;
RtlAnsiStringToUnicodeString(&UniProcessName,&AsiProcessName,FALSE);
RtlInitUnicodeString(&UniWinword,TARGETPROCESS);//TARGETPROCESS暂时定义为memfile.exe
//调用原系统ZwMapViewOfSection函数
Status = OldZwMapViewOfSection(SectionHandle,ProcessHandle, BaseAddress, ZeroBits,CommitSize, SectionOffset, ViewSize, InheritDisposition, AllocationType, Win32Protect);
if(!RtlCompareUnicodeString(&UniProcessName,&UniWinword,TRUE)) //如果是memfile进程,则打印输出信息。
{
DbgPrint(" %s",(PSTR)lpbase);//如果是memfile进程,试图打印0xca0000内存地址上的内容
}
ExFreePool(UniProcessName.Buffer);
UniProcessName.Buffer = NULL;
UniProcessName.MaximumLength = 0;
//打印ZwMapViewOfSection函数各参数值,进行分析
DbgPrint("SectionHandle =%p, ProcessHandle =%p,BaseAddress =%x, ZeroBits =%u, CommitSize = %u, SectionOffset =%L, ViewSize =%x\n",SectionHandle,ProcessHandle,BaseAddress,ZeroBits,CommitSize,&SectionOffset,*ViewSize);
DbgPrint("2222222222content:");
DbgPrint("%s",(PSTR)temp);//打印BaseAddress地址上的数据
return Status;
}
能力值:
( LV2,RANK:10 )
6 楼
memfile.exe就是应用层使用mapviewoffile进行内存映射的程序,映射的是一个txt文件
截图显示 打印出的BaseAddress值并不固定,而且都没有拦截到0xca0000这个地址。在驱动中指定0xca0000地址打印出来的数据是“北京是中国的首都”,证明已经映射成功。而试图打印BaseAddress地址上的数据也打不出来,应该为空
上传的附件:
能力值:
( LV2,RANK:10 )
7 楼
已经解决,问题出在我在打印BaseAddress时,应该加上*,定义的时候 是IN OUT PVOID *BaseAddress。
自己太大意了
能力值:
( LV2,RANK:10 )
8 楼
我也常用内存映射,但没有深究,在此学习下。