驱动编程学习5/IA-32e模式

文章目录

  • IA-32e模式
    • 基础介绍
    • 段描述符
  • 权限切换
    • x64用户态切换权限
    • x86用户态切换权限
    • 总结

IA-32e模式

基础介绍

  • 内核64位,用户64位或32位(内核均为64位代码)
  • IA32_EFER MSR C0000080H 中的值的第8位为1时,系统处于IA-32模式。
  • 在Intel手册上IA32_EFER MSR寄存器构造如下图所示,第8位的含义为IA-32e模式的启动标志位。
    驱动编程学习5/IA-32e模式_第1张图片
    在WinDbg中查看IA32_EFER标志位的命令如下:
rdmsr c0000080

在本机的查询结果如下图所示:
驱动编程学习5/IA-32e模式_第2张图片
可见第8位(从0位开始算)为1,系统处于IA-32e模式。

段描述符

  • 代码段,数据段仍使用64位描述符。
  • 段描述符中L标志置为1时为64位模式。(DS段没有该项判断)
  • 段结构如下图所示。
    驱动编程学习5/IA-32e模式_第3张图片
  • 在windbg中使用dq gdtr指令查看段寄存器内容
  • 观察到段寄存器3中为CS寄存器,且L位置1,为ring0下64位代码段。
    驱动编程学习5/IA-32e模式_第4张图片
  • TSS段描述符扩展到128位
  • IDT为中断门描述符,扩展到128位
  • FS在Ring3权限32位程序中指向TEB
  • GS在Ring3权限64位程序中指向TEB,内核中指向KPCR

权限切换

中断:内核中只是用一张IDT表,内核可根据栈上保存的CS判断模式。
系统调用:只是用一张SSDT表,系统服务为64位

x64用户态切换权限

例:Win10 1903中64位Notepad.exe的NtOpenProcess调用过程

1.在Win10虚拟机中打开64位Notepad.exe(记事本),然后打开x64dbg软件附加上该进程(x64dbg是不能附加32位程序的,x32dbg反之同理),如下图所示
驱动编程学习5/IA-32e模式_第5张图片
2.按下Crtl+G组合,在弹出的输入框中输入NtOpenProcess,如下图所示
驱动编程学习5/IA-32e模式_第6张图片
3.点击确定跳转到该函数,可以清楚的看到有一句syscall的指令,这就是64位程序进入内核的方式。
在这里插入图片描述

x86用户态切换权限

  • x86用户程序在ring3转入x64模式,然后再进入内核
    例:Win10 1903中32位Notepad.exe的NtOpenProcess调用过程

1.我在WinXp里面复制了一份32位的Notepad.exe,然后放入Win10的虚拟机中,图标如下
在这里插入图片描述
2.打开32位的Notepad.exe,然后打开x32dbg附加上该程序,之后转入NtOpenProcess中,步骤同上文
在这里插入图片描述
3.可以看到该程序在调用ntdll内核文件,进去看一下,发现该函数调用了一个转为64位的函数
在这里插入图片描述
4.再进入该函数中,发现是一句远跳转指令,跳转到下面的语句中,但是段选择子变为33(当前段选择子为23)
驱动编程学习5/IA-32e模式_第7张图片
5.在此处下断点的话再进行单步调试会跳转到如下图奇妙深刻的地方,完全与预期不符,x32dbg无法再进行调试,而该程序为32位程序,x64dbg不能调试32位程序
在这里插入图片描述
6.此时记录下刚才jmp far指令的地址,进入WinDbg中,输入!process 0 0 notepad.exe,显示当前名称为notepad.exe的进程,其中Peb为8位的是32位程序
驱动编程学习5/IA-32e模式_第8张图片
7.使用.process /i 进程地址 附加至该进程上进行调试。
在这里插入图片描述
8.使用bp指令在刚才的远跳转指令处下断点。
在这里插入图片描述
9.打开反汇编窗口,然后按下F5运行,触发断点时状态如下,可以看到现在还是32位状态
驱动编程学习5/IA-32e模式_第9张图片
10.按下F8键单步调试,很明显的看到程序转为64位状态。
驱动编程学习5/IA-32e模式_第10张图片
11.经过一系列耐心的单步调试,我找到了该程序进入内核的syscall语句的地址。由此可见32位程序先通过jmp far 33:地址,转入64位模式,再使用syscall进入内核的。
驱动编程学习5/IA-32e模式_第11张图片

总结

32位程序可以通过修改段选择子将系统状态调为64位模式,然后调用64位寄存器,在此之前寄存器都是写在64位寄存器中,那么我们也可以通过这种方式在系统没用到的寄存器中隐藏自己的数据

你可能感兴趣的:(Windows内核驱动编程,内核,windbg,调试器)