首页
社区
课程
招聘
[讨论] 为什么32位驱动程序不能运行在64系统中
发表于: 2017-12-23 12:13 13969

[讨论] 为什么32位驱动程序不能运行在64系统中

2017-12-23 12:13
13969
32位应用程序一般可以运行在64位系统中,
但是  32位驱动为什么不能呢。 
技术方面 应该是支持吧。 cpu支持32位指令, 内核有system32提供支持牙。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
主要是,指针长度,寄存器,参数传递方式,以及一部分指令的不同。指针长度不同,导致数据结构大小的不同!参数传递方式导致参数无法正确的传递!32位应用程序一般可以运行在64位系统中,那是因为系统利用CPU的32位模式做了虚拟一个X86环境的工作,这个环境欺骗了32位应用,使得32位应用程序可以运行在64位系统中。而驱动就没有这个虚拟工作,直接运行在X64模式下,这个时候X86的32位驱动当然就不能运行在X64的驱动环境下啦!
2017-12-23 13:10
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
其实32位程序在64位系统中运行的情况是这样的:32位程序->虚拟层->系统->硬件执行命令
其实而驱动中的情况是这样的:驱动程序->系统->硬件
或者是:驱动程序->硬件。
这样可以解答你的疑问了吧!
因为驱动没有虚拟层来负责转换,所以32位的驱动是不能在64位的驱动环境下执行的
2017-12-23 13:17
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
你也可以自己开发驱动虚拟层,不过这样的话,你相当于重写了整个WINDOWS了,太不划算了
2017-12-23 13:19
0
雪    币: 216
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
czcqq 你也可以自己开发驱动虚拟层,不过这样的话,你相当于重写了整个WINDOWS了,太不划算了
@czcqq,  感谢你的回答,  这个虚拟层  是内核的吗,  反编译调试一个32位程序时,  好像没发现这个,  调用api时  直接走了  fastsyscall了,是转到内核时由虚拟层接手的吗。 
2017-12-23 15:00
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
zhougao @czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
并不是全是内核,是内核有一部分,还有应用的RING3有一大部分,RING3负责转换,而驱动部分负责返回RING3的X86函数需要的格式!这个虚拟层是内核和ring3的应用配合而成的!大概是这样的,32位程序->NTDLL.DLL(32位)->虚拟层->NTDLL.DLL(64位)->SystemCall\SystemEntry指令进入内核->Nt\Zw系列函数->系统处理->判断是64位程序还是32位程序,如果是64位程序,则直接处理,完成之后返回。如果是32位程序,就将参数转换为64位的参数,然后处理,处理完成之后再次将参数转换为32位参数。->Nt\Zw系列函数返回->SystemRet/SystemLeave指令->NTDLL.DLL(64位)->虚拟层->NTDLL.DLL(32位)->32位程序  这样,一个处理流程就完成了,可以看出,虚拟层分为应用和驱动两个部分的,这个虚拟层需要两个部分配合才能运行的!
2017-12-23 17:57
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
zhougao @czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
驱动负责的转换需要有返回的类型的参数的指针,以便应用程序能正确接收到参数
2017-12-23 18:09
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
zhougao @czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
而如果是驱动调用系统服务函数的话,系统通过以下代码直接跳过了检查:
        PreviousMode  =  KeGetPreviousMode();
        if  (PreviousMode  !=  KernelMode)  {
。。。。。这是来自应用的调用,需要区分是64位还是32位进行处理
}
。。。。。这是处理完毕符合64位程序调用,或者是来自驱动的调用,看代码就知道如果64位系统允许加载32位驱动的话,程序就会运行到这里,没有经过转换直接运行到这里,就会有蓝屏的危险
也就是不管是什么程序调用,直接调用,如果程序位数不是同一个的话,你想会有什么后果。
2017-12-23 18:27
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
zhougao @czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
结合代码给你看看虚拟层在哪就是了!这个是64位系统下32位程序调用ZwOpenProcess的情况
上传的附件:
2017-12-23 18:47
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
这个是64位系统下64位程序调用ZwOpenProcess的情况
这和 64位系统下32位程序调用ZwOpenProcess的情况,有个明显的区别,就是32位下,先进入了虚拟层,而64位下直接SysCall了
上传的附件:
2017-12-23 18:50
0
雪    币: 216
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
czcqq 这个是64位系统下64位程序调用ZwOpenProcess的情况这和 64位系统下32位程序调用ZwOpenProcess的情况,有个明显的区别,就是32位下,先进入了虚拟层,而64位下直接Sy ...
感谢解答
2017-12-24 19:04
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
12
1、如果你说的是内核驱动,我只能说理论上可以做但完全没有任何意义(成本远大于收益)
2、如果包括用户层驱动,那么已经有了(nvd3dum.dll就是用户模式驱动)
2017-12-25 09:02
0
雪    币: 1036
活跃值: (1311)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
13
因为64位系统有wow64  子系统来兼容32位进程运行的。
例:32位程序调用一个OpenProcess
OpenProcess  ->  ntdll32.ZwOpenProcess  ->  wow64cpu.Wow64Jump(jmp  0033:xxxxxxxxx)  ->  wow64cpu.SystemServicesEx  ->  ntdll64.ZwOpenProcess  ->  syscall  ->  到内核了。

而32位的驱动,没东西去跑啊?如果64位即兼容32位程序又兼容32位驱动,那还要32位的系统干嘛?   
64位系统能兼容32位程序都已经是个意外了。
2017-12-25 09:25
0
雪    币: 9
活跃值: (180)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
精彩,64位CPU的兼容模式,wow6子系统
2018-7-26 23:05
0
雪    币: 0
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
StriveXjun 因为64位系统有wow64 子系统来兼容32位进程运行的。 例:32位程序调用一个OpenProcess OpenProcess -> ntdll32.ZwOpenProcess -> ...
请问您这个函数调用路径是怎么看到的,谢谢!
2022-1-2 16:07
0
雪    币: 3310
活跃值: (3908)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
64位系统内核层一句32位的代码都没有
2022-1-4 00:33
0
游客
登录 | 注册 方可回帖
返回
//