首页
社区
课程
招聘
[求助]请教ring0下的内存地址空间
2006-10-11 09:57 8964

[求助]请教ring0下的内存地址空间

2006-10-11 09:57
8964
请问:
驱动程序是运行在保护模式还是实模式啊?
在ring0下, windows的内存地址是什么样子的啊?
请朋友们帮我解答, 我对这个问题比较疑惑, 谢谢了。

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

收藏
点赞0
打赏
分享
最新回复 (32)
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
buguty 2 2006-10-11 10:12
2
0
驱动运行在保护模式.内存在系统内存区域.
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 10:16
3
0
楼上的兄弟可不可以推荐点这方面的资料啊.
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-11 10:53
4
0
看雪FTP里, 斑竹doskey上传了很多驱动相关的资料
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 10:59
5
0
谢谢啊..  我去看看。 我就是搞不清楚驱动程序是不是会象DLL文件一样映射到用户进程的地址空间呢?
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-11 11:07
6
0
对于NT系统, 从下表中可以看到, Ring 0程序使用的08号(Code)和10号(Data)与Ring 3程序使用的18号(Code)和20(Data)号这4个描述符描述的是同一个4G线性空间, 这就是Windows程序使用的所谓"4G平坦空间"的由来. 从表中也可以看出, 对于Ring 3地址空间中的某地址, 例如 0020:00403000在Ring 0地址空间中可以用同一个偏移访问(0010:00403000)

因此, 得到的结论是
无论是从Ring 0代码还是从Ring 3代码的角度来看Windows的内存安排, 两者都可见的部分完全相同

强调两者都可见, 是因为Ring 3代码无法访问地址在80000000以上的空间

-------------------------------------------------------------------------------
Sel.  Base      Limit     DPL  P   G    Description
-------------------------------------------------------------------------------
0008  00000000  FFFFFFFF   0   P   4Kb  Execute/Read, accessed
0010  00000000  FFFFFFFF   0   P   4Kb  Read/Write, accessed
0018  00000000  FFFFFFFF   3   P   4Kb  Execute/Read, accessed
0020  00000000  FFFFFFFF   3   P   4Kb  Read/Write, accessed
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-11 11:09
7
0
最初由 yoshimitsu 发布
谢谢啊.. 我去看看。 我就是搞不清楚驱动程序是不是会象DLL文件一样映射到用户进程的地址空间呢?


驱动程序在系统地址空间, 系统地址空间是被所有用户进程共享的
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 11:17
8
0
我想修改ServiceDescriptorTable挂接API. 这样挂接是整个系统内有效还是仅仅一个程序有效呢?
当我修改的时候, 会不会象用户模式那样, 系统用copy-on-write机制呢??
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-11 11:51
9
0
ServiceDescripterTable在不同的Windows发行版本中是不一样的, 这种方法不保险啊
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 12:22
10
0
兄弟. 你能不能给我详细介绍下用驱动挂接API的原理啊? 或者给我推荐点这方面的资料.
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-11 13:28
11
0
看雪论坛就有, 例如
http://bbs.pediy.com/showthread.php?s=&threadid=22707&highlight=Hook
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 16:56
12
0
谢谢兄弟了.  是不是 .sys文件和.dll文件 都会映射到进程的地址空间, 只不过.sys文件是映射到内核地址空间, 而.dll文件是映射到用户地址空间啊?
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nipcdll 2006-10-11 17:13
13
0
最初由 thebutterfly 发布
看雪FTP里, 斑竹doskey上传了很多驱动相关的资料

ftp的地址和密码是??
谢谢
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 17:47
14
0
工具版块里面有地址, 但是密码我不知道怎么得到, 如果你知道, 麻烦告诉一声.
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-11 18:01
15
0
最初由 nipcdll 发布
ftp的地址和密码是??
谢谢

恕不告知
好像有了精华贴就可以看到自己的帐号和密码了
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-11 18:30
16
0
楼上的兄弟。 我看了你给我推荐的帖子, 但是我想搞懂的问题还是没搞懂..

其实我是这个意思:
当我们在用户层挂接API的时候, 如果我们用修改目标函数前5个字节的方法, 那我们的HOOK函数所在的DLL必须要想办法映射到目标函数所在程序的地址空间中, 这样JMP后面所跟的地址才是有效地址.
那用驱动程序修改ServiceDescriptorTable的时候, 我们的HOOK函数的地址只在我们自己的驱动程序中, 那当其他程序调用目标函数是岂不是会得到一个无效地址, 除非我们的HOOK函数所在的驱动程序被映射到了目标函数做在程序的地址空间.

  你看我的想法对吗?  是不是有错啊?
  麻烦你给我解释下。 谢谢了。
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 3 2006-10-11 19:17
17
0
没有学过驱动开发的话最好不要碰这个东西,一天蓝几百次屏可不好玩

运行于内核态的程序,在整块内存中仅有一份映像,每个进程中的地址相同,彼此可见。虽然在每个进程中装入的页表都不一样,但内核空间使用的物理页和线性地址都是相同的。
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-12 08:28
18
0
楼上的兄弟,

你说  "每个进程中的地址相同",
      "内核空间使用的物理页和线性地址都是相同的"

是不是意味这驱动程序不需要象.DLL那样重定位?
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-12 08:32
19
0
驱动的映象基址DDK默认是10000h, 肯定需要重定位
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-12 08:41
20
0
在用户层下, 我们想挂接API, 首先要做的事就是要把我们的HOOK函数所在的DLL映射到目标函数所在的进程空间, 比如用鼠标钩子和插入DLL等方法.

那我现在要挂接的是内核函数,  我需要做这一步吗??
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-10-12 08:50
21
0
不需要, 驱动本身就是映射到所有进程的地址空间的
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-12 08:51
22
0
啊?  是这样的啊?  
这下我知道了..  太感谢你了 thebutterfly
你是从哪儿知道这些东东的啊?
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-12 08:56
23
0
还有个问题, 比如A进程和B进程中都有kernel32.dll的映像. 现在我修改A进程的KERNEL32.DLL的代码, B进程肯定不会受到影响,

但假设说A通过驱动修改了ServiceDescriptorTable, 那B也会受到影响吗?
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 3 2006-10-12 12:38
24
0
看明白我的话,你就不会问这个问题了
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yoshimitsu 2006-10-12 15:30
25
0
楼上的兄弟. 按照你的意思, 如果回答我在23楼提的问题, 那答案就是B会受到影响.

对吗?
游客
登录 | 注册 方可回帖
返回