阅读:3197回复:3
关于内存映射截取问题
本人相对记事本 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 ) |
|
沙发#
发布于: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这个参数我理解有误 先谢谢了 |
|
板凳#
发布于:2011-04-23 08:33
没有人回答吗 这个问题是不是太简单了,大牛都不屑回答啊,
现在郁闷中 |
|
地板#
发布于: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');是否正确?包括我输出的参数值,是我没写好代码,还是就是这样的。 等候答复,谢谢 |
|