首页
社区
课程
招聘
驱动中访问分页内存出错
发表于: 2010-3-1 01:19 4309

驱动中访问分页内存出错

2010-3-1 01:19
4309
目标是通过访问已加载内核模块中的win32.sys把它的导出表读出来,
首先通过ZwQuerySystemInformation获得win32.sys加载基址Base = bf800000
然后用以下语句获得 win32.sys的dos头和nt头,但红色的部分会读bf80003c地址,这里会触发蓝屏.
DosHead = (PIMAGE_DOS_HEADER)Base;
NtHeads = (PIMAGE_NT_HEADERS)((ULONG)DosHead + DosHead->e_lfanew);

我猜想win32.sys此时被交换至分页内存,于是在蓝屏之前,查看了此地址内存内容
kd> dd bf800000
bf800000  ???????? ???????? ???????? ????????
bf800010  ???????? ???????? ???????? ????????
bf800020  ???????? ???????? ???????? ????????
bf800030  ???????? ???????? ???????? ????????
bf800040  ???????? ???????? ???????? ????????
bf800050  ???????? ???????? ???????? ????????
bf800060  ???????? ???????? ???????? ????????
bf800070  ???????? ???????? ???????? ????????
kd>!pcr得到当前运行级别是passivelevel
irql 00000000

DDK上不是说 处于pasivelevel的代码都能访问分页内存,此时会触发缺页中断,中断处理后继续执行中断前的指令.
既然当前运行级别是passivelevel,也将此函数设置为#pragma alloc_text(PAGE, HookCheckAllModuleExportRoutine)
为何还会蓝屏,怎么解决这个问题呢,网上搜了半天没搜到,害的偶又睡不好觉,无奈錒,帮帮偶把

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 8333
活跃值: (2911)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你理解的也没错.

但是.不适合这个场合吧..

访问分页内存.会触发缺页中断.

说明什么.这个内存地址是有效的.只不过现在被交换出去了.

但是.微软可没告诉.如果一个地址.本身就是无效的.你也可以用这套解决.

根本原因简单说来就是.

执行驱动代码的线程默认处于SYSTEM进程地址空间.

而在这个地址空间的PAE内没有对win32k.sys所在的地址的映射..

所以也可以想象成无效地址..

解决办法:切换一下进程地址空间即可.(比如Attach一下别的进程)

详细的原理解释.请访问 http://hi.baidu.com/_achillis/blog/item/da88bb195b75ef0c34fa4173.html..
2010-3-1 01:40
0
雪    币: 75
活跃值: (803)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
非常感谢傷遺忘兄台热心帮助,正准备问你相关原理资料,就冒出来了还真不知道它没被映射进去
2010-3-1 02:09
0
游客
登录 | 注册 方可回帖
返回
//