看流星社区

 找回密码
 注册账号
查看: 3587|回复: 5

什么是IDT Hook ?以及完整HOOK源码

[复制链接]

该用户从未签到

发表于 2011-8-8 08:15:10 | 显示全部楼层 |阅读模式
IDT Hook是一个非常简单的东东。这里我们不讨论IDTR,中断处理过程等东西。以后有时间补上(假如我有时间的话)。

IDT即中断描述表。当然系统发生中断时(有可能是CPU中断,也有可能是I/O中断等)。系统会通过中断向量查找IDT保存的ISR(中断服务程序)来调用相关的处理例程。IDT Hook就是替换这个ISR。

也许上面的过程你不是很明白。我们具体的了解下过程。

IDT是一个有256个入口的线性表。每个入口大小为8字节。每个入口值我们称为中断向量(0..255)。比如 int 30。30即中断向量。当发生int 30中断时,系统根据30找到IDT入口,然后计算出ISR。调用之。

我们来看看相关的结构。


typedef struct
{
unsigned short LowOffset;
unsigned short selector;
unsigned char unused_lo;
unsigned char segment_type:4;  
unsigned char system_segment_flag:1;
unsigned char DPL:2;         
unsigned char P:1;           
unsigned short HiOffset;
} IDTENTRY;
我首先要感叹下C语言的强大。

unsigned char segment_type:4;   代表这个参数占用4位。

以下都是如此。

unsigned char system_segment_flag:1;
unsigned char DPL:2;         
unsigned char P:1;     

他们一共占用了一个字节。上面的结构一种占用了8个字节。即IDT入口大小。

unsigned short LowOffset; 表示ISR地址是低字节

unsigned short HiOffset;    表示ISR地址的高字节。他们一起组成了ISR的地址。对于其他的东东我们暂时不解释。

还有一个数据结构。

typedef struct
{
unsigned short IDTLimit;
unsigned short LowIDTbase;
unsigned short HiIDTbase;
} IDTINFO;

unsigned short LowIDTbase;
unsigned short HiIDTbase; 他们共同组成了IDT线性表的地址。

这个结构用来帮助我们获取IDT的位置。

在C语言中我可以通过 _asm sidt idt_info 来得到IDT的地址。

下面我们来看看完整的代码。
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2014-1-10 16:50:38 | 显示全部楼层
11111111111

该用户从未签到

发表于 2016-11-19 16:07:24 | 显示全部楼层
不错.         

该用户从未签到

发表于 2017-2-11 14:56:18 | 显示全部楼层
谢谢分享谢谢分享谢谢分享

该用户从未签到

发表于 2019-3-28 16:02:56 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!

该用户从未签到

发表于 2021-12-28 17:00:57 | 显示全部楼层
支持下看看啦
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 22:31

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表