系统调用过程

老方法;
各种门
自陷门 int 0x2E
新方法:

1.sysenter指令

a. sysenter 被执行之后 将控制权传递给特殊模块寄存器
b.跟systenter 配合的MSRs寄存器有3个

名称 偏移 说明
SYSENTER_CS_MSR 0x174 切换到ring0 之后的cs选择器
SYSENTER_ESP_MSR 0x175 切换到ring0 之后的ESP选择器
SYSENTER_EIP_MSR 0x176 切换到ring0 之后的EIP选择器

SYSENTER 被执行时,这3个寄存器会执行以下操作
1.装载SYSENTER_CS_MSR 到CS寄存器,设置目标代码段
2.装载SYSENTER_EIP_MSR 到EIP寄存器,设置目标指令
3.装载SYSENTER_CS_MSR + 8 装载到SS寄存器,设置栈段
4.装载SYSENTER_ESP_MSR 到ESP寄存器,设置栈帧
切换RING0 ;
清除EFLAG的VM标志 ;
(注:
参考EFLAGS详解

EFLAGS主要包含:

1.状态标志(Status Flags)
2.DF标志(DF flag)
这个方向标志(位于EFLAGS寄存器的第10位)控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),清除该标志则使得串指令自动递增。STD以及CLD指令分别用于设置以及清除DF标志。
3.系统标志以及IOPL域(System Flags and IOPL Field)
EFLAGS寄存器中的这部分标志用于控制操作系统或是执行操作,它们不允许被应用程序所修改。VM就在其中:
VM(bit 17) [Virtual-8086 mode flag],置1以允许虚拟8086模式,清除则返回保护模式。

)
执行位于EIP处的RING0例程 ;

2.分析CreateFile三环到0环的调用过程

7518B5F7    FF75 F4                     PUSH DWORD PTR SS : [EBP - 0xC] 

7518B5FA    8B4D 1C                     MOV ECX, DWORD PTR SS : [EBP + 0x1C] 

7518B5FD    FF75 14                     PUSH DWORD PTR SS : [EBP + 0x14] 

7518B600    8B45 0C                     MOV EAX, DWORD PTR SS : [EBP + 0xC] 

7518B603    FF75 08                     PUSH DWORD PTR SS : [EBP + 0x8] 

7518B606    8B35 B4101775               MOV ESI, DWORD PTR DS : [<&ntdll.NtCreateFile>]; ntdll_1a.ZwCreateFile 

7518B60C    FF75 FC                     PUSH DWORD PTR SS : [EBP - 0x4] 

7518B60F    81E1 A77F0000               AND ECX, 0x7FA7 

7518B615    FF75 10                     PUSH DWORD PTR SS : [EBP + 0x10] 

7518B618    894D 1C                     MOV DWORD PTR SS : [EBP + 0x1C], ECX 

7518B61B    51                          PUSH ECX 

7518B61C    53                          PUSH EBX 

7518B61D    8D4D E0                     LEA ECX, DWORD PTR SS : [EBP - 0x20] 

7518B620    51                          PUSH ECX 

7518B621    0D 80001000                 OR EAX, 0x100080 

7518B626    8D4D 9C                     LEA ECX, DWORD PTR SS : [EBP - 0x64] 

7518B629    51                          PUSH ECX 

7518B62A    50                          PUSH EAX 

7518B62B    8945 0C                     MOV DWORD PTR SS : [EBP + 0xC], EAX 

7518B62E    8D45 F8                     LEA EAX, DWORD PTR SS : [EBP - 0x8] 

7518B631    50                          PUSH EAX 

7518B632    FFD6                        CALL ESI 

call ESI ,跳进去看看

771900A4 > B8 52000000                 MOV EAX, 0x52 

771900A9    33C9                        XOR ECX, ECX 

771900AB    8D5424 04                   LEA EDX, DWORD PTR SS : [ESP + 0x4] 

771900AF    64 : FF15 C0000000          CALL DWORD PTR FS : [0xC0] //注意这条指令

771900B6    83C4 04                     ADD ESP, 0x4 

771900B9    C2 2C00                     RETN 0x2C

跳往0环:

738A2320    EA 1E278A73 3300            JMP FAR 0033:738A271E 

738A2327    0000                        ADD BYTE PTR DS:[EAX],AL 

猜你喜欢

转载自blog.csdn.net/richard1230/article/details/79749933