|
|
[bgcolor=#ffffff]//Hook & Unhook IDT
//俩函数,位于idtHook.cpp中。
//功能就是根据中断号Hook/Unhook IDT
struct [/bgcolor][bgcolor=#ffffff]IDT_GATE
[/bgcolor][bgcolor=#ffffff]{
[/bgcolor][bgcolor=#ffffff]unsigned [/bgcolor][bgcolor=#ffffff]OffsetLo [/bgcolor][bgcolor=#ffffff]:[/bgcolor][bgcolor=#ffffff]16[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//bits 15....0
[/bgcolor][bgcolor=#ffffff]unsigned [/bgcolor][bgcolor=#ffffff]Selector [/bgcolor][bgcolor=#ffffff]:[/bgcolor][bgcolor=#ffffff]16[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//segment selector
[/bgcolor][bgcolor=#ffffff]unsigned [/bgcolor][bgcolor=#ffffff]Reserved [/bgcolor][bgcolor=#ffffff]:[/bgcolor][bgcolor=#ffffff]13[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//bits we don't need
[/bgcolor][bgcolor=#ffffff]unsigned [/bgcolor][bgcolor=#ffffff]Dpl [/bgcolor][bgcolor=#ffffff]:[/bgcolor][bgcolor=#ffffff]2[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//descriptor privilege level
[/bgcolor][bgcolor=#ffffff]unsigned [/bgcolor][bgcolor=#ffffff]Present [/bgcolor][bgcolor=#ffffff]:[/bgcolor][bgcolor=#ffffff]1[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//segment present flag
[/bgcolor][bgcolor=#ffffff]unsigned [/bgcolor][bgcolor=#ffffff]OffsetHi [/bgcolor][bgcolor=#ffffff]:[/bgcolor][bgcolor=#ffffff]16[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//bits 32...16
[/bgcolor][bgcolor=#ffffff]};
[/bgcolor][bgcolor=#ffffff]struct [/bgcolor][bgcolor=#ffffff]IDT_INFO
[/bgcolor][bgcolor=#ffffff]{
[/bgcolor][bgcolor=#ffffff]unsigned short [/bgcolor][bgcolor=#ffffff]wReserved[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]unsigned short [/bgcolor][bgcolor=#ffffff]wLimit[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//size of the table
[/bgcolor][bgcolor=#ffffff]IDT_GATE[/bgcolor][bgcolor=#ffffff]* [/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff]; [/bgcolor][bgcolor=#ffffff]//base address of the table
[/bgcolor][bgcolor=#ffffff]};
[/bgcolor][bgcolor=#ffffff]//Hook函数
[/bgcolor][bgcolor=#ffffff]int [/bgcolor][bgcolor=#ffffff]HookInt[/bgcolor][bgcolor=#ffffff]( [/bgcolor][bgcolor=#ffffff]unsigned long[/bgcolor][bgcolor=#ffffff]* [/bgcolor][bgcolor=#ffffff]pOldHandler[/bgcolor][bgcolor=#ffffff], [/bgcolor][bgcolor=#ffffff]unsigned long [/bgcolor][bgcolor=#ffffff]NewHandler[/bgcolor][bgcolor=#ffffff], [/bgcolor][bgcolor=#ffffff]int [/bgcolor][bgcolor=#ffffff]IntNumber [/bgcolor][bgcolor=#ffffff])
{
[/bgcolor][bgcolor=#ffffff]IDT_INFO IdtInfo [/bgcolor][bgcolor=#ffffff]= {[/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff]};
[/bgcolor][bgcolor=#ffffff]__asm cli
__asm sidt IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]wLimit
[/bgcolor][bgcolor=#ffffff]//!-_-我很不习惯这种写法
[/bgcolor][bgcolor=#ffffff]PVOID pInt [/bgcolor][bgcolor=#ffffff]= &[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]];
[/bgcolor][bgcolor=#ffffff]//根据调用号获得中断处理例程的地址
[/bgcolor][bgcolor=#ffffff]PPTE pPteIdt [/bgcolor][bgcolor=#ffffff]= [/bgcolor][bgcolor=#ffffff]GetPteAddress[/bgcolor][bgcolor=#ffffff]( [/bgcolor][bgcolor=#ffffff]pInt [/bgcolor][bgcolor=#ffffff]);
[/bgcolor][bgcolor=#ffffff]//得到PTE的地址
[/bgcolor][bgcolor=#ffffff]if[/bgcolor][bgcolor=#ffffff]( (([/bgcolor][bgcolor=#ffffff]int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]!= [/bgcolor][bgcolor=#ffffff]ERROR_PTE_NOT_PRESENT[/bgcolor][bgcolor=#ffffff]) && (([/bgcolor][bgcolor=#ffffff]int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]!= [/bgcolor][bgcolor=#ffffff]ERROR_PAGE_NOT_PRESENT[/bgcolor][bgcolor=#ffffff]) )
{
[/bgcolor][bgcolor=#ffffff]ULONG oldPteIdt [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]ULONG[/bgcolor][bgcolor=#ffffff])*[/bgcolor][bgcolor=#ffffff]pPteIdt[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]MarkPageReadWrite[/bgcolor][bgcolor=#ffffff]( [/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]);
[/bgcolor][bgcolor=#ffffff]//把改页改为可写
[/bgcolor][bgcolor=#ffffff]__asm invlpg pInt
[/bgcolor][bgcolor=#ffffff]//清空TLB,用于刷新
[/bgcolor][bgcolor=#ffffff]*[/bgcolor][bgcolor=#ffffff]pOldHandler [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]unsigned int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]].[/bgcolor][bgcolor=#ffffff]OffsetHi [/bgcolor][bgcolor=#ffffff]<< [/bgcolor][bgcolor=#ffffff]16
[/bgcolor][bgcolor=#ffffff]| [/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]].[/bgcolor][bgcolor=#ffffff]OffsetLo[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]//保存原始中断向量
[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]].[/bgcolor][bgcolor=#ffffff]OffsetLo [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]unsigned short[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]NewHandler[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]].[/bgcolor][bgcolor=#ffffff]OffsetHi [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]unsigned short[/bgcolor][bgcolor=#ffffff])(([/bgcolor][bgcolor=#ffffff]unsigned int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]NewHandler [/bgcolor][bgcolor=#ffffff]>> [/bgcolor][bgcolor=#ffffff]16[/bgcolor][bgcolor=#ffffff]);
[/bgcolor][bgcolor=#ffffff]//Hook!
[/bgcolor][bgcolor=#ffffff]([/bgcolor][bgcolor=#ffffff]ULONG[/bgcolor][bgcolor=#ffffff])*[/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]= [/bgcolor][bgcolor=#ffffff]oldPteIdt[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]//还原原始属性
[/bgcolor][bgcolor=#ffffff]__asm invlpg pInt
[/bgcolor][bgcolor=#ffffff]//刷新
[/bgcolor][bgcolor=#ffffff]__asm sti
[/bgcolor][bgcolor=#ffffff]//开中断
[/bgcolor][bgcolor=#ffffff]return true[/bgcolor][bgcolor=#ffffff];
}
[/bgcolor][bgcolor=#ffffff]__asm sti
[/bgcolor][bgcolor=#ffffff]return [/bgcolor][bgcolor=#ffffff]([/bgcolor][bgcolor=#ffffff]int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]pPteIdt[/bgcolor][bgcolor=#ffffff];
}
[/bgcolor][bgcolor=#ffffff]//差不多的,不注释了,留原版的。
[/bgcolor][bgcolor=#ffffff]int [/bgcolor][bgcolor=#ffffff]UnhookInt[/bgcolor][bgcolor=#ffffff]( [/bgcolor][bgcolor=#ffffff]unsigned long [/bgcolor][bgcolor=#ffffff]OldHandler[/bgcolor][bgcolor=#ffffff], [/bgcolor][bgcolor=#ffffff]int [/bgcolor][bgcolor=#ffffff]IntNumber [/bgcolor][bgcolor=#ffffff])
{
[/bgcolor][bgcolor=#ffffff]IDT_INFO IdtInfo [/bgcolor][bgcolor=#ffffff]= {[/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff]};
[/bgcolor][bgcolor=#ffffff]__asm cli [/bgcolor][bgcolor=#ffffff]//disable interrupts
//get the base address of the IDT
[/bgcolor][bgcolor=#ffffff]__asm sidt IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]wLimit
[/bgcolor][bgcolor=#ffffff]//un-write-protect the IDT if it is write protected
[/bgcolor][bgcolor=#ffffff]PVOID pInt [/bgcolor][bgcolor=#ffffff]= &[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]];
[/bgcolor][bgcolor=#ffffff]PPTE pPteIdt [/bgcolor][bgcolor=#ffffff]= [/bgcolor][bgcolor=#ffffff]GetPteAddress[/bgcolor][bgcolor=#ffffff]( [/bgcolor][bgcolor=#ffffff]pInt [/bgcolor][bgcolor=#ffffff]);
[/bgcolor][bgcolor=#ffffff]if[/bgcolor][bgcolor=#ffffff]( (([/bgcolor][bgcolor=#ffffff]int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]!= [/bgcolor][bgcolor=#ffffff]ERROR_PTE_NOT_PRESENT[/bgcolor][bgcolor=#ffffff]) && (([/bgcolor][bgcolor=#ffffff]int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]!= [/bgcolor][bgcolor=#ffffff]ERROR_PAGE_NOT_PRESENT[/bgcolor][bgcolor=#ffffff]) ) [/bgcolor][bgcolor=#ffffff]//the idt should never be "not present", but playing it safe
[/bgcolor][bgcolor=#ffffff]{
[/bgcolor][bgcolor=#ffffff]ULONG oldPteIdt [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]ULONG[/bgcolor][bgcolor=#ffffff])*[/bgcolor][bgcolor=#ffffff]pPteIdt[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]MarkPageReadWrite[/bgcolor][bgcolor=#ffffff]( [/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]);
[/bgcolor][bgcolor=#ffffff]__asm invlpg pInt
[/bgcolor][bgcolor=#ffffff]//restore the old handler
[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]].[/bgcolor][bgcolor=#ffffff]OffsetLo [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]unsigned short[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]OldHandler[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]IdtInfo[/bgcolor][bgcolor=#ffffff].[/bgcolor][bgcolor=#ffffff]pIdt[/bgcolor][bgcolor=#ffffff][[/bgcolor][bgcolor=#ffffff]IntNumber[/bgcolor][bgcolor=#ffffff]].[/bgcolor][bgcolor=#ffffff]OffsetHi [/bgcolor][bgcolor=#ffffff]= ([/bgcolor][bgcolor=#ffffff]unsigned short[/bgcolor][bgcolor=#ffffff])(([/bgcolor][bgcolor=#ffffff]unsigned int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]OldHandler [/bgcolor][bgcolor=#ffffff]>> [/bgcolor][bgcolor=#ffffff]16[/bgcolor][bgcolor=#ffffff]);
[/bgcolor][bgcolor=#ffffff]//restore the old writability of the idt
[/bgcolor][bgcolor=#ffffff]([/bgcolor][bgcolor=#ffffff]ULONG[/bgcolor][bgcolor=#ffffff])*[/bgcolor][bgcolor=#ffffff]pPteIdt [/bgcolor][bgcolor=#ffffff]= [/bgcolor][bgcolor=#ffffff]oldPteIdt[/bgcolor][bgcolor=#ffffff];
[/bgcolor][bgcolor=#ffffff]__asm invlpg pInt
__asm sti [/bgcolor][bgcolor=#ffffff]//reenable interrupts
[/bgcolor][bgcolor=#ffffff]return true[/bgcolor][bgcolor=#ffffff];
}[/bgcolor][bgcolor=#ffffff]//end if
[/bgcolor][bgcolor=#ffffff]__asm sti
[/bgcolor][bgcolor=#ffffff]return [/bgcolor][bgcolor=#ffffff]([/bgcolor][bgcolor=#ffffff]int[/bgcolor][bgcolor=#ffffff])[/bgcolor][bgcolor=#ffffff]pPteIdt[/bgcolor][bgcolor=#ffffff];
}[/bgcolor][bgcolor=#ffffff]//end UnhookInt[/bgcolor] |
|