首页
社区
课程
招聘
[旧帖] [求助]关于MapViewOfFile返回值的问题,请大家帮忙 0.00雪花
发表于: 2011-5-13 10:50 3962

[旧帖] [求助]关于MapViewOfFile返回值的问题,请大家帮忙 0.00雪花

2011-5-13 10:50
3962
basepointer = MapViewOfFile()函数的返回值
If the function succeeds, the return value is the starting address of the mapped view.

是指向映射视图的首地址,m_strText=(LPSTR)basepointer,就可以得到视图数据内容。我是看例子Memfile.exe得到的,就是映射了txt文本,并获取了内容。打印basepointer得到地址为0xca0000.
现在我用winhex打开menfile.exe进程时,想转移到偏移地址0xca0000,但发现没有这个偏移地址。
请问这个basepointer在winhex查看内存怎么找到?而且我打开内存memfile.exe这个空间,搜索记事本的内容“首都北京”也找不到,请大家指教。

小弟初学,麻烦各位了。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你确认你打开的时候 他没UnMapView
2011-5-13 12:04
0
雪    币: 30
活跃值: (10)
能力值: ( 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 ?有很多其他地址都打印出来了,唯独没有这个,感到很疑惑

请大侠们指点迷津
2011-5-13 18:02
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
你把代码贴出来看看?。
2011-5-13 18:15
0
雪    币: 30
活跃值: (10)
能力值: ( 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;
               
}
2011-5-13 21:42
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
memfile.exe就是应用层使用mapviewoffile进行内存映射的程序,映射的是一个txt文件
截图显示 打印出的BaseAddress值并不固定,而且都没有拦截到0xca0000这个地址。在驱动中指定0xca0000地址打印出来的数据是“北京是中国的首都”,证明已经映射成功。而试图打印BaseAddress地址上的数据也打不出来,应该为空
上传的附件:
2011-5-13 22:12
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
已经解决,问题出在我在打印BaseAddress时,应该加上*,定义的时候 是IN OUT PVOID  *BaseAddress。
自己太大意了
2011-5-16 22:19
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也常用内存映射,但没有深究,在此学习下。
2011-5-17 10:42
0
游客
登录 | 注册 方可回帖
返回
//