#include<stdio.h>
#include<Windows.h>
DWORD STACK[50] = { 0 };
DWORD TSS[]=
{
0x00000000,//前一个TSS段选择子
0x83f2ccb0,//esp0
0x00000010,//ss0
0x00000000,//esp1
0x00000000,//ss1
0x00000000,//esp2
0x00000000,//ss2
0x00000000,//CR3--TSS[7]
0x00000000,//eip--TSS[8]
0x00000002,//eflags
0x11111111,//eax
0x22222222,//ecx
0x33333333,//edx
0x44444444,//ebx
(DWORD)(STACK+0x11),//esp
0x00000000,//ebp
0x55555555,//esi
0x66666666,//edi
0x00000023,//es
0x0000001b,//cs
0x00000023,//ss
0x00000023,//ds
0x0000003b,//fs
0x00000000,//gs
0x00000000,//ldt
0x20ac0000,//iomap
};
void _declspec(naked) ring3()
{
__asm
{
xor eax, eax;
mov ax, fs;
push eax;
mov ax, cs;
push eax;
mov ax, ss;
push eax;
pushfd;
mov eax, esp;
push eax;
int 34;
mov bx, 0x1b;
mov fs, bx;
iretd;
}
}
void _declspec(naked) ring0()
{
__asm
{
pushfd;
pop ecx;
lea edi, dword ptr[STACK];
mov dword ptr[edi], ecx;//efalgs
mov eax, dword ptr[esp];
mov dword ptr[edi + 0x8], eax;//eip
mov eax, dword ptr[esp + 0x4];
mov dword ptr[edi + 0xc], eax;//cs
mov eax, dword ptr[esp + 0x8];
mov dword ptr[edi + 0x10], eax;//eflags
mov eax, dword ptr[esp + 0xc];
mov dword ptr[edi + 0x14], eax;//esp
mov eax, dword ptr[esp + 0x10];
mov dword ptr[edi + 0x18], eax;//ss
xor eax, eax;
mov ax, cs;
mov dword ptr[edi + 0x20], eax;
mov ax, ss;
mov dword ptr[edi + 0x24], eax;
mov ax, fs;
mov dword ptr[edi + 0x28], eax;
mov bx, 0x30;
mov fs, bx;
mov eax, dword ptr fs : [0x40];
mov edx, cr3;
mov dword ptr[eax + 0x1c], edx;//存储CR3到原TSS中
iretd;
}
}
int main()
{
memset(STACK, 0xcc, sizeof(DWORD) * 50);
DWORD EIP = (DWORD)ring3;
TSS[8] = EIP;
printf("中断例程=%p\n", ring0);
printf("请输入CR3:\n");
scanf("%x", &TSS[7]);
printf("TSS=%p\n请设置好TSS的段描述符以及中断门描述符!\n", (VOID*)TSS);
system("pause");
char buff[6];
*((DWORD*)&buff[0]) = 0x0;
*((WORD*)&buff[4]) = 0x0093;
__asm
{
int 3;
call fword ptr[buff];
int 3;
xor eax, eax;
mov ax, 0x3b;
mov fs, ax;
}
for (int i = 0; i < 18; ++i)
{
printf("%X\n", STACK[i]);
}
system("pause");
return 0;
}