VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3029回复:28

程序是怎样加载ntoskrnl.exe的???

楼主#
更多 发布于:2002-06-21 16:33
我好困惑,这东西是每个程序必须的,但没发现它是怎么被加载的啊。
大家看
application->kernel32.dll->ntdll.dll
但ntdll.dll就不导入函数了啊
刚才我把一个网上的ring0的C程序总算编译过去了,结果它竟然显式导入ntoskrnl.exe了,系统不认,无法初始化
ntoskrnl.exe是怎么回事?难道整个系统就一份copy?那在C程序里怎么用它啊,一些它导出的函数怎么连接啊
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-06-24 14:56
厉害,厉害
终于见到高手讨论了
pjf,我佩服
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-21 18:34
搞得像病毒一样
-----------------------------------------------------------------------
本来这就是不写驱动获取ring0的尝试之一,什么程序才需要这样呢?呵呵

所以我才研究它啊,呼呼
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-06-21 18:32
好好。
这种话题多多议善啊。

sys应该是在2G空间上面的(不加/3G的话),就是pjf说的系统空间,被2G下面的进程共享的。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-21 17:54
搞得像病毒一样
-----------------------------------------------------------------------
本来这就是不写驱动获取ring0的尝试之一,什么程序才需要这样呢?呵呵
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-21 17:52
exe就不行
---------------------------------------------------------------------
当然。exe只能加载,它不让你运行起来,555
不过也是为了安全
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-21 17:50
1、不导入呗---哈哈。其实就是自己做初始化的事(取内核函数地址等)。
------------------------------------------------------------
搞得像病毒一样

2、不是很详细了么:“将文件头表现为sys格式”,否则不理睬你。
------------------------------------------------------------exe就不行?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-21 17:49
loader就不加载我导入ntoskrnl.exe的程序,你有什么法?
I/O管理器安全检查?详细些
-------------------------------------------------------------------------
1、不导入呗---哈哈。其实就是自己做初始化的事(取内核函数地址等)。
2、不是很详细了么:“将文件头表现为sys格式”,否则不理睬你。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-21 17:44
dll确实是从文件里只装入一次
----------------------------------------------------------------------
我们对“装载”这个词的理解造成的分歧,呵呵。那书很久前看了很多遍,好像还记得,呵呵。
举个例子,我做一个消息钩子,每次一个进程调用界面服务导致系统自动加载我的DLL并调其入口,你在DllMain里加个MessageBox就知道它在你切换焦点时总会跳出来。注意:系统将dll文件映射入一个进程空间并调用入口才是我说的加载!与matt的定义有无出入我不管,一个进程用一个dll,这个dll就被映射入该进程空间、DllMain被调用-----被加载了!
9x的确与2000还有些出入。
sys在系统内核空间,环境切换时都不用改变,所用进程全局共享。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-21 17:32
既导入ring3函数,又导入ring0函数”?那你怎么调用ring0?一个call指令显然不行的,这涉及到特权级改变啊
----------------------------------------------------------------------
你没理解我的意思,呵呵。特权切换让系统去做,我也不用长call。不成的原因是加载exe得加载器拒绝初始化我的导入表(这我有法)和该死的I/O管理器安全检查(这过不了,只有老老实实将文件头表现为sys格式)。

loader就不加载我导入ntoskrnl.exe的程序,你有什么法?
I/O管理器安全检查?详细些
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-21 17:31
既导入ring3函数,又导入ring0函数”?那你怎么调用ring0?一个call指令显然不行的,这涉及到特权级改变啊
----------------------------------------------------------------------
你没理解我的意思,呵呵。特权切换让系统去做,我也不用长call。不成的原因是加载exe得加载器拒绝初始化我的导入表(这我有法)和该死的I/O管理器安全检查(这过不了,只有老老实实将文件头表现为sys格式)。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-21 17:30
[quote]no,no,sys自然只需加载一次(内核空间,of course),dll会被多次加载(一个用到的进程一次,只是可以内存共享)。copy-on-write机制也仅仅对dll而言,因为它属于进程空间。
对于sys若你未改变NT内存保护策略(softice会改),ring0程序一样不能改(当然去除CR0的WP为就可以了)。

error!it is a basic concept!
please read win95 system programming secrets---the chapter 3
 [/quote]
别吵
dll确实是从文件里只装入一次,但它会被映射到不同的进程空间
sys我不太熟,它是全局的吗?为各个进程共享?
还有win9X和2000不太一样。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-06-21 17:28
no,no,sys自然只需加载一次(内核空间,of course),dll会被多次加载(一个用到的进程一次,只是可以内存共享)。copy-on-write机制也仅仅对dll而言,因为它属于进程空间。
对于sys若你未改变NT内存保护策略(softice会改),ring0程序一样不能改(当然去除CR0的WP为就可以了)。

