修改IOAPIC重定位键盘中断处理函数

  IOAPIC重定位表就是各种硬件中断与对应的中断处理函数的映射关系,把其中的中断处理函数修改为我们自己的就完成了对IOAPIChook了,那么首先我们应该了解IOAPIC的结构和运作原理:

  IOAPIC实际上是一种新型的可编程硬件,大家都知道操作硬件一般是通过读写寄存器来实现的,对于IOAPIC也不例外,所以我们可以通过访问特定的寄存器来控制IOAPIC的行为。那么该访问那些寄存器呢?对这些寄存器进行怎样的读写操作会达到修改IOAPIC的效果呢?还有,IOAPIC内部的数据结构是怎样组织的呢?原来,访问IOAPIC一般需要两个寄存器,一个叫做寄存器选择寄存器,顾名思义,就是用来选择一个寄存器的,那么用它来选择一个什么样的寄存器就能访问到我们需要访问的数据了呢?试想我们是不是要获取对IOAPIC关于键盘中断的hook,所以我们要找到关于键盘中断IRQ1与其中断处理例程关联的地方,而在IOAPIC中,这种关系是以表项的形式存放的,每个表项的读写需要两个寄存器来完成。我们使用的第一个寄存器就是用来选择IRQ1这个表项的,而第二个寄存器则是用来读写表项的内容,也就是中断号(中断号在IDT中映射到相应的中断函数)。但这些都是在我们找到了IOAPIC的首地址后进行的操作,怎样找到IOAPIC的首地址呢?IOAPIC的物理地址为0xfec00000,将其映射为虚拟内存地址便可以访问了。其中选择寄存器的偏移为0,窗口寄存器的偏移为0x10,选择好IRQ1的偏移,就可以在窗口寄存器中读出中断号了,然后将其复制到一个空闲表项,重新填写中断处理函数入口地址即可。

具体步骤如下:

  第一步:将IOAPIC的物理地址映射为虚拟地址以便访问

  第二步:将寄存器定位到相应虚拟地址处,选择寄存器组的起始地址为0,窗口寄存器组的起始地址为0x10,然后设置选择寄存的内容,使得选择寄存器选择了IRQ1,即窗口寄    存器可以读出IRQ1的中断号

 

  第三步:在IDT中找到一个空闲的表项

  第四步:将IDT复制到新的空闲表项中去,为新的表项设置入口

  第五步:重新定位中断号

posted @ 2012-10-11 16:49  SecurePing  阅读(724)  评论(0编辑  收藏  举报