找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 197|回复: 0

[笔记]ShadowWalker1.0学习笔记4 ??Hook IDT

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-10 22:17:41 | 显示全部楼层 |阅读模式
[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]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-2 02:50 , Processed in 0.157615 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

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