64位操作系统下的32位程序
32位系统内核时32位的,64位系统内核时64位的,32位有32位的指令集,64位有64位的指令集,CUP是怎么区分自己执行的是哪个指令集
32位操作系统下进入内核的指令是sysenter,64位系统下64位进程进入内核的指令时syscall,那么64位系统下32位进程该执行什么指令呢?
观察64位系统下的32位进程ntdll.zwclose ,发现它call了一个地址
跟进去看一下
F7跟进
可以发现现在处于wow64upc模块中
这里需要使用特殊版本的调试器Yzdbg ,F7跟进
发现一堆乱七八糟的代码
切换锁定x64模式
代码变成了jmp qword ptr ds:[r15+0x000000F8] 也就是说此时UPC执行的汇编指令集切换成64位
这里发现CS被改变了,也就是说 jmp far 0x0033 : 0x77C87009 指令执行后改变了CS 。
前面提到过CS,SS会影响权限 ,也就是说CS可能还影响着CPU执行的指令集是64位还是32位。
接着F7跟进函数
到这里看到了syscall ,syscall是64位进入内核的指令,
64位系统下32位进程进入内核流程
应用层执行32位代码-----调用API—进入32位ntdll----跳到中转层wow64Transition,修改CS段寄存器将32位环境切换到64位并且保存32位环境的上下文--------通过调用syscall进入内核。
在32位进程调用系统调用时,它会通过 wow64Transition 函数进入 wow64cpu.dll。 wow64cpu.dll 是 WOW64 子系统的一部分,它负责处理32位进程和64位内核之间的系统调用转换和交互。
系统调用传递给64位内核:
wow64cpu.dll 将转换后的64位系统调用传递给64位内核进行处理。
64位内核处理系统调用:
64位内核处理完系统调用后,将结果返回给 wow64cpu.dll。
结果传递给32位进程:
wow64cpu.dll 将64位内核返回的结果转换为32位格式,并将结果返回给32位进程。
继续执行32位进程:
32位进程收到系统调用的结果后,继续执行,并根据结果进行相应的操作。
通过这个流程,32位进程能够在64位系统上运行,并且能够与64位内核进行交互,从而实现了系统调用的处理。