一、回顾

上次课我们学习了3环进0环的两种方式,分别是中断门和快速调用,如果CPU支持快速调用,那么_KUSER_SHARED_DATA 结构体的 SystemCall 属性指向的函数是 KiFastSystemCall;如果不支持,那么SystemCall 指向的函数是KiIntSystemCall。

执行 KiFastSystemCall,则使用快速调用的方式进0环;
执行 KiIntSystemCall,则使用中断门的方式进0环。

共同点是都要给0环提供新的CS,SS,EIP,ESP,只是提供的方式不同。中断门的CS,EIP从IDT表里获取,SS,ESP从TSS表里获取;快速调用的CS,EIP,ESP从MSR寄存器获取,SS是CS+8计算得到,至于MSR寄存器里的值,则是系统启动时就已经填好。

所以快速调用比中断门快就快在,快速调用不需要访问内存,而中断门需要读TSS和IDT表。

这节课,我们来详细分析 INT 2E 和 sysenter 做了哪些工作。

二、分析 INT 0x2E

KiIntSystemCall 触发了 2E 中断。用windbg看看2E号中断的中断门描述符,2E 右移3位(或者乘8)得到 0x170,加上 r idtr获取的IDT基址,可以计算出 2E号中断对应的描述符:8053ee00`0008e481

kd> r idtr
idtr=8003f400
kd> dq 8003f400+170
8003f570  8053ee00`0008e481 80548e00`00081780

拆分中断门描述符,可以得到新的CS是0008(系统代码段),EIP是 8053e481,这个是内核模块的 KiSystemService 函数。

kd> u 8053e481
nt!KiSystemService:
8053e481 6a00            push    0
8053e483 55              push    ebp
8053e484 53              push    ebx
8053e485 56              push    esi
8053e486 57              push    edi
8053e487 0fa0            push    fs
8053e489 bb30000000      mov     ebx,30h
8053e48e 668ee3          mov     fs,bx

接下来查看 TSS 表,首先看看tr寄存器的值,是0x28,然后看看TSS描述符:

kd> dq 8003f000
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffb00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab

TSS描述符是 80008b04`200020ab

所以TSS的地址就是 80042000,dd看一下:

kd> dd 80042000
80042000  0c458b24 8054acf0 8b080010 758b0855

所以ESP0 = 8054acf0, SS0 = 0010。

三、分析 sysenter

sysenter 是从 MSR 寄存器里读取 CS0,ESP0,EIP0,而SS0是通过CS0+8计算得来。我们可以用 rdmsr 指令在windbg里查看 MSR 寄存器,也可以用 wrmsr 修改MSR寄存器。

MSR 地址
IA32_SYSENTER_CS 174H
IA32_SYSENTER_ESP 175H
IA32_SYSENTER_EIP 176H

查看 CS,ESP,EIP

