任务门的类型为 :5
低4字节的高16位是一个TSS段描述符的选择子
思考:已经有任务段了,为什么还提供了任务门????
实验: 通过任务门去访问任务段
构造TSS描述符写入GDT表中
构造 任务门描述符 写入idt表中 eq 8003f500 0000e500`00480000
// tssss.cpp : Defines the entry point for the console application.
//
//
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
DWORD iTSS[26];
DWORD ESP0[0x1000];
DWORD ESP3[0x1000];
DWORD dwESP;
DWORD dwCS;
DWORD dwCR3;
char PrevTr[6]={0};
_declspec(naked) void Call(){
_asm{
pushfd
push fs
int 3
pop fs
popfd
iret
}
}
int main(int argc, char* argv[])
{
__asm{
push ax
str ax
lea ebx,PrevTr
mov [ebx+4],ax
pop ax
}
printf("tr=%x\n",*(PrevTr+4));
memset(iTSS,0,sizeof(iTSS));
memset(ESP0,0,sizeof(ESP0));
memset(ESP3,0,sizeof(ESP3));
dwESP = 0;
dwCS = 0;
dwCR3 = 0;
iTSS[1] = (DWORD)(ESP0+0x900); // ESP
iTSS[2] = 0x10; // SS0
iTSS[8] = (DWORD)Call; // EIP
iTSS[14] = (DWORD)(ESP3+0x900); // ESP3
iTSS[18] = 0x23; // ES
iTSS[19] = 0x08; // CS
iTSS[20] = 0x10; // SS
iTSS[21] = 0x23; // DS
iTSS[22] = 0x30; // FS
printf("iTSS:%x ESP3:%x ESP0:%x\n",iTSS,(ESP3+0x900),(ESP0+0x900));
printf("input cr3:");
scanf("%x",&dwCR3);
iTSS[7] = dwCR3; // cr3
__asm{
int 0x20
}
printf("ESP:%x CS:%x\n",dwESP,dwCS);
getchar();
return 0;
}