能力值:
( LV7,RANK:110 )
|
-
-
2 楼
主要是,指针长度,寄存器,参数传递方式,以及一部分指令的不同。指针长度不同,导致数据结构大小的不同!参数传递方式导致参数无法正确的传递!32位应用程序一般可以运行在64位系统中,那是因为系统利用CPU的32位模式做了虚拟一个X86环境的工作,这个环境欺骗了32位应用,使得32位应用程序可以运行在64位系统中。而驱动就没有这个虚拟工作,直接运行在X64模式下,这个时候X86的32位驱动当然就不能运行在X64的驱动环境下啦!
|
能力值:
( LV7,RANK:110 )
|
-
-
3 楼
其实32位程序在64位系统中运行的情况是这样的:32位程序->虚拟层->系统->硬件执行命令 其实而驱动中的情况是这样的:驱动程序->系统->硬件 或者是:驱动程序->硬件。 这样可以解答你的疑问了吧! 因为驱动没有虚拟层来负责转换,所以32位的驱动是不能在64位的驱动环境下执行的
|
能力值:
( LV7,RANK:110 )
|
-
-
4 楼
你也可以自己开发驱动虚拟层,不过这样的话,你相当于重写了整个WINDOWS了,太不划算了
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
czcqq
你也可以自己开发驱动虚拟层,不过这样的话,你相当于重写了整个WINDOWS了,太不划算了
@czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
|
能力值:
( 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位程序 这样,一个处理流程就完成了,可以看出,虚拟层分为应用和驱动两个部分的,这个虚拟层需要两个部分配合才能运行的!
|
能力值:
( LV7,RANK:110 )
|
-
-
7 楼
zhougao
@czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
驱动负责的转换需要有返回的类型的参数的指针,以便应用程序能正确接收到参数
|
能力值:
( LV7,RANK:110 )
|
-
-
8 楼
zhougao
@czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
而如果是驱动调用系统服务函数的话,系统通过以下代码直接跳过了检查: PreviousMode = KeGetPreviousMode(); if (PreviousMode != KernelMode) { 。。。。。这是来自应用的调用,需要区分是64位还是32位进行处理 } 。。。。。这是处理完毕符合64位程序调用,或者是来自驱动的调用,看代码就知道如果64位系统允许加载32位驱动的话,程序就会运行到这里,没有经过转换直接运行到这里,就会有蓝屏的危险 也就是不管是什么程序调用,直接调用,如果程序位数不是同一个的话,你想会有什么后果。
|
能力值:
( LV7,RANK:110 )
|
-
-
9 楼
zhougao
@czcqq, 感谢你的回答, 这个虚拟层 是内核的吗, 反编译调试一个32位程序时, 好像没发现这个, 调用api时 直接走了 fastsyscall了,是转到内核时由虚拟层接手的吗。
结合代码给你看看虚拟层在哪就是了!这个是64位系统下32位程序调用ZwOpenProcess的情况
|
能力值:
( LV7,RANK:110 )
|
-
-
10 楼
这个是64位系统下64位程序调用ZwOpenProcess的情况 这和
64位系统下32位程序调用ZwOpenProcess的情况,有个明显的区别,就是32位下,先进入了虚拟层,而64位下直接SysCall了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
czcqq
这个是64位系统下64位程序调用ZwOpenProcess的情况这和
64位系统下32位程序调用ZwOpenProcess的情况,有个明显的区别,就是32位下,先进入了虚拟层,而64位下直接Sy ...
感谢解答
|
能力值:
( LV9,RANK:280 )
|
-
-
12 楼
1、如果你说的是内核驱动,我只能说理论上可以做但完全没有任何意义(成本远大于收益) 2、如果包括用户层驱动,那么已经有了(nvd3dum.dll就是用户模式驱动)
|
能力值:
( 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位程序都已经是个意外了。
|
能力值:
( LV6,RANK:90 )
|
-
-
14 楼
精彩,64位CPU的兼容模式,wow6子系统
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
StriveXjun
因为64位系统有wow64 子系统来兼容32位进程运行的。
例:32位程序调用一个OpenProcess
OpenProcess -> ntdll32.ZwOpenProcess -> ...
请问您这个函数调用路径是怎么看到的,谢谢!
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
64位系统内核层一句32位的代码都没有
|
|
|