nudtcan
驱动牛犊
驱动牛犊
  • 注册日期2011-03-16
  • 最后登录2011-05-26
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3197回复:3

关于内存映射截取问题

楼主#
更多 发布于:2011-04-20 08:54
本人相对记事本 word等文本文件进行加密,对内核ZwCreateSection,ZwMapViewOfSection进行hook,因为windows打开这些文本文件,都是通过内存映射打开的。

现在我遇到一个问题,就是不知怎么访问内存映射区,有人说通过ZwMapViewOfSection参数BaseAddress,可以得到映射区视图的基地址,通过这个直接访问内存,但是现在这个视图大小不怎么获取。还有一个参数ViewSize,ddk说是返回视图大小,但是我打印出来的时候,这个viewsize数值相当大,上了几百兆,所以我现在很困惑。

究竟怎么从ZwMapViewOfSection挂钩后,获取文件数据的内容,请大家指教。
这是函数原型
NTSTATUS ZwMapViewOfSection(
    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
    )
nudtcan
驱动牛犊
驱动牛犊
  • 注册日期2011-03-16
  • 最后登录2011-05-26
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-04-21 15:51
补充一下

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

PVOID  *temp = BaseAddress;

    for (i = 0; i < 2; i ++)
    {
        DbgPrint("%C",(PUCHAR)temp);
        temp++;
    }
但是我打印输出的内容并不是我打开一个记事本里的内容,记事本里就是vvvvvvaaaaa
因为我现在还不能判断视图的偏移量,我只打印两个字符,打印10个也是一样,都是些无意义字符

请问大家,1.我这样访问内存是否得当
                    2。是否我写DbgPrint("%C",(PUCHAR)temp); 时有错误,强制转换 我还用过LPSTR,PSTR,
                    3.是不是*BaseAddress这个参数我理解有误

先谢谢了
nudtcan
驱动牛犊
驱动牛犊
  • 注册日期2011-03-16
  • 最后登录2011-05-26
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2011-04-23 08:33
没有人回答吗 这个问题是不是太简单了,大牛都不屑回答啊,

现在郁闷中
nudtcan
驱动牛犊
驱动牛犊
  • 注册日期2011-03-16
  • 最后登录2011-05-26
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2011-05-10 10:43
还在等候大家的高见!!!

我的程序结构
hookZwMapViewOfSection(………………)
{
…………………………
//调用原来系统的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个字节
PVOID  *temp = BaseAddress;
DbgPrint("content:");
  for (i = 0; i < 5; i ++)
  {
    DbgPrint("%c",(PCHAR)temp+'0');
    temp++;
  }
}
我输出了ZwMapViewOfSection的各个参数,发现BaseAddress 基址很小像007f814,而viewsize却很大2997005648.
想请教各位,我直接打印BaseAddress的内容是否能得到记事本的内容?我这样写代码DbgPrint("%c",(PCHAR)temp+'0');是否正确?包括我输出的参数值,是我没写好代码,还是就是这样的。

等候答复,谢谢
游客

返回顶部