HOOK IDT (1)第一种方法,Int 0x2e

  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 /

 

你可能感兴趣的:(int)