• 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 /
  • 相关阅读:
    深入了解spring(二) IOC容器
    深入了解spring(一) spring的作用
    深入了解Java虚拟机(二)
    关于scroll、client、offset和style中的height、width、top以及bottom属性
    打开桌面上的图标就会弹出"打开些文件可能会对您的计算机有害"解决方案
    Windows中区位码转换为机内码
    Servlet 上传图片
    Java&Quartz实现任务调度
    JavaMail
    JavaWeb 二维码
  • 原文地址:https://www.cnblogs.com/dependence/p/2567668.html
Copyright © 2020-2023  润新知