从看雪的一个沙箱代码中扣出的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中部分

原文地址:https://www.cnblogs.com/02xiaoma/p/2765300.html