免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

通用inline hook 的详解以及代码的编写

Driver.h
  1. #ifdef __cplusplus
  2. extern "C"
  3. {
  4. #endif
  5. #include <ntddk.h>
  6. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);

  7. #ifdef __cplusplus
  8. }
  9. #endif

  10. #include "ade32.h"

  11. #define PAGEDCODE code_seg("PAGE")
  12. #define LOCKEDCODE code_seg()
  13. #define INITCODE code_seg("INIT")

  14. #define PAGEDDATA data_seg("PAGE")
  15. #define LOCKEDDATA data_seg()
  16. #define INITDATA data_seg("INIT")

  17. #define arraysize(p) (sizeof(p)/sizeof((p)[0]))

  18. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);

  19. EXTERN_C NTKERNELAPI NTSTATUS NtOpenProcess (
  20.         __out PHANDLE ProcessHandle,
  21.         __in ACCESS_MASK DesiredAccess,
  22.         __in POBJECT_ATTRIBUTES ObjectAttributes,
  23.         __in_opt PCLIENT_ID ClientId
  24.         );

  25. void HookHandleNtOpenProcess(BOOLEAN bUnHook);
  26. void WriteJump(ULONG uHookAddr, ULONG uJumpAddr);

  27. NTSTATUS MyNtOpenProcess (
  28.                                                   __out PHANDLE ProcessHandle,
  29.                                                   __in ACCESS_MASK DesiredAccess,
  30.                                                   __in POBJECT_ATTRIBUTES ObjectAttributes,
  31.                                                   __in_opt PCLIENT_ID ClientId
  32.                                                   );

  33. typedef NTSTATUS (*pNtOpenProcess) (
  34.                                                 __out PHANDLE ProcessHandle,
  35.                                                 __in ACCESS_MASK DesiredAccess,
  36.                                                 __in POBJECT_ATTRIBUTES ObjectAttributes,
  37.                                                 __in_opt PCLIENT_ID ClientId
  38.                                                 );