kd> rdmsr 174
msr[174] = 00000000`00000008
kd> rdmsr 175
msr[175] = 00000000`f8ac2000
kd> rdmsr 176
msr[176] = 00000000`8053e540

其中,EIP是 KiFastCallEntry 函数:

kd> u 8053e540
nt!KiFastCallEntry:
8053e540 b923000000      mov     ecx,23h
8053e545 6a30            push    30h
8053e547 0fa1            pop     fs
8053e549 8ed9            mov     ds,cx
8053e54b 8ec1            mov     es,cx
8053e54d 8b0d40f0dfff    mov     ecx,dword ptr ds:[0FFDFF040h]
8053e553 8b6104          mov     esp,dword ptr [ecx+4]
8053e556 6a23            push    23h

四、总结

API通过中断门进0环:

1)  固定中断号为0x2E
2)  CS/EIP由门描述符提供   ESP/SS由TSS提供
3)  进入0环后执行的内核函数:NT!KiSystemService

API通过sysenter指令进0环:

1)  CS/ESP/EIP由MSR寄存器提供(SS是算出来的)
2)  进入0环后执行的内核函数:NT!KiFastCallEntry

int 0x2e 和 sysenter 指令进0环后,分别调用了两个函数 KiSystemService 和 KiFastCallEntry。

下一篇博客,我将逆向分析 KiSystemService 和 KiFastCallEntry 这两个函数。

(46)分析 INT 0x2E 和 sysenter相关推荐

  1. 取代INT 80 的sysenter/sy***it

    在 Linux 2.4 内核中,用户态 Ring3 代码请求内核态 Ring0 代码完成某些功能是通过系统调用完成的,而系统调用的是通过软中断指令(int 0x80)实现的.在 x86 保护模式中,处 ...

  2. 分析int(*p)[4] = a

    面试题:二级指针 #include <iostream>int main() {int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, ...

  3. AJPFX分析int 和integer的区别

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类. int的默认值为0,而Integer的默认值为null,即Intege ...

  4. linux中cv调用摄像头,ubuntu中opencv调用摄像头

    ubuntu中opencv调用摄像头 ubuntu中opencv调用摄像头 文章目录 一.Ubuntu中安装opencv 二.关于Linux如何开启摄像头 1.安装VMvareTools,这个是真的强 ...

  5. 【梅哥的Ring0湿润插入教程】第一课Windows内核/驱动编程概述及应用、商业驱动保护软件原理分析...

    [梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 第一课Windows内核/驱动编程概述及应用. 商业驱动保护软 ...

  6. Windows系统调用学习笔记(二)—— 3环进0环

    Windows系统调用学习笔记(二)-- 3环进0环 要点回顾 基本概念 _KUSER_SHARED_DATA 0x7FFE0300 实验:判断CPU是否支持快速调用 第一步:修改EAX=1 第二步: ...

  7. 系统调用001 API从三环进零环的过程

    文章目录 前言 逆向分析ReadProcessMemory NtReadVirtualMemory _KUSER_SHARED_DATA SystemCall 通过int 0x2E中断门进入零环 通过 ...

  8. 内核学习-系统调用上

    双机调试配置参看我的另一篇文章[原创]内核学习-双机调试环境搭建-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com,基于xp sp3系统 系统调用的学习 分析ReadProcessM ...

  9. [检测过检测] 重写 ReadProcessMemory 、WriteProcessMemory

    一.本文大纲 系统调用的两种方式:中断门和快速调用 _KUSER_SHARED_DATA 结构 使用 cpuid 指令判断当前CPU是否支持快速调用 3环进0环需要更改的4个寄存器 以 ReadPro ...

最新文章

  1. 信息系统管理工程师考前复习笔记三
  2. Java中Socket通信-客户端向服务端发送照片
  3. 三十二、教你Python制作简单的二维码
  4. ClickHouse【环境搭建 01】Linux环境单机版在线安装 Code:210.DB::NetException + Init script is already running 问题处理
  5. python如何显示时间_如何让python显示当前时间(东部)
  6. CCF NOI1013 识别三角形
  7. SQL ALTER TABLE 语句在项目中的使用
  8. python模块:array数组模块
  9. 充分统计量(Sufficient Statistics)
  10. java web 实战开发经典_java web 开发实战经典(一)
  11. 解决Unity中文显示乱码问题
  12. python opencv中文文档_OpenCV中文官方文档
  13. 高中计算机教师学期论文,高中信息技术教学论文范文
  14. 启动: Matlab启动慢
  15. 科恒khs202温控器使用说明书_WS203数字显示温控器使用说明书
  16. 探店「无聊猿」BAYC 主题餐厅:食物都很棒,口味超预期,有点小贵
  17. 计算幻术之路(二):增强现实的现实
  18. Linux下查看CPU、内存、磁盘使用情况,并计算其使用率
  19. mysql-8.0.23-winx64安装教程
  20. java中的Cookie 和 sessions

热门文章

  1. web版本 开源压测工具_标星 1.3K 的 Web 框架压测库,助你更好的选择框架
  2. Anaconda :利用Anaconda Prompt (Anaconda3)建立、设计不同python版本及对应库函数环境之详细攻略
  3. DayDayUp:今天早上看到一条朋友圈——《吃苦与穷的深刻认知》
  4. 成功解决Exception unhandled OSError cannot open resource File: F:\Program Files\Python\Python36\Lib\si
  5. js 获取 屏幕 可用高度...
  6. TCP socket编程记录(C语言)
  7. UNITY把3D模型显示在UI层级上的思路
  8. 老oj1965:polygon半平面交
  9. (转)电脑程序员才能看懂的笑话
  10. ASP.NET Repeater 头模板(HeaderTemplate)和FooterTemplate模板中查找控件