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中部分

  • 相关阅读:
    序列JSON数据和四种AJAX操作方式
    jquery.validate和jquery.form.js实现表单提交
    JQuery Validate使用总结1:
    HOWTO: Include Base64 Encoded Binary Image Data (data URI scheme) in Inline Cascading Style Sheets (CSS)(转)
    SharePoint 2007 使用4.0 .Net
    动态IP解决方案
    取MS CRM表单的URL
    从Iframe或新开的窗口访问MS CRM 2011(转)
    Toggle or Hidden MS CRM Tab
    Windows 2008下修改域用户密码
  • 原文地址:https://www.cnblogs.com/02xiaoma/p/2765300.html
Copyright © 2011-2022 走看看