复制代码
Driver.cpp
  1. #include "Driver.h"


  2. UCHAR szBackupNtOpenProcess[16];
  3. UCHAR szRealNtOpenProcess[16];
  4. ULONG uHookAddr;

  5. void PageProtectOn()
  6. {
  7.         //恢复内存保护
  8.         __asm
  9.         {
  10.                 mov eax, cr0
  11.                 or eax, 10000h
  12.                 mov cr0, eax
  13.                 sti
  14.         }
  15. }

  16. void PageProtectOff()
  17. {
  18.         //去掉内存保护
  19.         __asm
  20.         {
  21.                 cli
  22.                 mov eax, cr0
  23.                 and eax, not 10000h
  24.                 mov cr0, eax
  25.         }
  26. }

  27. void WriteJump(ULONG uHookAddr, ULONG uJumpAddr)
  28. {
  29.         UCHAR szBuffer[5] = {0};

  30.         szBuffer[0] = 0xe9;
  31.         *(PULONG)&szBuffer[1] = uJumpAddr - uHookAddr - 5;

  32.         KIRQL OldIrql = KeRaiseIrqlToDpcLevel();

  33.         PageProtectOff();
  34.        
  35.         RtlMoveMemory((VOID*)uHookAddr, szBuffer, 5);

  36.         PageProtectOn();

  37.         KeLowerIrql(OldIrql);
  38. }


  39. NTSTATUS MyNtOpenProcess (
  40.                                                 __out PHANDLE ProcessHandle,
  41.                                                 __in ACCESS_MASK DesiredAccess,
  42.                                                 __in POBJECT_ATTRIBUTES ObjectAttributes,
  43.                                                 __in_opt PCLIENT_ID ClientId
  44.                                                 )
  45. {
  46.         KdPrint(("MyNtOpenProcess\n"));
  47.         return ((pNtOpenProcess)&szRealNtOpenProcess)(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
  48. }





  49. void HookHandleNtOpenProcess(BOOLEAN bHook)
  50. {
  51.         if (bHook)
  52.         {
  53.                 uHookAddr = (ULONG)NtOpenProcess;

  54.                 ULONG uHookLength = MeasureCodeLength((PVOID)uHookAddr, 5);
  55.                 memcpy(szBackupNtOpenProcess, (PVOID)uHookAddr, uHookLength);
  56.                 memcpy(szRealNtOpenProcess, (PVOID)uHookAddr, uHookLength);

  57.                 WriteJump((ULONG)szRealNtOpenProcess + uHookLength, uHookAddr + uHookLength);
  58.                 WriteJump(uHookAddr, (ULONG)MyNtOpenProcess);


  59.         }
  60.         else
  61.         {
  62.                 KIRQL OldIrql = KeRaiseIrqlToDpcLevel();

  63.                 PageProtectOff();

  64.                 RtlMoveMemory((VOID*)uHookAddr, szBackupNtOpenProcess, 5);

  65.                 PageProtectOn();

  66.                 KeLowerIrql(OldIrql);
  67.         }
  68. }


  69. #pragma INITCODE
  70. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  71. {
  72.   NTSTATUS status = STATUS_SUCCESS;

  73.   HookHandleNtOpenProcess(TRUE);
  74.   DriverObject->DriverUnload = DriverUnload;
  75.   return status;
  76. }

  77. #pragma PAGEDCODE
  78. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
  79. {
  80.   HookHandleNtOpenProcess(FALSE);
  81.   KdPrint(("DriverEntry unLoading...\n"));
  82.   
  83. }
复制代码
ade32.h
  1. #ifndef _ADE32_H_
  2. #define _ADE32_H_

  3. ULONG MeasureCodeLength(IN PVOID FuncPtr, IN ULONG NeedLength);

  4. #endif _ADE32_H_
复制代码
ade32.cpp
  1. // ADE32 2.03c -- advanced 16/32-bit opcode assembler/disassembler engine

  2. // this stuff is used to get instruction length and parse it into
  3. // prefix, opcode, modregr/m, address, immediate, etc.

  4. #include <ntddk.h>
  5. //#include <pn3misc.h>
  6. #include "ade32.h"

  7. //指令特征
  8. #define C_ERROR   0xFFFFFFFF
  9. #define C_ADDR1   0x00000001 //操作码中地址大小的位字段(字节)
  10. #define C_ADDR2   0x00000002
  11. #define C_ADDR4   0x00000004 //(双字)
  12. #define C_LOCK    0x00000008 //加锁前缀
  13. #define C_67      0x00000010 //地址大小修饰前缀(16/32位)
  14. #define C_66      0x00000020 //操作数大小修饰前缀(16/32位)
  15. #define C_REP     0x00000040 //重复前缀
  16. #define C_SEG     0x00000080 //段寄存器前缀
  17. #define C_ANYPREFIX  (C_66+C_67+C_LOCK+C_REP+C_SEG)
  18. #define C_DATA1   0x00000100 //操作码中数据大小的位字段
  19. #define C_DATA2   0x00000200
  20. #define C_DATA4   0x00000400
  21. #define C_SIB     0x00000800 //SIB字节
  22. #define C_ADDR67  0x00001000 //地址字节数为disasm_defaddr
  23. #define C_DATA66  0x00002000 //数据字节数为disasm_defdata
  24. #define C_MODRM   0x00004000 //MODRM字节
  25. #define C_BAD     0x00008000
  26. #define C_OPCODE2 0x00010000 //操作码第二个字节
  27. #define C_REL     0x00020000 // 这是跳转指令jxx或者call
  28. #define C_STOP    0x00040000 // 这是回跳指令,ret或者jmp
  29. //指令信息
  30. typedef struct _disasm_struct
  31. {
  32.         UCHAR disasm_defaddr;         // 00
  33.         UCHAR disasm_defdata;         // 01
  34.         ULONG disasm_len;             // 02 03 04 05
  35.         ULONG disasm_flag;            // 06 07 08 09
  36.         ULONG disasm_addrsize;        // 0A 0B 0C 0D
  37.         ULONG disasm_datasize;        // 0E 0F 10 11
  38.         UCHAR disasm_rep;             // 12
  39.         UCHAR disasm_seg;             // 13
  40.         UCHAR disasm_opcode;          // 14
  41.         UCHAR disasm_opcode2;         // 15
  42.         UCHAR disasm_modrm;           // 16
  43.         UCHAR disasm_sib;             // 17
  44.         //地址
  45.         union
  46.         {
  47.                 UCHAR  disasm_addr_b[8];       // 18 19 1A 1B  1C 1D 1E 1F
  48.                 USHORT  disasm_addr_w[4];
  49.                 ULONG disasm_addr_d[2];
  50.                 char  disasm_addr_c[8];
  51.                 short disasm_addr_s[4];
  52.                 long  disasm_addr_l[2];
  53.         };
  54.         //数据
  55.         union
  56.         {
  57.                 UCHAR  disasm_data_b[8];       // 20 21 22 23  24 25 26 27
  58.                 USHORT  disasm_data_w[4];
  59.                 ULONG disasm_data_d[2];
  60.                 char  disasm_data_c[8];
  61.                 short disasm_data_s[4];
  62.                 long  disasm_data_l[2];
  63.         };
  64. } disasm_struct;
  65. //按操作码从0x00开始排列,每一行代表一个操作
  66. //码对应的指令特征的集合
  67. ULONG ade32_table[512] = {
  68.         /* 00 */  C_MODRM,
  69.         /* 01 */  C_MODRM,
  70.         /* 02 */  C_MODRM,
  71.         /* 03 */  C_MODRM,
  72.         /* 04 */  C_DATA1,
  73.         /* 05 */  C_DATA66,
  74.         /* 06 */  C_BAD,
  75.         /* 07 */  C_BAD,
  76.         /* 08 */  C_MODRM,
  77.         /* 09 */  C_MODRM,
  78.         /* 0A */  C_MODRM,
  79.         /* 0B */  C_MODRM,
  80.         /* 0C */  C_DATA1,
  81.         /* 0D */  C_DATA66,
  82.         /* 0E */  C_BAD,
  83.         /* 0F */  C_OPCODE2,
  84.         /* 10 */  C_MODRM+C_BAD,
  85.         /* 11 */  C_MODRM,
  86.         /* 12 */  C_MODRM+C_BAD,
  87.         /* 13 */  C_MODRM,
  88.         /* 14 */  C_DATA1+C_BAD,
  89.         /* 15 */  C_DATA66+C_BAD,
  90.         /* 16 */  C_BAD,
  91.         /* 17 */  C_BAD,
  92.         /* 18 */  C_MODRM+C_BAD,
  93.         /* 19 */  C_MODRM,
  94.         /* 1A */  C_MODRM,
  95.         /* 1B */  C_MODRM,
  96.         /* 1C */  C_DATA1+C_BAD,
  97.         /* 1D */  C_DATA66+C_BAD,
  98.         /* 1E */  C_BAD,
  99.         /* 1F */  C_BAD,
  100.         /* 20 */  C_MODRM,
  101.         /* 21 */  C_MODRM,
  102.         /* 22 */  C_MODRM,
  103.         /* 23 */  C_MODRM,
  104.         /* 24 */  C_DATA1,
  105.         /* 25 */  C_DATA66,
  106.         /* 26 */  C_SEG+C_BAD,
  107.         /* 27 */  C_BAD,
  108.         /* 28 */  C_MODRM,
  109.         /* 29 */  C_MODRM,
  110.         /* 2A */  C_MODRM,
  111.         /* 2B */  C_MODRM,
  112.         /* 2C */  C_DATA1,
  113.         /* 2D */  C_DATA66,
  114.         /* 2E */  C_SEG+C_BAD,
  115.         /* 2F */  C_BAD,
  116.         /* 30 */  C_MODRM,
  117.         /* 31 */  C_MODRM,
  118.         /* 32 */  C_MODRM,
  119.         /* 33 */  C_MODRM,
  120.         /* 34 */  C_DATA1,
  121.         /* 35 */  C_DATA66,
  122.         /* 36 */  C_SEG+C_BAD,
  123.         /* 37 */  C_BAD,
  124.         /* 38 */  C_MODRM,
  125.         /* 39 */  C_MODRM,
  126.         /* 3A */  C_MODRM,
  127.         /* 3B */  C_MODRM,
  128.         /* 3C */  C_DATA1,
  129.         /* 3D */  C_DATA66,
  130.         /* 3E */  C_SEG+C_BAD,
  131.         /* 3F */  C_BAD,
  132.         /* 40 */  0,
  133.         /* 41 */  0,
  134.         /* 42 */  0,
  135.         /* 43 */  0,
  136.         /* 44 */  C_BAD,
  137.         /* 45 */  0,
  138.         /* 46 */  0,
  139.         /* 47 */  0,
  140.         /* 48 */  0,
  141.         /* 49 */  0,
  142.         /* 4A */  0,
  143.         /* 4B */  0,
  144.         /* 4C */  C_BAD,
  145.         /* 4D */  0,
  146.         /* 4E */  0,
  147.         /* 4F */  0,
  148.         /* 50 */  0,
  149.         /* 51 */  0,
  150.         /* 52 */  0,
  151.         /* 53 */  0,
  152.         /* 54 */  0,
  153.         /* 55 */  0,
  154.         /* 56 */  0,
  155.         /* 57 */  0,
  156.         /* 58 */  0,
  157.         /* 59 */  0,
  158.         /* 5A */  0,
  159.         /* 5B */  0,
  160.         /* 5C */  C_BAD,
  161.         /* 5D */  0,
  162.         /* 5E */  0,
  163.         /* 5F */  0,
  164.         /* 60 */  C_BAD,
  165.         /* 61 */  C_BAD,
  166.         /* 62 */  C_MODRM+C_BAD,
  167.         /* 63 */  C_MODRM+C_BAD,
  168.         /* 64 */  C_SEG,
  169.         /* 65 */  C_SEG+C_BAD,
  170.         /* 66 */  C_66,
  171.         /* 67 */  C_67,
  172.         /* 68 */  C_DATA66,
  173.         /* 69 */  C_MODRM+C_DATA66,
  174.         /* 6A */  C_DATA1,
  175.         /* 6B */  C_MODRM+C_DATA1,
  176.         /* 6C */  C_BAD,
  177.         /* 6D */  C_BAD,
  178.         /* 6E */  C_BAD,
  179.         /* 6F */  C_BAD,
  180.         /* 70 */  C_DATA1+C_REL+C_BAD,
  181.         /* 71 */  C_DATA1+C_REL+C_BAD,
  182.         /* 72 */  C_DATA1+C_REL,
  183.         /* 73 */  C_DATA1+C_REL,
  184.         /* 74 */  C_DATA1+C_REL,
  185.         /* 75 */  C_DATA1+C_REL,
  186.         /* 76 */  C_DATA1+C_REL,
  187.         /* 77 */  C_DATA1+C_REL,
  188.         /* 78 */  C_DATA1+C_REL,
  189.         /* 79 */  C_DATA1+C_REL,
  190.         /* 7A */  C_DATA1+C_REL+C_BAD,
  191.         /* 7B */  C_DATA1+C_REL+C_BAD,
  192.         /* 7C */  C_DATA1+C_REL,
  193.         /* 7D */  C_DATA1+C_REL,
  194.         /* 7E */  C_DATA1+C_REL,
  195.         /* 7F */  C_DATA1+C_REL,
  196.         /* 80 */  C_MODRM+C_DATA1,
  197.         /* 81 */  C_MODRM+C_DATA66,
  198.         /* 82 */  C_MODRM+C_DATA1+C_BAD,
  199.         /* 83 */  C_MODRM+C_DATA1,
  200.         /* 84 */  C_MODRM,
  201.         /* 85 */  C_MODRM,
  202.         /* 86 */  C_MODRM,
  203.         /* 87 */  C_MODRM,
  204.         /* 88 */  C_MODRM,
  205.         /* 89 */  C_MODRM,
  206.         /* 8A */  C_MODRM,
  207.         /* 8B */  C_MODRM,
  208.         /* 8C */  C_MODRM+C_BAD,
  209.         /* 8D */  C_MODRM,
  210.         /* 8E */  C_MODRM+C_BAD,
  211.         /* 8F */  C_MODRM,
  212.         /* 90 */  0,
  213.         /* 91 */  0,
  214.         /* 92 */  0,
  215.         /* 93 */  C_BAD,
  216.         /* 94 */  C_BAD,
  217.         /* 95 */  C_BAD,
  218.         /* 96 */  C_BAD,
  219.         /* 97 */  C_BAD,
  220.         /* 98 */  C_BAD,
  221.         /* 99 */  0,
  222.         /* 9A */  C_DATA66+C_DATA2+C_BAD,
  223.         /* 9B */  0,
  224.         /* 9C */  C_BAD,
  225.         /* 9D */  C_BAD,
  226.         /* 9E */  C_BAD,
  227.         /* 9F */  C_BAD,
  228.         /* A0 */  C_ADDR67,
  229.         /* A1 */  C_ADDR67,
  230.         /* A2 */  C_ADDR67,
  231.         /* A3 */  C_ADDR67,
  232.         /* A4 */  0,
  233.         /* A5 */  0,
  234.         /* A6 */  0,
  235.         /* A7 */  0,
  236.         /* A8 */  C_DATA1,
  237.         /* A9 */  C_DATA66,
  238.         /* AA */  0,
  239.         /* AB */  0,
  240.         /* AC */  0,
  241.         /* AD */  C_BAD,
  242.         /* AE */  0,
  243.         /* AF */  C_BAD,
  244.         /* B0 */  C_DATA1,
  245.         /* B1 */  C_DATA1,
  246.         /* B2 */  C_DATA1,
  247.         /* B3 */  C_DATA1,
  248.         /* B4 */  C_DATA1,
  249.         /* B5 */  C_DATA1,
  250.         /* B6 */  C_DATA1+C_BAD,
  251.         /* B7 */  C_DATA1+C_BAD,
  252.         /* B8 */  C_DATA66,
  253.         /* B9 */  C_DATA66,
  254.         /* BA */  C_DATA66,
  255.         /* BB */  C_DATA66,
  256.         /* BC */  C_DATA66+C_BAD,
  257.         /* BD */  C_DATA66,
  258.         /* BE */  C_DATA66,
  259.         /* BF */  C_DATA66,
  260.         /* C0 */  C_MODRM+C_DATA1,
  261.         /* C1 */  C_MODRM+C_DATA1,
  262.         /* C2 */  C_DATA2+C_STOP,
  263.         /* C3 */  C_STOP,
  264.         /* C4 */  C_MODRM+C_BAD,
  265.         /* C5 */  C_MODRM+C_BAD,
  266.         /* C6 */  C_MODRM+C_DATA1,
  267.         /* C7 */  C_MODRM+C_DATA66,
  268.         /* C8 */  C_DATA2+C_DATA1,
  269.         /* C9 */  0,
  270.         /* CA */  C_DATA2+C_STOP+C_BAD,
  271.         /* CB */  C_STOP+C_BAD,
  272.         /* CC */  C_BAD,
  273.         /* CD */  C_DATA1,
  274.         /* CE */  C_BAD,
  275.         /* CF */  C_STOP+C_BAD,
  276.         /* D0 */  C_MODRM,
  277.         /* D1 */  C_MODRM,
  278.         /* D2 */  C_MODRM,
  279.         /* D3 */  C_MODRM,
  280.         /* D4 */  C_DATA1+C_BAD,
  281.         /* D5 */  C_DATA1+C_BAD,
  282.         /* D6 */  C_BAD,
  283.         /* D7 */  C_BAD,
  284.         /* D8 */  C_MODRM,
  285.         /* D9 */  C_MODRM,
  286.         /* DA */  C_MODRM,
  287.         /* DB */  C_MODRM,
  288.         /* DC */  C_MODRM,
  289.         /* DD */  C_MODRM,
  290.         /* DE */  C_MODRM,
  291.         /* DF */  C_MODRM,
  292.         /* E0 */  C_DATA1+C_REL+C_BAD,
  293.         /* E1 */  C_DATA1+C_REL+C_BAD,
  294.         /* E2 */  C_DATA1+C_REL,
  295.         /* E3 */  C_DATA1+C_REL,
  296.         /* E4 */  C_DATA1+C_BAD,
  297.         /* E5 */  C_DATA1+C_BAD,
  298.         /* E6 */  C_DATA1+C_BAD,
  299.         /* E7 */  C_DATA1+C_BAD,
  300.         /* E8 */  C_DATA66+C_REL,
  301.         /* E9 */  C_DATA66+C_REL+C_STOP,
  302.         /* EA */  C_DATA66+C_DATA2+C_BAD,
  303.         /* EB */  C_DATA1+C_REL+C_STOP,
  304.         /* EC */  C_BAD,
  305.         /* ED */  C_BAD,
  306.         /* EE */  C_BAD,
  307.         /* EF */  C_BAD,
  308.         /* F0 */  C_LOCK+C_BAD,
  309.         /* F1 */  C_BAD,
  310.         /* F2 */  C_REP,
  311.         /* F3 */  C_REP,
  312.         /* F4 */  C_BAD,
  313.         /* F5 */  C_BAD,
  314.         /* F6 */  C_MODRM,
  315.         /* F7 */  C_MODRM,
  316.         /* F8 */  0,
  317.         /* F9 */  0,
  318.         /* FA */  C_BAD,
  319.         /* FB */  C_BAD,
  320.         /* FC */  0,
  321.         /* FD */  0,
  322.         /* FE */  C_MODRM,
  323.         /* FF */  C_MODRM,
  324.         /* 00 */  C_MODRM,
  325.         /* 01 */  C_MODRM,
  326.         /* 02 */  C_MODRM,
  327.         /* 03 */  C_MODRM,
  328.         /* 04 */  C_ERROR,
  329.         /* 05 */  C_ERROR,
  330.         /* 06 */  0,
  331.         /* 07 */  C_ERROR,
  332.         /* 08 */  0,
  333.         /* 09 */  0,
  334.         /* 0A */  0,
  335.         /* 0B */  0,
  336.         /* 0C */  C_ERROR,
  337.         /* 0D */  C_ERROR,
  338.         /* 0E */  C_ERROR,
  339.         /* 0F */  C_ERROR,
  340.         /* 10 */  C_ERROR,
  341.         /* 11 */  C_ERROR,
  342.         /* 12 */  C_ERROR,
  343.         /* 13 */  C_ERROR,
  344.         /* 14 */  C_ERROR,
  345.         /* 15 */  C_ERROR,
  346.         /* 16 */  C_ERROR,
  347.         /* 17 */  C_ERROR,
  348.         /* 18 */  C_ERROR,
  349.         /* 19 */  C_ERROR,
  350.         /* 1A */  C_ERROR,
  351.         /* 1B */  C_ERROR,
  352.         /* 1C */  C_ERROR,
  353.         /* 1D */  C_ERROR,
  354.         /* 1E */  C_ERROR,
  355.         /* 1F */  C_ERROR,
  356.         /* 20 */  C_ERROR,
  357.         /* 21 */  C_ERROR,
  358.         /* 22 */  C_ERROR,
  359.         /* 23 */  C_ERROR,
  360.         /* 24 */  C_ERROR,
  361.         /* 25 */  C_ERROR,
  362.         /* 26 */  C_ERROR,
  363.         /* 27 */  C_ERROR,
  364.         /* 28 */  C_ERROR,
  365.         /* 29 */  C_ERROR,
  366.         /* 2A */  C_ERROR,
  367.         /* 2B */  C_ERROR,
  368.         /* 2C */  C_ERROR,
  369.         /* 2D */  C_ERROR,
  370.         /* 2E */  C_ERROR,
  371.         /* 2F */  C_ERROR,
  372.         /* 30 */  C_ERROR,
  373.         /* 31 */  C_ERROR,
  374.         /* 32 */  C_ERROR,
  375.         /* 33 */  C_ERROR,
  376.         /* 34 */  C_ERROR,
  377.         /* 35 */  C_ERROR,
  378.         /* 36 */  C_ERROR,
  379.         /* 37 */  C_ERROR,
  380.         /* 38 */  C_ERROR,
  381.         /* 39 */  C_ERROR,
  382.         /* 3A */  C_ERROR,
  383.         /* 3B */  C_ERROR,
  384.         /* 3C */  C_ERROR,
  385.         /* 3D */  C_ERROR,
  386.         /* 3E */  C_ERROR,
  387.         /* 3F */  C_ERROR,
  388.         /* 40 */  C_MODRM,
  389.         /* 41 */  C_MODRM,
  390.         /* 42 */  C_MODRM,
  391.         /* 43 */  C_MODRM,
  392.         /* 44 */  C_MODRM,
  393.         /* 45 */  C_MODRM,
  394.         /* 46 */  C_MODRM,
  395.         /* 47 */  C_MODRM,
  396.         /* 48 */  C_MODRM,
  397.         /* 49 */  C_MODRM,
  398.         /* 4A */  C_MODRM,
  399.         /* 4B */  C_MODRM,
  400.         /* 4C */  C_MODRM,
  401.         /* 4D */  C_MODRM,
  402.         /* 4E */  C_MODRM,
  403.         /* 4F */  C_MODRM,
  404.         /* 50 */  C_ERROR,
  405.         /* 51 */  C_ERROR,
  406.         /* 52 */  C_ERROR,
  407.         /* 53 */  C_ERROR,
  408.         /* 54 */  C_ERROR,
  409.         /* 55 */  C_ERROR,
  410.         /* 56 */  C_ERROR,
  411.         /* 57 */  C_ERROR,
  412.         /* 58 */  C_ERROR,
  413.         /* 59 */  C_ERROR,
  414.         /* 5A */  C_ERROR,
  415.         /* 5B */  C_ERROR,
  416.         /* 5C */  C_ERROR,
  417.         /* 5D */  C_ERROR,
  418.         /* 5E */  C_ERROR,
  419.         /* 5F */  C_ERROR,
  420.         /* 60 */  C_ERROR,
  421.         /* 61 */  C_ERROR,
  422.         /* 62 */  C_ERROR,
  423.         /* 63 */  C_ERROR,
  424.         /* 64 */  C_ERROR,
  425.         /* 65 */  C_ERROR,
  426.         /* 66 */  C_ERROR,
  427.         /* 67 */  C_ERROR,
  428.         /* 68 */  C_ERROR,
  429.         /* 69 */  C_ERROR,
  430.         /* 6A */  C_ERROR,
  431.         /* 6B */  C_ERROR,
  432.         /* 6C */  C_ERROR,
  433.         /* 6D */  C_ERROR,
  434.         /* 6E */  C_ERROR,
  435.         /* 6F */  C_ERROR,
  436.         /* 70 */  C_ERROR,
  437.         /* 71 */  C_ERROR,
  438.         /* 72 */  C_ERROR,
  439.         /* 73 */  C_ERROR,
  440.         /* 74 */  C_ERROR,
  441.         /* 75 */  C_ERROR,
  442.         /* 76 */  C_ERROR,
  443.         /* 77 */  C_ERROR,
  444.         /* 78 */  C_ERROR,
  445.         /* 79 */  C_ERROR,
  446.         /* 7A */  C_ERROR,
  447.         /* 7B */  C_ERROR,
  448.         /* 7C */  C_ERROR,
  449.         /* 7D */  C_ERROR,
  450.         /* 7E */  C_ERROR,
  451.         /* 7F */  C_ERROR,
  452.         /* 80 */  C_DATA66+C_REL,
  453.         /* 81 */  C_DATA66+C_REL,
  454.         /* 82 */  C_DATA66+C_REL,
  455.         /* 83 */  C_DATA66+C_REL,
  456.         /* 84 */  C_DATA66+C_REL,
  457.         /* 85 */  C_DATA66+C_REL,
  458.         /* 86 */  C_DATA66+C_REL,
  459.         /* 87 */  C_DATA66+C_REL,
  460.         /* 88 */  C_DATA66+C_REL,
  461.         /* 89 */  C_DATA66+C_REL,
  462.         /* 8A */  C_DATA66+C_REL,
  463.         /* 8B */  C_DATA66+C_REL,
  464.         /* 8C */  C_DATA66+C_REL,
  465.         /* 8D */  C_DATA66+C_REL,
  466.         /* 8E */  C_DATA66+C_REL,
  467.         /* 8F */  C_DATA66+C_REL,
  468.         /* 90 */  C_MODRM,
  469.         /* 91 */  C_MODRM,
  470.         /* 92 */  C_MODRM,
  471.         /* 93 */  C_MODRM,
  472.         /* 94 */  C_MODRM,
  473.         /* 95 */  C_MODRM,
  474.         /* 96 */  C_MODRM,
  475.         /* 97 */  C_MODRM,
  476.         /* 98 */  C_MODRM,
  477.         /* 99 */  C_MODRM,
  478.         /* 9A */  C_MODRM,
  479.         /* 9B */  C_MODRM,
  480.         /* 9C */  C_MODRM,
  481.         /* 9D */  C_MODRM,
  482.         /* 9E */  C_MODRM,
  483.         /* 9F */  C_MODRM,
  484.         /* A0 */  0,
  485.         /* A1 */  0,
  486.         /* A2 */  0,
  487.         /* A3 */  C_MODRM,
  488.         /* A4 */  C_MODRM+C_DATA1,
  489.         /* A5 */  C_MODRM,
  490.         /* A6 */  C_ERROR,
  491.         /* A7 */  C_ERROR,
  492.         /* A8 */  0,
  493.         /* A9 */  0,
  494.         /* AA */  0,
  495.         /* AB */  C_MODRM,
  496.         /* AC */  C_MODRM+C_DATA1,
  497.         /* AD */  C_MODRM,
  498.         /* AE */  C_ERROR,
  499.         /* AF */  C_MODRM,
  500.         /* B0 */  C_MODRM,
  501.         /* B1 */  C_MODRM,
  502.         /* B2 */  C_MODRM,
  503.         /* B3 */  C_MODRM,
  504.         /* B4 */  C_MODRM,
  505.         /* B5 */  C_MODRM,
  506.         /* B6 */  C_MODRM,
  507.         /* B7 */  C_MODRM,
  508.         /* B8 */  C_ERROR,
  509.         /* B9 */  C_ERROR,
  510.         /* BA */  C_MODRM+C_DATA1,
  511.         /* BB */  C_MODRM,
  512.         /* BC */  C_MODRM,
  513.         /* BD */  C_MODRM,
  514.         /* BE */  C_MODRM,
  515.         /* BF */  C_MODRM,
  516.         /* C0 */  C_MODRM,
  517.         /* C1 */  C_MODRM,
  518.         /* C2 */  C_ERROR,
  519.         /* C3 */  C_ERROR,
  520.         /* C4 */  C_ERROR,
  521.         /* C5 */  C_ERROR,
  522.         /* C6 */  C_ERROR,
  523.         /* C7 */  C_ERROR,
  524.         /* C8 */  0,
  525.         /* C9 */  0,
  526.         /* CA */  0,
  527.         /* CB */  0,
  528.         /* CC */  0,
  529.         /* CD */  C_DATA1,
  530.         /* CE */  0,
  531.         /* CF */  0,
  532.         /* D0 */  C_ERROR,
  533.         /* D1 */  C_ERROR,
  534.         /* D2 */  C_ERROR,
  535.         /* D3 */  C_ERROR,
  536.         /* D4 */  C_ERROR,
  537.         /* D5 */  C_ERROR,
  538.         /* D6 */  C_ERROR,
  539.         /* D7 */  C_ERROR,
  540.         /* D8 */  C_ERROR,
  541.         /* D9 */  C_ERROR,
  542.         /* DA */  C_ERROR,
  543.         /* DB */  C_ERROR,
  544.         /* DC */  C_ERROR,
  545.         /* DD */  C_ERROR,
  546.         /* DE */  C_ERROR,
  547.         /* DF */  C_ERROR,
  548.         /* E0 */  C_ERROR,
  549.         /* E1 */  C_ERROR,
  550.         /* E2 */  C_ERROR,
  551.         /* E3 */  C_ERROR,
  552.         /* E4 */  C_ERROR,
  553.         /* E5 */  C_ERROR,
  554.         /* E6 */  C_ERROR,
  555.         /* E7 */  C_ERROR,
  556.         /* E8 */  C_ERROR,
  557.         /* E9 */  C_ERROR,
  558.         /* EA */  C_ERROR,
  559.         /* EB */  C_ERROR,
  560.         /* EC */  C_ERROR,
  561.         /* ED */  C_ERROR,
  562.         /* EE */  C_ERROR,
  563.         /* EF */  C_ERROR,
  564.         /* F0 */  C_ERROR,
  565.         /* F1 */  C_ERROR,
  566.         /* F2 */  C_ERROR,
  567.         /* F3 */  C_ERROR,
  568.         /* F4 */  C_ERROR,
  569.         /* F5 */  C_ERROR,
  570.         /* F6 */  C_ERROR,
  571.         /* F7 */  C_ERROR,
  572.         /* F8 */  C_ERROR,
  573.         /* F9 */  C_ERROR,
  574.         /* FA */  C_ERROR,
  575.         /* FB */  C_ERROR,
  576.         /* FC */  C_ERROR,
  577.         /* FD */  C_ERROR,
  578.         /* FE */  C_ERROR,
  579.         /* FF */  C_ERROR
  580. };

  581. ULONG ade32_disasm(IN PVOID opcode0)
  582. {
  583.         PUCHAR opcode = (PUCHAR)opcode0;
  584.         ULONG flag = 0;
  585.         UCHAR c;
  586.         ULONG t, a, d, i;
  587.         disasm_struct diza;
  588.         RtlZeroMemory(&diza, sizeof(disasm_struct));
  589.         diza.disasm_defdata = 4;
  590.         diza.disasm_defaddr = 4;
  591.         if (*(USHORT*)opcode == 0x0000) return 0;
  592.         if (*(USHORT*)opcode == 0xFFFF) return 0;
  593. repeat_prefix:
  594.         c = *opcode++;
  595.         t = ade32_table[ c ];
  596.         if (t & C_ANYPREFIX)
  597.         {
  598.                 if (flag & t) return 0;
  599.                 flag |= t;
  600.                 if (t & C_67) diza.disasm_defaddr ^= 2^4;
  601.                 else if (t & C_66) diza.disasm_defdata ^= 2^4;
  602.                 else if (t & C_SEG) diza.disasm_seg = c;
  603.                 else if (t & C_REP) diza.disasm_rep = c;
  604.                 goto repeat_prefix;
  605.         }
  606.         flag |= t;
  607.         diza.disasm_opcode = c;
  608.         if (c == 0x0F)
  609.         {
  610.                 c = *opcode++;
  611.                 diza.disasm_opcode2 = c;
  612.                 flag |= ade32_table[256 + c];
  613.                 if (flag == C_ERROR) return 0;
  614.         }
  615.         else if (c == 0xF7 && ((*opcode) & 0x38) == 0)
  616.         {
  617.                 flag |= C_DATA66;
  618.         }
  619.         else if (c == 0xF6 && ((*opcode) & 0x38)==0)
  620.         {
  621.                 flag |= C_DATA1;
  622.         }
  623.         if (flag & C_MODRM)
  624.         {
  625.                 UCHAR mod, rm;
  626.                 c = *opcode++;
  627.                 diza.disasm_modrm = c;
  628.                 if ((c & 0x38) == 0x20 && diza.disasm_opcode == 0xFF) flag |= C_STOP;
  629.                 mod = c & 0xC0;
  630.                 rm  = c & 0x07;
  631.                 if (mod != 0xC0)
  632.                 {
  633.                         if (diza.disasm_defaddr == 4)
  634.                         {
  635.                                 if (rm == 4)
  636.                                 {
  637.                                         flag |= C_SIB;
  638.                                         c = *opcode++;
  639.                                         diza.disasm_sib = c;
  640.                                         rm = c & 0x07;
  641.                                 }
  642.                                 if (mod == 0x40)
  643.                                 {
  644.                                         flag |= C_ADDR1;
  645.                                 }
  646.                                 else if (mod == 0x80)
  647.                                 {
  648.                                         flag |= C_ADDR4;
  649.                                 }
  650.                                 else if (rm == 5)
  651.                                 {
  652.                                         flag |= C_ADDR4;
  653.                                 }
  654.                         }
  655.                         else
  656.                         {
  657.                                 if (mod == 0x40)
  658.                                 {
  659.                                         flag |= C_ADDR1;
  660.                                 }
  661.                                 else if (mod == 0x80)
  662.                                 {
  663.                                         flag |= C_ADDR2;
  664.                                 }
  665.                                 else if (rm == 6)
  666.                                 {
  667.                                         flag |= C_ADDR2;
  668.                                 }
  669.                         }
  670.                 }
  671.         }
  672.         diza.disasm_flag = flag;
  673.         a =  flag & (C_ADDR1 | C_ADDR2 | C_ADDR4);
  674.         d = (flag & (C_DATA1 | C_DATA2 | C_DATA4)) >> 8;
  675.         if (flag & C_ADDR67) a += diza.disasm_defaddr;
  676.         if (flag & C_DATA66) d += diza.disasm_defdata;
  677.         diza.disasm_addrsize = a;
  678.         diza.disasm_datasize = d;
  679.         for(i=0; i<a; i++)
  680.                 diza.disasm_addr_b[i] = *opcode++;
  681.         for(i=0; i<d; i++)
  682.                 diza.disasm_data_b[i] = *opcode++;
  683.         diza.disasm_len = (ULONG)(opcode - (ULONG)opcode0);
  684.         return diza.disasm_len;
  685. }

  686. ULONG MeasureCodeLength(IN PVOID FuncPtr, IN ULONG NeedLength)
  687. {
  688.         ULONG Offset = 0, CodeLen;
  689.         do {
  690.                 CodeLen = ade32_disasm((PVOID)((ULONG)FuncPtr + Offset));
  691.                 if (CodeLen == 0) return 0;
  692.                 Offset += CodeLen;
  693.         } while (Offset < NeedLength);
  694.         return Offset;
  695. }
复制代码

返回列表