IOAPIC重定位中断处理函数思路整理
因为小可并非硬件编程出身,汇编基础又比较差。。。所以刚开始理解利用IOAPIC重定位技术的时候相当困难。
何为IOAPIC?
首先,必须认识到它是一个硬件,可编程的硬件。我理解的它在整个流程中的作用如图:
首先,必须创建一个新的中断项,也就是在IDT表中搜索到一个空闲的项,代码如下
P2C_U8 p2cGetIdleIdtVec()
{
P2C_U8 i;
PP2C_IDTENTRY idt_addr = (PP2C_IDTENTRY)p2cGetIdt(); // 从vec20搜索到2a即可。
for(i=0x20;i<0x2a;i++)
{
// 如果类型为0说明是空闲位置,返回即可。
if(idt_addr[i].type == )
{
return i;
}
}
return ;
}
复制中断表中索引为0x93的项到新项
P2C_U8 p2cCopyANewIdt93(P2C_U8 id,void *interrupt_proc)
{
// 我们写入一个新的中断门。这个门完全拷贝原来的0x93
// 上的idtentry,只是中断处理函数的地址不同。
PP2C_IDTENTRY idt_addr = (PP2C_IDTENTRY)p2cGetIdt();
idt_addr[id] = idt_addr[0x93];
idt_addr[id].offset_low = P2C_LOW16_OF_32(interrupt_proc);
idt_addr[id].offset_high = P2C_HIGH16_OF_32(interrupt_proc);
return id;
}
然后将ioapic重定位表中关于键盘中断IRQ1的处理地址替换掉,修改ioapic重定位表需要使用两个寄存器。
一个是IOREGSEL寄存器(只低8位有用) 一个是IOWIN寄存器(32位)
首先在IOREGSEL寄存器指定要访问的ioapic寄存器的编号,然后修改IOWIN寄存器中的内容即可达到目的
Windows把这两个寄存器分别映射到内存的物理地址0xFEC00000和0xFEC00010处
获取IOREGSEL寄存器的代码为
P2C_U8 *io_reg_sel;
PHYSICAL_ADDRESS phys ;
PVOID paddr;
RtlZeroMemory(&phys,sizeof(PHYSICAL_ADDRESS));
phys.u.LowPart = 0xfec00000;
paddr = MmMapIoSpace(phys, 0x14, MmNonCached);
IOWIN寄存器往后偏移0x10
P2C_U32 *io_win;
io_win = (P2C_U32 *)((P2C_U8 *)(paddr) + 0x10);
然后使用IOREGSEL寄存器选择第0x12项,为IRQ1的项
*io_reg_sel = 0x12;
设置新的中断号
ch1 = *io_win;
ch1 &= 0xffffff00;
ch1 |= (P2C_U32)new_ch;
*io_win = ch1;
完成!
IOAPIC重定位中断处理函数思路整理的更多相关文章
- Linux pwn入门教程(10)——针对函数重定位流程的几种攻击
作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...
- ARM ELF函数重定位
ARM ELF的函数重定位与x86是一致的,但由于汇编指令不同,再鼓捣一遍. 示例代码: #include <stdio.h> #include <stdlib.h> int ...
- IDT HOOK思路整理
IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...
- CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)
Linux Pwn入门教程系列分享已接近尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/a ...
- 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..
https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...
- PE文件结构详解(六)重定位
前面两篇 PE文件结构详解(四)PE导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的: 在这里 ...
- 关于C++中的重定位
"标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入.处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出.标准库还 ...
- tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一 ...
- tiny4412 裸机程序 七、重定位代码到DRAM【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...
随机推荐
- js简单 图片版时钟,带翻转效果
js简单 图片版时钟,带翻转效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- 分布式之ZookeeperMac安装
Zookeeper用于分布式计算中的协调员,观察员,观察者,分布式锁,在系统中利用Zookeeper来处理事件通知,队列,锁等功能. 使用brew安装 zookeeper. 可参考:http://bl ...
- mysql 数据库连接超时的问题 autoReconnect=true
最近在使用spring-jdbc数据库连接管理时,出现一个奇怪问题,当天部署运行没问题,第二天再试就报以下异常问题 org.springframework.dao.RecoverableDataAcc ...
- 如何配置pch文件
pre-Compile Header(预编译头文件) pre-Compile Header简称PCH,由编译器在建立工程时自动生成; 其中存放有工程中已经编译的部分代码; 在以后建立工程时不再重新编译 ...
- 同个项目写webservice引用EF出现的问题
错误1: 定的架构无效.错误: DataModel.ssdl(2,2) : 错误 0152: 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供 ...
- iOS-语法syntax
成员变量语法 定义的是外部可见的属性 #import <Foundation/Foundation.h> @interface People : NSObject @property (n ...
- php gzcompress() 和gzuncompress()函数实现字符串压缩
当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的. PHP提供了 gzcompress() 和gzuncompress() 函数: $string = “Lorem ipsum do ...
- iOS开发学习笔记
1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...
- resin实现热部署配置
修改resin.xml文件 <host id="test.com" root-directory="."> <host-alias>te ...
- swift 单独部署,开发
部署环境 virtualBox Ubuntu 14.04 desktop OpenStack Swift (kilo) 说明 此文档为基于官方修改的只针对Ubuntu 14.04,完整的参阅官方文档 ...