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"
#include<windows.h>
DWORD 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("%p\n", IdtEntry);
printf("%p\n",g_tmp);
getchar();
return 0;
}
把高地址的内容打印出来:
如有不足的地方,请予以指正