error!it is a basic concept!
please read win95 system programming secrets---the chapter 3
一剑西来,天外飞仙
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-06-21 17:27
sys和dll一样都是只装载一次,不管有好多程序调用它,如果发生改变数据时,就会执行copy-on-write机制
------------------------------------------------------------------------
no,no,sys自然只需加载一次(内核空间,of course),dll会被多次加载(一个用到的进程一次,只是可以内存共享)。copy-on-write机制也仅仅对dll而言,因为它属于进程空间。
对于sys若你未改变NT内存保护策略(softice会改),ring0程序一样不能改(当然去除CR0的WP为就可以了)。

SI是怎么改的NT内存保护策略?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-06-21 17:26
多说几句吧
ntdll.dll主要导出系统服务的包装函数(int2e/sysenter),以及一些Rtl*函数;ntoskrnl.exe为了让内核程序(如驱动)也可用,导出了一些系统服务的再包装(Zw*用了int2e、Nt*未用int2e),以及一些Rtl*函数。
你确定你的程序在Ring0执行,自然导入ntoskrnl的,等等。

以前我曾试过让我的程序既导入ring3函数,又导入ring0函数(我的目的是做一个将自己加载入ring0的ring3程序,因为NT确实支持将exe、dll加载入内核。可惜一旦你不止要它加载、还要它执行起来时,它就要执行严格检查;另一限制就是因为里面导入了ring0函数(address>0x80000000),加载器不执行此exe),最后只有找其它方法,还不如写驱动,faint.

“既导入ring3函数,又导入ring0函数”?那你怎么调用ring0?一个call指令显然不行的,这涉及到特权级改变啊
其实ntdll.dll就是一个ntoskrnl的外壳,只不过它能用int 2e从ring3切到ring 0而已。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-06-21 17:24
sys和dll一样都是只装载一次,不管有好多程序调用它,如果发生改变数据时,就会执行copy-on-write机制
------------------------------------------------------------------------
no,no,sys自然只需加载一次(内核空间,of course),dll会被多次加载(一个用到的进程一次,只是可以内存共享)。copy-on-write机制也仅仅对dll而言,因为它属于进程空间。
对于sys若你未改变NT内存保护策略(softice会改),ring0程序一样不能改(当然去除CR0的WP为就可以了)。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-06-21 17:19
[quote]兄弟能否给我讲一下sys的装载机理?和dll不一样?一个sys就装入一份而不管多少程序用它?
ring0的东西可以导入ntoskrnl?我的程序(其实是网上下的)是ring3的

sys和dll一样都是只装载一次,不管有好多程序调用它,如果发生改变数据时,就会执行copy-on-write机制 [/quote]
但dll好像被占用,不能改变它的文件。dll和exe差不多,都是用文件映射的,估计sys不是,是真的全读到内存里了。所以你看看,你就没法在windows下删除kernel32.dll。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-06-21 17:19
多说几句吧
ntdll.dll主要导出系统服务的包装函数(int2e/sysenter),以及一些Rtl*函数;ntoskrnl.exe为了让内核程序(如驱动)也可用,导出了一些系统服务的再包装(Zw*用了int2e、Nt*未用int2e),以及一些Rtl*函数。
你确定你的程序在Ring0执行,自然导入ntoskrnl的,等等。

以前我曾试过让我的程序既导入ring3函数,又导入ring0函数(我的目的是做一个将自己加载入ring0的ring3程序,因为NT确实支持将exe、dll加载入内核。可惜一旦你不止要它加载、还要它执行起来时,它就要执行严格检查;另一限制就是因为里面导入了ring0函数(address>0x80000000),加载器不执行此exe),最后只有找其它方法,还不如写驱动,faint.
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-06-21 17:17
兄弟能否给我讲一下sys的装载机理?和dll不一样?一个sys就装入一份而不管多少程序用它?
ring0的东西可以导入ntoskrnl?我的程序(其实是网上下的)是ring3的

sys和dll一样都是只装载一次,不管有好多程序调用它,如果发生改变数据时,就会执行copy-on-write机制
一剑西来,天外飞仙
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-06-21 17:06
sys被加载后随便删,ntoskrnl会检查(同很多系统sys一样)自己被该过没,不过卑鄙的病毒可以把检查代码一起改了,呵呵。

那我明白了。ntoskrnl不会检查自己,是ntldr检查的,所以Funlove把ntldr也改了。
兄弟能否给我讲一下sys的装载机理?和dll不一样?一个sys就装入一份而不管多少程序用它?
ring0的东西可以导入ntoskrnl?我的程序(其实是网上下的)是ring3的
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
上一页
游客

返回顶部