C   15

InterruptHook

Guest on 4th July 2022 07:18:54 PM

  1. /*
  2. InterruptHook
  3. Copyright (C)   Alexander M.
  4.  
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License
  7. as published by the Free Software Foundation; either version 2
  8. of the License, or (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18. */
  19.  
  20. #include <ntddk.h>
  21. #include "hook.h"
  22.  
  23. VOID
  24. LoadIDT(
  25.                 OUT     PIDT            pIdt )
  26. {
  27.         __asm
  28.         {
  29.                 MOV EAX, [pIdt]
  30.                 SIDT [EAX]
  31.         }
  32. }
  33.  
  34. VOID
  35. LoadINTVector(
  36.                 IN      PIDT            pIdt,
  37.                 IN      UCHAR           iVector,
  38.                 OUT     PINT_VECTOR     pVector )
  39. {
  40.         __try
  41.         {
  42.                 DWORD dwBase = pIdt->dwBase + iVector * sizeof(INT_VECTOR);
  43.                 memcpy( pVector, (const void *)dwBase, sizeof(INT_VECTOR) );
  44.         }
  45.         __except( 1 )
  46.         {
  47.                 KdPrint( ( "LoadINTVector: Exception\n" ));
  48.         }
  49.  
  50. //      KdPrint( ( "LoadINTVector: Vector 0x%.2X successfully dumped\n", iVector ));
  51. }
  52.  
  53. VOID
  54. SaveINTVector(
  55.                 IN      PIDT            pIdt,
  56.                 IN      UCHAR           iVector,
  57.                 IN      PINT_VECTOR     pVector )
  58. {
  59.         __try
  60.         {
  61.                 DWORD dwBase = pIdt->dwBase + iVector * sizeof(INT_VECTOR);
  62.                 __asm{ PUSHFD };
  63.                 __asm{ CLI };
  64.                 memcpy( (void *)dwBase, pVector, sizeof(INT_VECTOR) );
  65.                 __asm{ POPFD };
  66.         }
  67.         __except( 1 )
  68.         {
  69.                 KdPrint( ( "SaveINTVector: Exception\n" ));
  70.         }
  71.  
  72. //      KdPrint( ( "SaveINTVector: Vector 0x%.2X successfully set\n", iVector ));
  73. }
  74.  
  75. VOID
  76. HookInterrupt(UCHAR iVec, void (*InterruptHandler)( void ), WORD selector)
  77. {
  78.         IDT                     Idt;
  79.         INT_VECTOR      Vec;
  80.         ULONG           i;
  81.  
  82.         LoadIDT( &Idt );
  83.  
  84.         LoadINTVector(
  85.                         &Idt,
  86.                         iVec,
  87.                         &Vec);
  88.  
  89.         KdPrint( ( "HookInterrupt: Vector - %.2X, 0x%.8X, 0x%.8X\n", iVec, VEC_OFFSET_TO_DWORD( Vec ), InterruptHandler));
  90.         DWORD_TO_VEC_OFFSET( Vec, InterruptHandler);
  91.  
  92.         Vec.wSelector = selector;
  93.  
  94.         SaveINTVector(
  95.                         &Idt,
  96.                         iVec,
  97.                         &Vec );
  98.  
  99. }
  100.  
  101. VOID
  102. BackupInterrupt(UCHAR iVec, OUT PINT_VECTOR Vec)
  103. {
  104.         IDT                     Idt;
  105.         ULONG           i;
  106.  
  107.         LoadIDT( &Idt );
  108.  
  109.         LoadINTVector(
  110.                         &Idt,
  111.                         iVec,
  112.                         Vec);
  113. }
  114.  
  115. VOID
  116. RestoreInterrupt(UCHAR iVec, IN PINT_VECTOR Vec)
  117. {
  118.         IDT                     Idt;
  119.         ULONG           i;
  120.  
  121.         LoadIDT( &Idt );
  122.  
  123.         SaveINTVector(
  124.                         &Idt,
  125.                         iVec,
  126.                         Vec);
  127. }
  128.  
  129. VOID
  130. CopyInterrupt(UCHAR fromVec, UCHAR toVec)
  131. {
  132.         IDT                     Idt;
  133.         INT_VECTOR      Vec;
  134.         ULONG           i;
  135.  
  136.         LoadIDT( &Idt );
  137.  
  138.         LoadINTVector(
  139.                         &Idt,
  140.                         fromVec,
  141.                         &Vec);
  142.  
  143.         KdPrint( ( "CopyInterrupt: Vector, 0x%.8X\n", VEC_OFFSET_TO_DWORD( Vec )));
  144.  
  145.         SaveINTVector(
  146.                         &Idt,
  147.                         toVec,
  148.                         &Vec );
  149.  
  150. }

Raw Paste


Login or Register to edit or fork this paste. It's free.