zoukankan      html  css  js  c++  java
  • 从看雪的一个沙箱代码中扣出的InlineHook代码

    Inlin_Hook.h:

     1 #pragma once
     2 
     3 #define __malloc(_s)    VirtualAlloc(NULL, _s, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
     4 #define __free(_p)        VirtualFree(_p, 0, MEM_RELEASE)
     5 #define JMP_SIZE        5
     6 
     7 #define OP_NONE           0x00
     8 #define OP_MODRM          0x01
     9 #define OP_DATA_I8        0x02
    10 #define OP_DATA_I16       0x04
    11 #define OP_DATA_I32       0x08
    12 #define OP_DATA_PRE66_67  0x10
    13 #define OP_WORD           0x20
    14 #define OP_REL32          0x40
    15 
    16 unsigned long __fastcall SizeOfCode(void *Code, unsigned char **pOpcode);
    17 
    18 unsigned long __fastcall SizeOfProc(void *Proc);
    19 
    20 BOOL
    21 WriteReadOnlyMemory(
    22                     LPBYTE    lpDest,
    23                     LPBYTE    lpSource,
    24                     ULONG    Length
    25                     );
    26 
    27 BOOL 
    28 GetPatchSize(
    29              IN    void *Proc,            /* 需要Hook的函数地址 */
    30              IN    DWORD dwNeedSize,    /* Hook函数头部占用的字节大小 */
    31              OUT LPDWORD lpPatchSize    /* 返回根据函数头分析需要修补的大小 */
    32              );
    33 
    34 BOOL
    35 InlineHook(
    36            IN    void *OrgProc,        /* 需要Hook的函数地址 */
    37            IN    void *NewProc,        /* 代替被Hook函数的地址 */
    38            OUT    void **RealProc        /* 返回原始函数的入口地址 */
    39            );
    40 
    41 void UnInlineHook(
    42                   void *OrgProc,  /* 需要恢复Hook的函数地址 */
    43                   void *RealProc  /* 原始函数的入口地址 */
    44                   );

    Inlin_Hook.cpp:

      1 #include "stdafx.h"
      2 #include "Inlin_Hook.h"
      3 
      4 UCHAR OpcodeFlags[256] = 
      5 {
      6     OP_MODRM,                      // 00
      7     OP_MODRM,                      // 01
      8     OP_MODRM,                      // 02
      9     OP_MODRM,                      // 03
     10     OP_DATA_I8,                    // 04
     11     OP_DATA_PRE66_67,              // 05
     12     OP_NONE,                       // 06
     13     OP_NONE,                       // 07
     14     OP_MODRM,                      // 08
     15     OP_MODRM,                      // 09
     16     OP_MODRM,                      // 0A
     17     OP_MODRM,                      // 0B
     18     OP_DATA_I8,                    // 0C
     19     OP_DATA_PRE66_67,              // 0D
     20     OP_NONE,                       // 0E
     21     OP_NONE,                       // 0F
     22     OP_MODRM,                      // 10
     23     OP_MODRM,                      // 11
     24     OP_MODRM,                      // 12
     25     OP_MODRM,                      // 13
     26     OP_DATA_I8,                    // 14
     27     OP_DATA_PRE66_67,              // 15
     28     OP_NONE,                       // 16
     29     OP_NONE,                       // 17
     30     OP_MODRM,                      // 18
     31     OP_MODRM,                      // 19
     32     OP_MODRM,                      // 1A
     33     OP_MODRM,                      // 1B
     34     OP_DATA_I8,                    // 1C
     35     OP_DATA_PRE66_67,              // 1D
     36     OP_NONE,                       // 1E
     37     OP_NONE,                       // 1F
     38     OP_MODRM,                      // 20
     39     OP_MODRM,                      // 21
     40     OP_MODRM,                      // 22
     41     OP_MODRM,                      // 23
     42     OP_DATA_I8,                    // 24
     43     OP_DATA_PRE66_67,              // 25
     44     OP_NONE,                       // 26
     45     OP_NONE,                       // 27
     46     OP_MODRM,                      // 28
     47     OP_MODRM,                      // 29
     48     OP_MODRM,                      // 2A
     49     OP_MODRM,                      // 2B
     50     OP_DATA_I8,                    // 2C
     51     OP_DATA_PRE66_67,              // 2D
     52     OP_NONE,                       // 2E
     53     OP_NONE,                       // 2F
     54     OP_MODRM,                      // 30
     55     OP_MODRM,                      // 31
     56     OP_MODRM,                      // 32
     57     OP_MODRM,                      // 33
     58     OP_DATA_I8,                    // 34
     59     OP_DATA_PRE66_67,              // 35
     60     OP_NONE,                       // 36
     61     OP_NONE,                       // 37
     62     OP_MODRM,                      // 38
     63     OP_MODRM,                      // 39
     64     OP_MODRM,                      // 3A
     65     OP_MODRM,                      // 3B
     66     OP_DATA_I8,                    // 3C
     67     OP_DATA_PRE66_67,              // 3D
     68     OP_NONE,                       // 3E
     69     OP_NONE,                       // 3F
     70     OP_NONE,                       // 40
     71     OP_NONE,                       // 41
     72     OP_NONE,                       // 42
     73     OP_NONE,                       // 43
     74     OP_NONE,                       // 44
     75     OP_NONE,                       // 45
     76     OP_NONE,                       // 46
     77     OP_NONE,                       // 47
     78     OP_NONE,                       // 48
     79     OP_NONE,                       // 49
     80     OP_NONE,                       // 4A
     81     OP_NONE,                       // 4B
     82     OP_NONE,                       // 4C
     83     OP_NONE,                       // 4D
     84     OP_NONE,                       // 4E
     85     OP_NONE,                       // 4F
     86     OP_NONE,                       // 50
     87     OP_NONE,                       // 51
     88     OP_NONE,                       // 52
     89     OP_NONE,                       // 53
     90     OP_NONE,                       // 54
     91     OP_NONE,                       // 55
     92     OP_NONE,                       // 56
     93     OP_NONE,                       // 57
     94     OP_NONE,                       // 58
     95     OP_NONE,                       // 59
     96     OP_NONE,                       // 5A
     97     OP_NONE,                       // 5B
     98     OP_NONE,                       // 5C
     99     OP_NONE,                       // 5D
    100     OP_NONE,                       // 5E
    101     OP_NONE,                       // 5F
    102     OP_NONE,                       // 60
    103     OP_NONE,                       // 61
    104     OP_MODRM,                      // 62
    105     OP_MODRM,                      // 63
    106     OP_NONE,                       // 64
    107     OP_NONE,                       // 65
    108     OP_NONE,                       // 66
    109     OP_NONE,                       // 67
    110     OP_DATA_PRE66_67,              // 68
    111     OP_MODRM | OP_DATA_PRE66_67,   // 69
    112     OP_DATA_I8,                    // 6A
    113     OP_MODRM | OP_DATA_I8,         // 6B
    114     OP_NONE,                       // 6C
    115     OP_NONE,                       // 6D
    116     OP_NONE,                       // 6E
    117     OP_NONE,                       // 6F
    118     OP_DATA_I8,                    // 70
    119     OP_DATA_I8,                    // 71
    120     OP_DATA_I8,                    // 72
    121     OP_DATA_I8,                    // 73
    122     OP_DATA_I8,                    // 74
    123     OP_DATA_I8,                    // 75
    124     OP_DATA_I8,                    // 76
    125     OP_DATA_I8,                    // 77
    126     OP_DATA_I8,                    // 78
    127     OP_DATA_I8,                    // 79
    128     OP_DATA_I8,                    // 7A
    129     OP_DATA_I8,                    // 7B
    130     OP_DATA_I8,                    // 7C
    131     OP_DATA_I8,                    // 7D
    132     OP_DATA_I8,                    // 7E
    133     OP_DATA_I8,                    // 7F
    134     OP_MODRM | OP_DATA_I8,         // 80
    135     OP_MODRM | OP_DATA_PRE66_67,   // 81
    136     OP_MODRM | OP_DATA_I8,         // 82
    137     OP_MODRM | OP_DATA_I8,         // 83
    138     OP_MODRM,                      // 84
    139     OP_MODRM,                      // 85
    140     OP_MODRM,                      // 86
    141     OP_MODRM,                      // 87
    142     OP_MODRM,                      // 88
    143     OP_MODRM,                      // 89
    144     OP_MODRM,                      // 8A
    145     OP_MODRM,                      // 8B
    146     OP_MODRM,                      // 8C
    147     OP_MODRM,                      // 8D
    148     OP_MODRM,                      // 8E
    149     OP_MODRM,                      // 8F
    150     OP_NONE,                       // 90
    151     OP_NONE,                       // 91
    152     OP_NONE,                       // 92
    153     OP_NONE,                       // 93
    154     OP_NONE,                       // 94
    155     OP_NONE,                       // 95
    156     OP_NONE,                       // 96
    157     OP_NONE,                       // 97
    158     OP_NONE,                       // 98
    159     OP_NONE,                       // 99
    160     OP_DATA_I16 | OP_DATA_PRE66_67,// 9A
    161     OP_NONE,                       // 9B
    162     OP_NONE,                       // 9C
    163     OP_NONE,                       // 9D
    164     OP_NONE,                       // 9E
    165     OP_NONE,                       // 9F
    166     OP_DATA_PRE66_67,              // A0
    167     OP_DATA_PRE66_67,              // A1
    168     OP_DATA_PRE66_67,              // A2
    169     OP_DATA_PRE66_67,              // A3
    170     OP_NONE,                       // A4
    171     OP_NONE,                       // A5
    172     OP_NONE,                       // A6
    173     OP_NONE,                       // A7
    174     OP_DATA_I8,                    // A8
    175     OP_DATA_PRE66_67,              // A9
    176     OP_NONE,                       // AA
    177     OP_NONE,                       // AB
    178     OP_NONE,                       // AC
    179     OP_NONE,                       // AD
    180     OP_NONE,                       // AE
    181     OP_NONE,                       // AF
    182     OP_DATA_I8,                    // B0
    183     OP_DATA_I8,                    // B1
    184     OP_DATA_I8,                    // B2
    185     OP_DATA_I8,                    // B3
    186     OP_DATA_I8,                    // B4
    187     OP_DATA_I8,                    // B5
    188     OP_DATA_I8,                    // B6
    189     OP_DATA_I8,                    // B7
    190     OP_DATA_PRE66_67,              // B8
    191     OP_DATA_PRE66_67,              // B9
    192     OP_DATA_PRE66_67,              // BA
    193     OP_DATA_PRE66_67,              // BB
    194     OP_DATA_PRE66_67,              // BC
    195     OP_DATA_PRE66_67,              // BD
    196     OP_DATA_PRE66_67,              // BE
    197     OP_DATA_PRE66_67,              // BF
    198     OP_MODRM | OP_DATA_I8,         // C0
    199     OP_MODRM | OP_DATA_I8,         // C1
    200     OP_DATA_I16,                   // C2
    201     OP_NONE,                       // C3
    202     OP_MODRM,                      // C4
    203     OP_MODRM,                      // C5
    204     OP_MODRM   | OP_DATA_I8,       // C6
    205     OP_MODRM   | OP_DATA_PRE66_67, // C7
    206     OP_DATA_I8 | OP_DATA_I16,      // C8
    207     OP_NONE,                       // C9
    208     OP_DATA_I16,                   // CA
    209     OP_NONE,                       // CB
    210     OP_NONE,                       // CC
    211     OP_DATA_I8,                    // CD
    212     OP_NONE,                       // CE
    213     OP_NONE,                       // CF
    214     OP_MODRM,                      // D0
    215     OP_MODRM,                      // D1
    216     OP_MODRM,                      // D2
    217     OP_MODRM,                      // D3
    218     OP_DATA_I8,                    // D4
    219     OP_DATA_I8,                    // D5
    220     OP_NONE,                       // D6
    221     OP_NONE,                       // D7
    222     OP_WORD,                       // D8
    223     OP_WORD,                       // D9
    224     OP_WORD,                       // DA
    225     OP_WORD,                       // DB
    226     OP_WORD,                       // DC
    227     OP_WORD,                       // DD
    228     OP_WORD,                       // DE
    229     OP_WORD,                       // DF
    230     OP_DATA_I8,                    // E0
    231     OP_DATA_I8,                    // E1
    232     OP_DATA_I8,                    // E2
    233     OP_DATA_I8,                    // E3
    234     OP_DATA_I8,                    // E4
    235     OP_DATA_I8,                    // E5
    236     OP_DATA_I8,                    // E6
    237     OP_DATA_I8,                    // E7
    238     OP_DATA_PRE66_67 | OP_REL32,   // E8
    239     OP_DATA_PRE66_67 | OP_REL32,   // E9
    240     OP_DATA_I16 | OP_DATA_PRE66_67,// EA
    241     OP_DATA_I8,                    // EB
    242     OP_NONE,                       // EC
    243     OP_NONE,                       // ED
    244     OP_NONE,                       // EE
    245     OP_NONE,                       // EF
    246     OP_NONE,                       // F0
    247     OP_NONE,                       // F1
    248     OP_NONE,                       // F2
    249     OP_NONE,                       // F3
    250     OP_NONE,                       // F4
    251     OP_NONE,                       // F5
    252     OP_MODRM,                      // F6
    253     OP_MODRM,                      // F7
    254     OP_NONE,                       // F8
    255     OP_NONE,                       // F9
    256     OP_NONE,                       // FA
    257     OP_NONE,                       // FB
    258     OP_NONE,                       // FC
    259     OP_NONE,                       // FD
    260     OP_MODRM,                      // FE
    261     OP_MODRM | OP_REL32            // FF
    262 };
    263 
    264 
    265 UCHAR OpcodeFlagsExt[256] =
    266 {
    267     OP_MODRM,                      // 00
    268     OP_MODRM,                      // 01
    269     OP_MODRM,                      // 02
    270     OP_MODRM,                      // 03
    271     OP_NONE,                       // 04
    272     OP_NONE,                       // 05
    273     OP_NONE,                       // 06
    274     OP_NONE,                       // 07
    275     OP_NONE,                       // 08
    276     OP_NONE,                       // 09
    277     OP_NONE,                       // 0A
    278     OP_NONE,                       // 0B
    279     OP_NONE,                       // 0C
    280     OP_MODRM,                      // 0D
    281     OP_NONE,                       // 0E
    282     OP_MODRM | OP_DATA_I8,         // 0F
    283     OP_MODRM,                      // 10
    284     OP_MODRM,                      // 11
    285     OP_MODRM,                      // 12
    286     OP_MODRM,                      // 13
    287     OP_MODRM,                      // 14
    288     OP_MODRM,                      // 15
    289     OP_MODRM,                      // 16
    290     OP_MODRM,                      // 17
    291     OP_MODRM,                      // 18
    292     OP_NONE,                       // 19
    293     OP_NONE,                       // 1A
    294     OP_NONE,                       // 1B
    295     OP_NONE,                       // 1C
    296     OP_NONE,                       // 1D
    297     OP_NONE,                       // 1E
    298     OP_NONE,                       // 1F
    299     OP_MODRM,                      // 20
    300     OP_MODRM,                      // 21
    301     OP_MODRM,                      // 22
    302     OP_MODRM,                      // 23
    303     OP_MODRM,                      // 24
    304     OP_NONE,                       // 25
    305     OP_MODRM,                      // 26
    306     OP_NONE,                       // 27
    307     OP_MODRM,                      // 28
    308     OP_MODRM,                      // 29
    309     OP_MODRM,                      // 2A
    310     OP_MODRM,                      // 2B
    311     OP_MODRM,                      // 2C
    312     OP_MODRM,                      // 2D
    313     OP_MODRM,                      // 2E
    314     OP_MODRM,                      // 2F
    315     OP_NONE,                       // 30
    316     OP_NONE,                       // 31
    317     OP_NONE,                       // 32
    318     OP_NONE,                       // 33
    319     OP_NONE,                       // 34
    320     OP_NONE,                       // 35
    321     OP_NONE,                       // 36
    322     OP_NONE,                       // 37
    323     OP_NONE,                       // 38
    324     OP_NONE,                       // 39
    325     OP_NONE,                       // 3A
    326     OP_NONE,                       // 3B
    327     OP_NONE,                       // 3C
    328     OP_NONE,                       // 3D
    329     OP_NONE,                       // 3E
    330     OP_NONE,                       // 3F
    331     OP_MODRM,                      // 40
    332     OP_MODRM,                      // 41
    333     OP_MODRM,                      // 42
    334     OP_MODRM,                      // 43
    335     OP_MODRM,                      // 44
    336     OP_MODRM,                      // 45
    337     OP_MODRM,                      // 46
    338     OP_MODRM,                      // 47
    339     OP_MODRM,                      // 48
    340     OP_MODRM,                      // 49
    341     OP_MODRM,                      // 4A
    342     OP_MODRM,                      // 4B
    343     OP_MODRM,                      // 4C
    344     OP_MODRM,                      // 4D
    345     OP_MODRM,                      // 4E
    346     OP_MODRM,                      // 4F
    347     OP_MODRM,                      // 50
    348     OP_MODRM,                      // 51
    349     OP_MODRM,                      // 52
    350     OP_MODRM,                      // 53
    351     OP_MODRM,                      // 54
    352     OP_MODRM,                      // 55
    353     OP_MODRM,                      // 56
    354     OP_MODRM,                      // 57
    355     OP_MODRM,                      // 58
    356     OP_MODRM,                      // 59
    357     OP_MODRM,                      // 5A
    358     OP_MODRM,                      // 5B
    359     OP_MODRM,                      // 5C
    360     OP_MODRM,                      // 5D
    361     OP_MODRM,                      // 5E
    362     OP_MODRM,                      // 5F
    363     OP_MODRM,                      // 60
    364     OP_MODRM,                      // 61
    365     OP_MODRM,                      // 62
    366     OP_MODRM,                      // 63
    367     OP_MODRM,                      // 64
    368     OP_MODRM,                      // 65
    369     OP_MODRM,                      // 66
    370     OP_MODRM,                      // 67
    371     OP_MODRM,                      // 68
    372     OP_MODRM,                      // 69
    373     OP_MODRM,                      // 6A
    374     OP_MODRM,                      // 6B
    375     OP_MODRM,                      // 6C
    376     OP_MODRM,                      // 6D
    377     OP_MODRM,                      // 6E
    378     OP_MODRM,                      // 6F
    379     OP_MODRM | OP_DATA_I8,         // 70
    380     OP_MODRM | OP_DATA_I8,         // 71
    381     OP_MODRM | OP_DATA_I8,         // 72
    382     OP_MODRM | OP_DATA_I8,         // 73
    383     OP_MODRM,                      // 74
    384     OP_MODRM,                      // 75
    385     OP_MODRM,                      // 76
    386     OP_NONE,                       // 77
    387     OP_NONE,                       // 78
    388     OP_NONE,                       // 79
    389     OP_NONE,                       // 7A
    390     OP_NONE,                       // 7B
    391     OP_MODRM,                      // 7C
    392     OP_MODRM,                      // 7D
    393     OP_MODRM,                      // 7E
    394     OP_MODRM,                      // 7F
    395     OP_DATA_PRE66_67 | OP_REL32,   // 80
    396     OP_DATA_PRE66_67 | OP_REL32,   // 81
    397     OP_DATA_PRE66_67 | OP_REL32,   // 82
    398     OP_DATA_PRE66_67 | OP_REL32,   // 83
    399     OP_DATA_PRE66_67 | OP_REL32,   // 84
    400     OP_DATA_PRE66_67 | OP_REL32,   // 85
    401     OP_DATA_PRE66_67 | OP_REL32,   // 86
    402     OP_DATA_PRE66_67 | OP_REL32,   // 87
    403     OP_DATA_PRE66_67 | OP_REL32,   // 88
    404     OP_DATA_PRE66_67 | OP_REL32,   // 89
    405     OP_DATA_PRE66_67 | OP_REL32,   // 8A
    406     OP_DATA_PRE66_67 | OP_REL32,   // 8B
    407     OP_DATA_PRE66_67 | OP_REL32,   // 8C
    408     OP_DATA_PRE66_67 | OP_REL32,   // 8D
    409     OP_DATA_PRE66_67 | OP_REL32,   // 8E
    410     OP_DATA_PRE66_67 | OP_REL32,   // 8F
    411     OP_MODRM,                      // 90
    412     OP_MODRM,                      // 91
    413     OP_MODRM,                      // 92
    414     OP_MODRM,                      // 93
    415     OP_MODRM,                      // 94
    416     OP_MODRM,                      // 95
    417     OP_MODRM,                      // 96
    418     OP_MODRM,                      // 97
    419     OP_MODRM,                      // 98
    420     OP_MODRM,                      // 99
    421     OP_MODRM,                      // 9A
    422     OP_MODRM,                      // 9B
    423     OP_MODRM,                      // 9C
    424     OP_MODRM,                      // 9D
    425     OP_MODRM,                      // 9E
    426     OP_MODRM,                      // 9F
    427     OP_NONE,                       // A0
    428     OP_NONE,                       // A1
    429     OP_NONE,                       // A2
    430     OP_MODRM,                      // A3
    431     OP_MODRM | OP_DATA_I8,         // A4
    432     OP_MODRM,                      // A5
    433     OP_NONE,                       // A6
    434     OP_NONE,                       // A7
    435     OP_NONE,                       // A8
    436     OP_NONE,                       // A9
    437     OP_NONE,                       // AA
    438     OP_MODRM,                      // AB
    439     OP_MODRM | OP_DATA_I8,         // AC
    440     OP_MODRM,                      // AD
    441     OP_MODRM,                      // AE
    442     OP_MODRM,                      // AF
    443     OP_MODRM,                      // B0
    444     OP_MODRM,                      // B1
    445     OP_MODRM,                      // B2
    446     OP_MODRM,                      // B3
    447     OP_MODRM,                      // B4
    448     OP_MODRM,                      // B5
    449     OP_MODRM,                      // B6
    450     OP_MODRM,                      // B7
    451     OP_NONE,                       // B8
    452     OP_NONE,                       // B9
    453     OP_MODRM | OP_DATA_I8,         // BA
    454     OP_MODRM,                      // BB
    455     OP_MODRM,                      // BC
    456     OP_MODRM,                      // BD
    457     OP_MODRM,                      // BE
    458     OP_MODRM,                      // BF
    459     OP_MODRM,                      // C0
    460     OP_MODRM,                      // C1
    461     OP_MODRM | OP_DATA_I8,         // C2
    462     OP_MODRM,                      // C3
    463     OP_MODRM | OP_DATA_I8,         // C4
    464     OP_MODRM | OP_DATA_I8,         // C5
    465     OP_MODRM | OP_DATA_I8,         // C6 
    466     OP_MODRM,                      // C7
    467     OP_NONE,                       // C8
    468     OP_NONE,                       // C9
    469     OP_NONE,                       // CA
    470     OP_NONE,                       // CB
    471     OP_NONE,                       // CC
    472     OP_NONE,                       // CD
    473     OP_NONE,                       // CE
    474     OP_NONE,                       // CF
    475     OP_MODRM,                      // D0
    476     OP_MODRM,                      // D1
    477     OP_MODRM,                      // D2
    478     OP_MODRM,                      // D3
    479     OP_MODRM,                      // D4
    480     OP_MODRM,                      // D5
    481     OP_MODRM,                      // D6
    482     OP_MODRM,                      // D7
    483     OP_MODRM,                      // D8
    484     OP_MODRM,                      // D9
    485     OP_MODRM,                      // DA
    486     OP_MODRM,                      // DB
    487     OP_MODRM,                      // DC
    488     OP_MODRM,                      // DD
    489     OP_MODRM,                      // DE
    490     OP_MODRM,                      // DF
    491     OP_MODRM,                      // E0
    492     OP_MODRM,                      // E1
    493     OP_MODRM,                      // E2
    494     OP_MODRM,                      // E3
    495     OP_MODRM,                      // E4
    496     OP_MODRM,                      // E5
    497     OP_MODRM,                      // E6
    498     OP_MODRM,                      // E7
    499     OP_MODRM,                      // E8
    500     OP_MODRM,                      // E9
    501     OP_MODRM,                      // EA
    502     OP_MODRM,                      // EB
    503     OP_MODRM,                      // EC
    504     OP_MODRM,                      // ED
    505     OP_MODRM,                      // EE
    506     OP_MODRM,                      // EF
    507     OP_MODRM,                      // F0
    508     OP_MODRM,                      // F1
    509     OP_MODRM,                      // F2
    510     OP_MODRM,                      // F3
    511     OP_MODRM,                      // F4
    512     OP_MODRM,                      // F5
    513     OP_MODRM,                      // F6
    514     OP_MODRM,                      // F7 
    515     OP_MODRM,                      // F8
    516     OP_MODRM,                      // F9
    517     OP_MODRM,                      // FA
    518     OP_MODRM,                      // FB
    519     OP_MODRM,                      // FC
    520     OP_MODRM,                      // FD
    521     OP_MODRM,                      // FE
    522     OP_NONE                        // FF
    523 };
    524 
    525 unsigned long __fastcall SizeOfCode(void *Code, unsigned char **pOpcode)
    526 {
    527     PUCHAR cPtr;
    528     UCHAR Flags;
    529     BOOLEAN PFX66, PFX67;
    530     BOOLEAN SibPresent;
    531     UCHAR iMod, iRM, iReg;
    532     UCHAR OffsetSize, Add;
    533     UCHAR Opcode;
    534 
    535     OffsetSize = 0;
    536     PFX66 = FALSE;
    537     PFX67 = FALSE;
    538     cPtr = (PUCHAR)Code;
    539 
    540     while ( (*cPtr == 0x2E) || (*cPtr == 0x3E) || (*cPtr == 0x36) ||
    541             (*cPtr == 0x26) || (*cPtr == 0x64) || (*cPtr == 0x65) || 
    542             (*cPtr == 0xF0) || (*cPtr == 0xF2) || (*cPtr == 0xF3) ||
    543             (*cPtr == 0x66) || (*cPtr == 0x67) ) 
    544     {
    545         if (*cPtr == 0x66) PFX66 = TRUE;
    546         if (*cPtr == 0x67) PFX67 = TRUE;
    547         cPtr++;
    548         if (cPtr > (PUCHAR)Code + 16) return 0; 
    549     }
    550     Opcode = *cPtr;
    551     if (pOpcode) *pOpcode = cPtr; 
    552 
    553     if (*cPtr == 0x0F)
    554     {
    555         cPtr++;
    556         Flags = OpcodeFlagsExt[*cPtr];
    557     } else 
    558     {
    559         Flags = OpcodeFlags[Opcode];
    560 
    561         if (Opcode >= 0xA0 && Opcode <= 0xA3) PFX66 = PFX67;
    562     }
    563     cPtr++;
    564     if (Flags & OP_WORD) cPtr++;    
    565 
    566     if (Flags & OP_MODRM)
    567     {
    568         iMod = *cPtr >> 6;
    569         iReg = (*cPtr & 0x38) >> 3;  
    570         iRM  = *cPtr &  7;
    571         cPtr++;
    572 
    573         if ((Opcode == 0xF6) && !iReg) Flags |= OP_DATA_I8;    
    574         if ((Opcode == 0xF7) && !iReg) Flags |= OP_DATA_PRE66_67; 
    575 
    576 
    577         SibPresent = !PFX67 & (iRM == 4);
    578         switch (iMod)
    579         {
    580             case 0: 
    581               if ( PFX67 && (iRM == 6)) OffsetSize = 2;
    582               if (!PFX67 && (iRM == 5)) OffsetSize = 4; 
    583              break;
    584             case 1: OffsetSize = 1;
    585              break; 
    586             case 2: if (PFX67) OffsetSize = 2; else OffsetSize = 4;
    587              break;
    588             case 3: SibPresent = FALSE;
    589         }
    590         if (SibPresent)
    591         {
    592             if (((*cPtr & 7) == 5) && ( (!iMod) || (iMod == 2) )) OffsetSize = 4;
    593             cPtr++;
    594         }
    595         cPtr = (PUCHAR)(ULONG)cPtr + OffsetSize;
    596     }
    597 
    598     if (Flags & OP_DATA_I8)  cPtr++;
    599     if (Flags & OP_DATA_I16) cPtr += 2;
    600     if (Flags & OP_DATA_I32) cPtr += 4;
    601     if (PFX66) Add = 2; else Add = 4;
    602     if (Flags & OP_DATA_PRE66_67) cPtr += Add;
    603     return (ULONG)cPtr - (ULONG)Code;
    604 }
    605 
    606 unsigned long __fastcall SizeOfProc(void *Proc)
    607 {
    608     ULONG  Length;
    609     PUCHAR pOpcode;
    610     ULONG  Result = 0;
    611 
    612     do
    613     {
    614         Length = SizeOfCode(Proc, &pOpcode);
    615         Result += Length;
    616         if ((Length == 1) && (*pOpcode == 0xC3)) break;
    617         if ((Length == 3) && (*pOpcode == 0xC2)) break;
    618         Proc = (PVOID)((ULONG)Proc + Length);
    619     } while (Length);
    620     return Result;
    621 }
    622 
    623 BOOL
    624 WriteReadOnlyMemory(
    625     LPBYTE    lpDest,
    626     LPBYTE    lpSource,
    627     ULONG    Length
    628     )
    629 {
    630     BOOL bRet;
    631     DWORD dwOldProtect;
    632     bRet = FALSE;
    633 
    634     if (!VirtualProtect(lpDest, Length, PAGE_EXECUTE_READWRITE, &dwOldProtect))
    635     {
    636         return bRet;
    637     }
    638 
    639     memcpy(lpDest, lpSource, Length);
    640 
    641     bRet = VirtualProtect(lpDest, Length, dwOldProtect, &dwOldProtect);
    642 
    643     return    bRet;
    644 }
    645 
    646 BOOL 
    647 GetPatchSize(
    648     IN    void *Proc,            /* 需要Hook的函数地址 */
    649     IN    DWORD dwNeedSize,    /* Hook函数头部占用的字节大小 */
    650     OUT LPDWORD lpPatchSize    /* 返回根据函数头分析需要修补的大小 */
    651     )
    652 {
    653     DWORD Length;
    654     PUCHAR pOpcode;
    655     DWORD PatchSize = 0;
    656 
    657     if (!Proc || !lpPatchSize)
    658     {
    659         return FALSE;
    660     }
    661 
    662     do
    663     {
    664         Length = SizeOfCode(Proc, &pOpcode);
    665         if ((Length == 1) && (*pOpcode == 0xC3))
    666             break;
    667         if ((Length == 3) && (*pOpcode == 0xC2))
    668             break;
    669         Proc = (PVOID)((DWORD)Proc + Length);
    670 
    671         PatchSize += Length;
    672         if (PatchSize >= dwNeedSize)
    673         {
    674             break;
    675         }
    676 
    677     }while(Length);
    678 
    679     *lpPatchSize = PatchSize;
    680 
    681     return TRUE;
    682 }
    683 
    684 BOOL
    685 InlineHook(
    686     IN    void *OrgProc,        /* 需要Hook的函数地址 */
    687     IN    void *NewProc,        /* 代替被Hook函数的地址 */
    688     OUT    void **RealProc        /* 返回原始函数的入口地址 */
    689     )
    690 {
    691     DWORD dwPatchSize;    // 得到需要patch的字节大小
    692     //DWORD dwOldProtect;
    693     LPVOID lpHookFunc;    // 分配的Hook函数的内存
    694     DWORD dwBytesNeed;    // 分配的Hook函数的大小
    695     LPBYTE lpPatchBuffer; // jmp 指令的临时缓冲区
    696 
    697     if (!OrgProc || !NewProc || !RealProc)
    698     {
    699         return FALSE;
    700     }
    701     // 得到需要patch的字节大小
    702     if (!GetPatchSize(OrgProc, JMP_SIZE, &dwPatchSize))
    703     {
    704         return FALSE;
    705     }
    706 
    707     /*
    708     0x00000800                    0x00000800        sizeof(DWORD)    // dwPatchSize
    709     JMP    / FAR 0xAABBCCDD        E9 DDCCBBAA        JMP_SIZE
    710     ...                            ...                dwPatchSize        // Backup instruction
    711     JMP    / FAR 0xAABBCCDD        E9 DDCCBBAA        JMP_SIZE
    712     */
    713 
    714     dwBytesNeed = sizeof(DWORD) + JMP_SIZE + dwPatchSize + JMP_SIZE;
    715 
    716     lpHookFunc = __malloc(dwBytesNeed);
    717 
    718     //备份dwPatchSize到lpHookFunc
    719     *(DWORD *)lpHookFunc = dwPatchSize;
    720 
    721     //跳过开头的4个字节
    722     lpHookFunc = (LPVOID)((DWORD)lpHookFunc + sizeof(DWORD));
    723 
    724     //开始backup函数开头的字
    725     memcpy((BYTE *)lpHookFunc + JMP_SIZE, OrgProc, dwPatchSize);
    726 
    727     lpPatchBuffer = (LPBYTE)__malloc(dwPatchSize);
    728 
    729     //NOP填充
    730     memset(lpPatchBuffer, 0x90, dwPatchSize);
    731 
    732     //jmp到Hook
    733     *(BYTE *)lpHookFunc = 0xE9;
    734     *(DWORD*)((DWORD)lpHookFunc + 1) = (DWORD)NewProc - (DWORD)lpHookFunc - JMP_SIZE;
    735 
    736     //跳回原始
    737     *(BYTE *)((DWORD)lpHookFunc + 5 + dwPatchSize) = 0xE9;
    738     *(DWORD*)((DWORD)lpHookFunc + 5 + dwPatchSize + 1) = ((DWORD)OrgProc + dwPatchSize) - ((DWORD)lpHookFunc + JMP_SIZE + dwPatchSize) - JMP_SIZE;
    739 
    740 
    741     //jmp 
    742     *(BYTE *)lpPatchBuffer = 0xE9;
    743     //注意计算长度的时候得用OrgProc
    744     *(DWORD*)(lpPatchBuffer + 1) = (DWORD)lpHookFunc - (DWORD)OrgProc - JMP_SIZE;
    745 
    746     WriteReadOnlyMemory((LPBYTE)OrgProc, lpPatchBuffer, dwPatchSize);
    747 
    748     __free(lpPatchBuffer);
    749 
    750     *RealProc = (void *)((DWORD)lpHookFunc + JMP_SIZE);
    751 
    752     return TRUE;
    753 }
    754 
    755 void UnInlineHook(
    756     void *OrgProc,  /* 需要恢复Hook的函数地址 */
    757     void *RealProc  /* 原始函数的入口地址 */
    758     )
    759 {
    760     DWORD dwPatchSize;
    761     //DWORD dwOldProtect;
    762     LPBYTE lpBuffer;
    763 
    764     //找到分配的空间
    765     lpBuffer = (LPBYTE)((DWORD)RealProc - (sizeof(DWORD) + JMP_SIZE));
    766     //得到dwPatchSize
    767     dwPatchSize = *(DWORD *)lpBuffer;
    768 
    769     WriteReadOnlyMemory((LPBYTE)OrgProc, (LPBYTE)RealProc, dwPatchSize);
    770 
    771     //释放分配的跳转函数的空间
    772     __free(lpBuffer);
    773 
    774     return;
    775 }

    使用方法见上一篇控制除WORD外的打印份数DllMain中部分

  • 相关阅读:
    PHP中curl_init和file_get_contents配合使用
    在PHP语言中使用JSON
    网页中获取IFrame内容
    Golden Gate
    windows 7某些中文程序乱码
    Oracle的同义词(synonyms)总结
    VERITAS容灾技术方案
    VERITAS 备份及容灾方案建议书
    1 FAST ESP 简介
    Linux文件查找命令find,xargs详述
  • 原文地址:https://www.cnblogs.com/02xiaoma/p/2765300.html
Copyright © 2011-2022 走看看