首页
社区
课程
招聘
[旧帖] [求助]关于内存映射的一些问题ZwMapViewOfSection 0.00雪花
发表于: 2011-4-22 11:11 1790

[旧帖] [求助]关于内存映射的一些问题ZwMapViewOfSection 0.00雪花

2011-4-22 11:11
1790
本人新手,第一次在论坛发贴,可能出现菜鸟级错误,请忽略,谢谢

本人在研究hook ssdt,相对记事本,word文件进行加密,就是透明加密那种。现在由于记事本和其它office软件都是用内存映射方式打开文件的,因此,我在hook了ZwMapViewOfSection,zwcreatesection函数。这两个函数已经实现挂钩,但是现在问题是,我怎么访问映射区的数据内容。
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
    )
在ddk文档中,解释BaseAddress指向视图的地址,我想弄明白它指向的这个地址是不是映射到文件的开始位置,如果当前我打开一个记事本文件,我想访问记事本的数据内容,我应该怎么通过BaseAddress访问?
还有一点疑问,ViewSize返回的是视图的大小,但是我打印出来的值都非常的大,都上几百兆了,请问这个情况是否正常,或者我理解有误

请各位高手不吝赐教,先谢谢了

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
论坛里发帖的人真积极,帖一下沉了

我把问题补充一下吧。

我现在想从BaseAddress访问内存,ddk文档写ZwMapViewOfSection的参数N OUT PVOID  *BaseAddress,是指向映射区视图的基地址,我现在想输出这个视图的内容,我直接打印了

PVOID  *temp = BaseAddress;

    for (i = 0; i < 2; i ++)
    {
        DbgPrint("%C",(PUCHAR)temp);
        temp++;
    }

结果并不如我所愿,获取不了当前打开的记事本内容,输出的都是无意义字符,所以现在我很疑惑,不知这个基地址意味着什么。
我搜索了论坛里的相关帖子,有的截取对pe可执行文件进行内存映射,这个地址就执行了这个可执行文件的PE结构,我现在是对数据文件的截取,并想获取数据内容,是不是也有这样的类似结构呢?
2011-4-23 08:31
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
呵呵,你知道它只打开了一个文件么?如果不是,请把zwcreatefile 给hook了,记录正确的句柄。
2011-4-23 09:51
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
恩 楼上说的这个 我也有考虑

其实现在我hook ZwMapViewOfSection之前,我就已经把文件IO的几个函数都hook,包括zwcreatefie,zwopenfile, zwreadfile zwwritefile,刚开始我只hook这些IO函数,发现对记事本加密没有,查看资料之后,才知道记事本文件和office文件都是采用的文件映射方法。

现在我hook ZwMapViewOfSection,ZwCreateSection两个关于内存映射的函数,主要研究ZwMapViewOfSection,想找到打开文件的数据内容。

我在hook ZwMapViewOfSection中都打印了当前进程,所以我可以确定哪些是notepad.exe输出的相关数据,如baseaddress,viewsize等ZwMapViewOfSection的参数。

现在我遇到的问题是,我输出不了文件的数据内容,不清楚怎样根据baseaddress找到数据内容。

请大家再帮小弟看看,一直都很着急,很长时间没进展了,
谢了。
2011-4-23 23:06
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还在等候大家的高见!!!

我的程序结构
hookZwMapViewOfSection(………………)
{
PCHAR  *temp = BaseAddress;
…………………………
//调用原来系统的ZwMapViewOfSection
Status = OldZwMapViewOfSection(SectionHandle,ProcessHandle, BaseAddress, ZeroBits,CommitSize, SectionOffset, ViewSize, InheritDisposition, AllocationType, Win32Protect);

//输出函数参数进行分析       
DbgPrint("SectionHandle =%p, ProcessHandle =%p,BaseAddress =%p, ZeroBits =%u, CommitSize = %u, SectionOffset =%L, ViewSize =%u\n",SectionHandle,ProcessHandle,BaseAddress,ZeroBits,CommitSize,&SectionOffset,*ViewSize);

………………
//打印视图基址内容,输出5个字节

DbgPrint("content:");
        for (i = 0; i < 5; i ++)
        {
                DbgPrint("%c",temp+'0');
                temp++;
        }
}
我输出了ZwMapViewOfSection的各个参数,发现BaseAddress 基址很小像007f814,而viewsize却很大2997005648.
想请教各位,我直接打印BaseAddress的内容是否能得到记事本的内容?我这样写代码DbgPrint("%c",(PCHAR)temp+'0');是否正确?包括我输出的参数值,是我没写好代码,还是就是这样的。

等候答复,谢谢
2011-5-10 10:21
0
游客
登录 | 注册 方可回帖
返回
//