📄 c8253.cpp
字号:
// C8253.cpp : Defines the entry point for the console application.
//
/*********************************\
*文件:C8253.CPP *
*功能:演示直接写IO *
\*********************************/
#include "stdafx.h"
#include <windows.h>
WORD Count;
int main(int argc, char* argv[])
{
Count = 0x1800;
__asm jmp Begin
__asm
{
Change8253:
mov al,0x36
out 0x43,al
mov ax,Count
out 0x40,al
mov al,ah
out 0x40,al
retf
}
__asm
{
ToRing0Code:
push ebp
mov ebp,esp
sub esp,8
call GetLdtAddress //取出LDT的地址,返回结果在eax中
mov ecx,[eax] //保存LDT第一个描述符
mov [ebp-4],ecx
mov ecx,[eax+4]
mov [ebp-8],ecx
mov edx,[ebp+8] //把调用门的内容写入LDT
mov [eax],dx //偏移量的低16位
mov word ptr [eax+2],28h //段选择子
mov word ptr [eax+4],0ec00h //属性
shr edx,16 //偏移量的高16位
mov [eax+6],dx
push eax
// CALL32 7,0 //调用 Ring0 子程序
_emit 0x9a
_emit 0
_emit 0
_emit 0
_emit 0
_emit 7
_emit 0
pop ebx
mov edx,[ebp-4] //恢复LDT第一个描述符
mov [ebx],edx
mov edx,[ebp-8]
mov [ebx+4],edx
leave
ret 4
GetLdtAddress:
push ebx //先要取GDT的地址
sgdt [esp-2]
pop ebx
sldt ax //取LDT内容
and eax,0fff8H // 屏蔽掉低3位、eax的高16位清0
add ebx,eax //算出LDT描述符的位置
mov eax,[ebx+2] //从描述符中取出LDT的地址
mov dl,[ebx+7]
shl edx,24
and eax,0ffffffh
or eax,edx
ret
}
__asm
{
Begin:
pushad
push offset Change8253
call ToRing0Code
popad
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -