因为小可并非硬件编程出身,汇编基础又比较差。。。所以刚开始理解利用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重定位中断处理函数思路整理的更多相关文章

  1. Linux pwn入门教程(10)——针对函数重定位流程的几种攻击

    作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...

  2. ARM ELF函数重定位

    ARM ELF的函数重定位与x86是一致的,但由于汇编指令不同,再鼓捣一遍. 示例代码: #include <stdio.h> #include <stdlib.h> int ...

  3. IDT HOOK思路整理

    IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...

  4. CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)

    Linux Pwn入门教程系列分享已接近尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/a ...

  5. 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..

    https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...

  6. PE文件结构详解(六)重定位

    前面两篇 PE文件结构详解(四)PE导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的: 在这里 ...

  7. 关于C++中的重定位

    "标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入.处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出.标准库还 ...

  8. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  9. tiny4412 裸机程序 七、重定位代码到DRAM【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...

随机推荐

  1. iOS之滑动隐藏导航

    滑动隐藏导航狼栏 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGFloat offsetY = scrollView.content ...

  2. VC++6.0 Win32 C2065:SM_XVIRTUALSCREEN

    百度了了一大堆,都说让重装vc++6.0,然而并没有什么卵用. 解决办法:找到你的vc6.0安装路径下的WINDOWS.H,将0x0400改为0x0500 Window各个版本对应的宏值WINVER:

  3. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  4. 【Java远程debug】

    转自 http://blog.csdn.net/hongchangfirst/article/details/44191925 一.远程debug原理 Java远程调试的原理是两个JVM之间通过deb ...

  5. Dump类型说明

    通过使用windbg提供DbgHelp库中的MiniDumpWriteDump函数在程序崩溃时写dump文件记录程序当时状态,为后续分析问题提供现场. 该函数提供了DumpType参数,让程序员根据具 ...

  6. 用python DIY一个图片转pdf工具并打包成exe

    最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用python自己DIY一下: 这里主要用了reportlab.开始打算随便写几行,结果为若干坑纠结了挺久,于 ...

  7. Dapper完美兼容Oracle,执行存储过程,并返回结果集。

    Dapper完美兼容Oracle,执行存储过程,并返回结果集. 这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合 ...

  8. RSA密钥之C#格式与Java格式转换

    前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...

  9. 关于利用bat文件调用exe批量处理文件下的文件的问题

    for %%i in (E:\radar_20120721\sjz_sa\*.bin) do start/wait radas.exe -i=%%i -o=E:\longjiang\out 找到 文件 ...

  10. java 随机生成身份证代码

    import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.I ...