idt是中断描述表,idt表包含了三种描述符:任务门,中断门,以及陷阱门
本文是通过修改idt表中的0x20号中断,增加了自己的中断门
每一个idt表项中的 前2个字节+后2个字节(Offset31..16+Offset15..0=EIP)这个地址是当权限符合以后跳转到这个地址执行。
权限符合:
这里举一个例子 : mov eax, dword ptr ds : [0x8003f500]
(1.找出选择子->2.查找IDT或者GDT表->3.找出描述符->4.根据描述符里的属性加载)
如果符合就运行这行汇编代码
当前可以看见中20号中断的地址为空
我们可以在8003f500插入自己构造的中断门,0040ee00`0008100f ,前两个字节+后两个字节=EIP(0040100f)也就是下面IdtEntry这个函数的地址 ee00`0008则是属性位,当权限符合后跳转到这个函数
#include "stdafx.h" #includeDWORD g_tmp = 0; //declspec(naked)是编译器直接拿来用的汇编函数代码,所以一定要记得在开始的时候保存上下文标志位(压栈),在结束的时候要记得恢复上下文(出栈)。并且在结尾要加上ret命令 void __declspec(naked) IdtEntry() { __asm { mov eax, dword ptr ds : [0x8003f500] mov g_tmp, eax iretd } } void go() { __asm int 0x20; } int main() { if ((DWORD)IdtEntry != 0x40100f) { printf("wrong addr:%p", IdtEntry); getchar(); } go(); printf("%pn", IdtEntry); printf("%pn",g_tmp); getchar(); return 0; }
把高地址的内容打印出来:
如有不足的地方,请予以指正



