找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 1005|回复: 7

《WIN64驱动教程》补充[19]:IDT HOOK的实现

[复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2014-8-27 20:53:57 | 显示全部楼层 |阅读模式
作者:Tesla.Angela

IDT是中断描述符表,它跟SSDT类似,记录了256个中断处理程序(函数)的地址。要HOOK的话,修改记录的地址即可。不过IDT的结构比起SSDT复杂得多,比起HOOK SSDT的难度,有一个好的方面和一个坏的方面。好的方面是,IDT记录的是绝对地址而非偏移地址;坏的方面是,这个地址被拆分成了2部分(WIN32)或3部分(WIN64)。
  1. typedef struct           //32位结构体
  2. {
  3.         WORD LowOffset;      <-中断处理程序的低16位
  4.         WORD Selector;
  5.         BYTE unused_lo;
  6.         UCHAR unusaed_hi:5;
  7.         UCHAR DPL:2;
  8.         UCHAR P:1;
  9.         WORD HiOffset;       <-中断处理程序的高16位
  10. } IDTENTRY32;
  11. typedef struct           //64位结构体
  12. {
  13.         USHORT OffsetLow;    <-中断处理程序的低16位
  14.         USHORT Selector;     <-选择子
  15.         USHORT BitInfo;      <-位信息
  16.         USHORT OffsetMiddle; <-中断处理程序的中16位
  17.         ULONG  OffsetHigh;   <-中断处理程序的高32位
  18.         ULONG  Reserved1;
  19. } IDTENTRY64;
复制代码

要HOOK的话,只要把代理函数的地址拆分开N部分,再填入结构体的对应位置即可。此外,HOOK IDT还有好几个需要注意的地方。1.SSDT是系统级的,IDT是CPU级的,一个CPU核心就有一个IDT,即使是逻辑CPU核心(比如利用INTEL超线程技术“分身”出来的CPU核心)。2.要HOOK IDT的话,必须把所有CPU的的IDT都改了才行。网上的代码都是针对“单核CPU+XP系统”写的,早已过时。代码里有一份“在指定CPU核心执行代码”的模板。3.获得IDT的基址,32位驱动可以直接通过内嵌SIDT指令取出,64位驱动因为内嵌ASM不方便,我是用__readmsr读取0xC0000101寄存器,取出KPCR,再直接读取KPCR中的IDT基址。4.在WIN64系统上,IDT也是被PATCHGUARD保护的,想在IDT上做歪点子的可以及时打住了。
游客,如果您要查看本帖隐藏内容请回复

1

主题

77

回帖

0

精华

铂金会员

积分
1972
发表于 2014-8-27 21:59:08 | 显示全部楼层
好东东。{:soso_e199:}

0

主题

37

回帖

0

精华

铜牌会员

积分
61
发表于 2024-1-2 20:07:48 | 显示全部楼层
学习了

0

主题

47

回帖

0

精华

贵宾会员

积分
89
发表于 2024-1-26 22:41:37 | 显示全部楼层
2024补充学习

0

主题

31

回帖

0

精华

贵宾会员

积分
19
发表于 2024-3-15 12:16:56 | 显示全部楼层
学习一下,谢谢楼主

0

主题

45

回帖

0

精华

铜牌会员

积分
53
发表于 2024-3-29 11:35:57 | 显示全部楼层
学习一下

3

主题

122

回帖

0

精华

铜牌会员

积分
291
发表于 2024-6-1 02:38:10 | 显示全部楼层
学习一下

0

主题

92

回帖

0

精华

铜牌会员

积分
111
发表于 2025-1-26 09:55:58 | 显示全部楼层
好好学习一下
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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