首页
社区
课程
招聘
[转帖]XP/2003/VISTA R0 HOOK 函数源码
发表于: 2008-8-11 07:33 5058

[转帖]XP/2003/VISTA R0 HOOK 函数源码

2008-8-11 07:33
5058
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
typedef struct _INLINE_HOOK_ITEM
{
    PBYTE    HookAddress;        //inlinehook 的位置
    DWORD    OrgBytesSize;        //
    //PBYTE    OrgBytes;            //原始函数字节
    PBYTE    HookBytes;            //HOOK代码 = OrgBytesSize + 14字节
}INLINE_HOOK_ITEM, *PINLINE_HOOK_ITEM;
 
////////////////////////////////
// DisassembleMem32
////////////////////////////////
DWORD DisassembleMem32(PBYTE pbCode)
{
BYTE      bmodrm;
 
//----------------
bmodrm = *pbCode;
 
if (bmodrm >= 0xC0)
return 1;
 
if (bmodrm >= 0x80)
return ((bmodrm & 0x07) == 0x04 ? 6 : 5);
 
if (bmodrm >= 0x40)
return ((bmodrm & 0x07) == 0x04 ? 3 : 2);
 
if ((bmodrm & 0x07) == 0x05)
return 5;
 
if ((bmodrm & 0x07) == 0x04)
return ((pbCode[1] & 0x07) == 0x05 ? 6 : 2);
 
return 1;
} //DisassembleMem32()
 
 
////////////////////////////////
// DisassembleProlog
////////////////////////////////
DWORD DisassembleProlog(
PBYTE      pbCode,
DWORD      cbMinimumRequired)
{
PBYTE      pb;
DWORD      cboperand;
 
//----------------
cboperand = 4;
 
for (pb = pbCode; (DWORD)(pb - pbCode) < cbMinimumRequired; )
{
// Potemkin's Hackers Group rocks heavy metal-style (OPCODE.LST)
 
switch (*pb++)
{
case 0x00:      // 00h: ADD mem8, reg8
case 0x01:      // 01h: ADD mem, reg
case 0x02:      // 02h: ADD reg8, mem8
case 0x03:      // 03h: ADD reg, mem
case 0x08:      // 08h: OR mem8, reg8
case 0x09:      // 09h: OR mem, reg
case 0x0A:      // 0Ah: OR reg8, mem8
case 0x0B:      // 0Bh: OR reg, mem
case 0x10:      // 10h: ADC mem8, reg8
case 0x11:      // 11h: ADC mem, reg
case 0x12:      // 12h: ADC reg8, mem8
case 0x13:      // 13h: ADC reg, mem
case 0x18:      // 18h: **B mem8, reg8
case 0x19:      // 19h: **B mem, reg
case 0x1A:      // 1Ah: **B reg8, mem8
case 0x1B:      // 1Bh: **B reg, mem
case 0x20:      // 20h: AND mem8, reg8
case 0x21:      // 21h: AND mem, reg
case 0x22:      // 22h: AND reg8, mem8
case 0x23:      // 23h: AND reg, mem
case 0x28:      // 28h: SUB mem8, reg8
case 0x29:      // 29h: SUB mem, reg
case 0x2A:      // 2Ah: SUB reg8, mem8
case 0x2B:      // 2Bh: SUB reg, mem
case 0x30:      // 30h: XOR mem8, reg8
case 0x31:      // 31h: XOR mem, reg
case 0x32:      // 32h: XOR reg8, mem8
case 0x33:      // 33h: XOR reg, mem
case 0x38:      // 38h: CMP mem8, reg8
case 0x39:      // 39h: CMP mem, reg
case 0x3A:      // 3Ah: CMP reg8, mem8
case 0x3B:      // 3Bh: CMP reg, mem
case 0x84:      // 84h: TEST mem8, reg8
case 0x85:      // 85h: TEST mem, reg
case 0x86:      // 86h: XCHG mem8, reg8
case 0x87:      // 87h: XCHG mem, reg
case 0x88:      // 88h: MOV mem8, reg8
case 0x89:      // 89h: MOV mem, reg
case 0x8A:      // 8Ah: MOV reg8, mem8
case 0x8B:      // 8Bh: MOV reg, mem
case 0x8C:      // 8Ch: mem, sreg
case 0x8D:      // 8Dh: LEA reg, mem
case 0x8E:      // 8Eh: sreg, mem
case 0x8F:      // 8Fh: POP mem
case 0xC4:      // C4h: LES reg, mem
case 0xC5:      // C5h: LDS reg, mem
case 0xD0:      // D0h: mem8, 1
case 0xD1:      // D1h: mem, 1
case 0xD2:      // D2h: mem8, CL
case 0xD3:      // D3h: mem, CL
case 0xFE:      // FEh: mem8
case 0xFF:      // FFh: mem
    pb += DisassembleMem32(pb);
    break;
 
case 0x04:      // 04h: ADD AL, imm8
case 0x0C:      // 0Ch: OR AL, imm8
case 0x14:      // 14h: ADC AL, imm8
case 0x1C:      // 1Ch: **B AL, imm8
case 0x24:      // 24h: AND AL, imm8
case 0x2C:      // 2Ch: SUB AL, imm8
case 0x34:      // 34h: XOR AL, imm8
case 0x3C:      // 3Ch: CMP AL, imm8
case 0x6A:      // 6Ah: PUSH simm8
case 0xA8:      // A8h: TEST AL, imm8
case 0xB0:      // B0h: MOV AL, imm8
case 0xB1:      // B1h: MOV CL, imm8
case 0xB2:      // B2h: MOV DL, imm8
case 0xB3:      // B3h: MOV BL, imm8
case 0xB4:      // B4h: MOV AH, imm8
case 0xB5:      // B5h: MOV CH, imm8
case 0xB6:      // B6h: MOV DH, imm8
case 0xB7:      // B7h: MOV BH, imm8
case 0xD4:      // D4h: AAM imm8
case 0xD5:      // D5h: AAD imm8
    pb++;
    break;
 
case 0x05:      // 05h: ADD EAX, imm
case 0x0D:      // 0Dh: OR EAX, imm
case 0x15:      // 15h: ADC EAX, imm
 
case 0x1D:      // 1Dh: **B EAX, imm
case 0x25:      // 25h: AND EAX, imm
case 0x2D:      // 2Dh: SUB EAX, imm
case 0x35:      // 35h: XOR EAX, imm
case 0x3D:      // 3Dh: CMP EAX, imm
case 0x68:      // 68h: PUSH imm
case 0xA9:      // A9h: TEST EAX, imm
case 0xB8:      // B8h: MOV EAX, imm
case 0xB9:      // B9h: MOV ECX, imm
case 0xBA:      // BAh: MOV EDX, imm
case 0xBB:      // BBh: MOV EBX, imm
case 0xBC:      // BCh: MOV ESP, imm
case 0xBD:      // BDh: MOV EBP, imm
case 0xBE:      // BEh: MOV ESI, imm
case 0xBF:      // BFh: MOV EDI, imm
    pb += cboperand;
    break;
 
case 0x06:      // 06h: PUSH ES
case 0x07:      // 07h: POP ES
case 0x0E:      // 0Eh: PUSH CS
case 0x16:      // 16h: PUSH SS
case 0x17:      // 17h: POP SS
case 0x1E:      // 1Eh: PUSH DS
case 0x1F:      // 1Fh: POP DS
case 0x26:      // 26h: ES:
case 0x27:      // 27h: DAA
case 0x2E:      // 2Eh: CS:
case 0x2F:      // 2Fh: DAS
case 0x36:      // 36h: SS:
case 0x37:      // 37h: AAA
case 0x3E:      // 3Eh: DS:
case 0x3F:      // 3Fh: AAS
case 0x40:      // 40h: INC EAX
case 0x41:      // 41h: INC ECX
case 0x42:      // 42h: INC EDX
case 0x43:      // 43h: INC EBX
case 0x44:      // 44h: INC ESP
case 0x45:      // 45h: INC EBP
case 0x46:      // 46h: INC ESI
case 0x47:      // 47h: INC EDI
case 0x48:      // 48h: DEC EAX
case 0x49:      // 49h: DEC ECX
case 0x4A:      // 4Ah: DEC EDX
case 0x4B:      // 4Bh: DEC EBX
case 0x4C:      // 4Ch: DEC ESP
case 0x4D:      // 4Dh: DEC EBP
case 0x4E:      // 4Eh: DEC ESI
case 0x4F:      // 4Fh: DEC EDI
case 0x50:      // 50h: PUSH EAX
case 0x51:      // 51h: PUSH ECX
case 0x52:      // 52h: PUSH EDX
case 0x53:      // 53h: PUSH EBX
case 0x54:      // 54h: PUSH ESP
case 0x55:      // 55h: PUSH EBP
case 0x56:      // 56h: PUSH ESI
case 0x57:      // 57h: PUSH EDI
case 0x58:      // 58h: POP EAX
case 0x59:      // 59h: POP ECX
case 0x5A:      // 5Ah: POP EDX
case 0x5B:      // 5Bh: POP EBX
case 0x5C:      // 5Ch: POP ESP
case 0x5D:      // 5Dh: POP EBP
case 0x5E:      // 5Eh: POP ESI
case 0x5F:      // 5Fh: POP EDI
case 0x60:      // 60h: PUSHAD
case 0x61:      // 61h: POPAD
case 0x64:      // 64h: FS:
case 0x90:      // 90h: NOP
case 0x91:      // 91h: XCHG EAX, ECX
case 0x92:      // 92h: XCHG EAX, EDX
case 0x93:      // 93h: XCHG EAX, EBX
case 0x94:      // 94h: XCHG EAX, ESP
case 0x95:      // 95h: XCHG EAX, EBP
case 0x96:      // 96h: XCHG EAX, ESI
case 0x97:      // 97h: XCHG EAX, EDI
case 0x98:      // 98h: CWDE
case 0x99:      // 99h: CDQ
case 0x9C:      // 9Ch: PUSHFD
case 0x9D:      // 9Dh: POPFD
case 0x9E:      // 9Eh: SAHF
case 0x9F:      // 9Fh: LAHF
case 0xA4:      // A4h: MOV**
case 0xA5:      // A5h: MOVSD
case 0xA6:      // A6h: CMP**
case 0xA7:      // A7h: CMPSD
case 0xAA:      // AAh: STO**
case 0xAB:      // ABh: STOSD
case 0xAC:      // ACh: LOD**
case 0xAD:      // ADh: LODSD
case 0xAE:      // AEh: SCA**
case 0xAF:      // AFh: SCASD
case 0xC9:      // C9h: LEAVE
case 0xD6:      // D6h: SETALC
case 0xD7:      // D7h: XLAT
case 0xF0:      // F0h: LOCK
case 0xF2:      // F2h: REPNZ
case 0xF3:      // F3h: REP
case 0xF5:      // F5h: CMC
case 0xF8:      // F8h: CLC
case 0xF9:      // F9h: STC
case 0xFC:      // FCh: CLD
case 0xFD:      // FDh: STD
    break;
 
case 0x66:      // 66h: memory access size prefix
    cboperand = 2;
    continue;
 
case 0x69:      // 69h: IMUL reg, imm, mem
case 0x81:      // 81h: mem, imm
case 0xC7:      // C7h: MOV mem, imm
    pb += DisassembleMem32(pb) + cboperand;
    break;
 
case 0x6B:      // 6Bh: IMUL reg8, imm8, mem8
case 0x80:      // 80h: mem8, imm8
case 0x82:      // 82h: mem8, simm8
case 0x83:      // 83h: mem, simm8
case 0xC0:      // C0h: mem8, imm8
case 0xC1:      // C1h: mem, imm8
case 0xC6:      // C6h: MOV mem8, imm8
    pb += DisassembleMem32(pb) + 1;
    break;
 
case 0xA0:      // A0h: MOV AL, [ofs]
case 0xA1:      // A1h: MOV EAX, [ofs]
case 0xA2:      // A2h: MOV [ofs], AL
case 0xA3:      // A3h: MOV [ofs], EAX
    pb += 4;
    break;
 
case 0xC8:      // C8h: ENTER imm16, imm8
    pb += 3;
    break;
 
case 0xF6:      // F6h/0: TEST mem8, imm8; F6h/{1..7}: mem8
    pb += DisassembleMem32(pb) + ((*pb & 0x38) == 0x00 ? 1 : 0);
    break;
 
case 0xF7:      // F7h/0: TEST mem, imm; F7h/{1..7}: mem
    pb += DisassembleMem32(pb) + ((*pb & 0x38) == 0x00 ? cboperand : 0);
    break;
 
case 0x0F:
    switch (*pb++)
    {
    case 0x0D:    // 0Fh/0Dh: mem
    case 0x18:    // 0Fh/18h: mem
    case 0x90:    // 0Fh/90h: SETO mem8
    case 0x91:    // 0Fh/91h: SETNO mem8
    case 0x92:    // 0Fh/92h: SETC mem8
    case 0x93:    // 0Fh/93h: SETNC mem8
    case 0x94:    // 0Fh/94h: SETZ mem8
    case 0x95:    // 0Fh/95h: SETNZ mem8
    case 0x96:    // 0Fh/96h: SETNA mem8
    case 0x97:    // 0Fh/97h: SETA mem8
    case 0x98:    // 0Fh/98h: SETS mem8
    case 0x99:    // 0Fh/99h: SETNS mem8
    case 0x9A:    // 0Fh/9Ah: SETP mem8
    case 0x9B:    // 0Fh/9Bh: SETNP mem8
    case 0x9C:    // 0Fh/9Ch: SETL mem8
    case 0x9D:    // 0Fh/9Dh: SETNL mem8
    case 0x9E:    // 0Fh/9Eh: SETNG mem8
    case 0x9F:    // 0Fh/9Fh: SETG mem8
    case 0xA3:    // 0Fh/A3h: BT mem, reg
    case 0xA5:    // 0Fh/A5h: SHLD mem, reg, CL
    case 0xAB:    // 0Fh/ABh: BTS mem, reg
    case 0xAD:    // 0Fh/ADh: SHRD mem, reg, CL
    case 0xAF:    // 0Fh/AFh: IMUL reg, mem
    case 0xB3:    // 0Fh/B3h: BTR mem, reg
    case 0xB4:    // 0Fh/B4h: LFS reg, mem
    case 0xB5:    // 0Fh/B5h: LGS reg, mem
    case 0xB6:    // 0Fh/B6h: MOVZX reg, mem8
    case 0xB7:    // 0Fh/B7h: MOVZX reg, mem16
    case 0xBB:    // 0Fh/BBh: BTC mem, reg
    case 0xBC:    // 0Fh/BCh: BSF mem, reg
    case 0xBD:    // 0Fh/BDh: BSR mem, reg
    case 0xBE:    // 0Fh/BEh: MOVSX reg, mem8
    case 0xBF:    // 0Fh/BFh: MOVSX reg, mem16
    case 0xC0:    // 0Fh/C0h: XADD mem8, reg8
    case 0xC1:    // 0Fh/C1h: XADD mem, reg
    case 0xC7:    // 0Fh/C7h/0: CMPXCHG8B mem
      pb += DisassembleMem32(pb);
      break;
 
    case 0xA0:    // 0Fh/A0h: PUSH FS
    case 0xA1:    // 0Fh/A1h: POP FS
    case 0xA8:    // 0Fh/A8h: PUSH GS
    case 0xA9:    // 0Fh/A9h: POP GS
    case 0xC8:    // 0Fh/C8h: BSWAP EAX
    case 0xC9:    // 0Fh/C9h: BSWAP ECX
    case 0xCA:    // 0Fh/CAh: BSWAP EDX
    case 0xCB:    // 0Fh/CBh: BSWAP EBX
    case 0xCC:    // 0Fh/CCh: BSWAP ESP
    case 0xCD:    // 0Fh/CDh: BSWAP EBP
    case 0xCE:    // 0Fh/CEh: BSWAP ESI
    case 0xCF:    // 0Fh/CFh: BSWAP EDI
      break;
 
    case 0xA4:    // 0Fh/A4h: SHLD mem, reg, imm8
    case 0xAC:    // 0Fh/ACh: SHRD mem, reg, imm8
    case 0xBA:    // 0Fh/BAh: mem, imm8
      pb += DisassembleMem32(pb) + 1;
      break;
 
    default:
      return 0;
    }
    break; //case 0x0F
 
default:
    return 0;
} //switch(*pb)
 
cboperand = 4;
} //for(pb)
 
return (DWORD)(pb - pbCode);
} //DisassembleProlog()
 
__declspec(naked) void InLineHookHead()
{
    __asm
    {
        POP EAX;
        PUSH 0xAAAAAAAA;            //OrgFunction
        PUSH EAX;
        _emit 0xea;
        _emit 0xbb;
        _emit 0xbb;
        _emit 0xbb;
        _emit 0xbb;
        _emit 0x08;
        _emit 0x00;
        //POP EAX;                    
        //MOV EAX, 0xBBBBBBBB;        //MyHookFunction - 注意调用方式
        //CALL EAX;
        //INT 3;
        //ADD ESP, 8;
        //PUSH dword ptr [ESP - 8];
    }
}
void InLineHookHeadEnd(){}
 
DWORD
SetupInlineHook(
               IN OUT PBYTE FunctionAddress,
               IN PBYTE NewAddress
    )
{
    PINLINE_HOOK_ITEM hook_item = NULL;
    PBYTE jmp_back = NULL;
 
    UINT i, call_head_len;
      
    if (!FunctionAddress || !NewAddress)
        return 0;
 
    hook_item = ExAllocatePool(NonPagedPool, sizeof(INLINE_HOOK_ITEM));
    hook_item->HookAddress = FunctionAddress;
    hook_item->OrgBytesSize = DisassembleProlog(FunctionAddress, 7);    //JMP FAR 0008:0xffffffff
    call_head_len = (ULONG)InLineHookHeadEnd - (ULONG)InLineHookHead;//头字节数
 
    hook_item->HookBytes = ExAllocatePool(NonPagedPool, hook_item->OrgBytesSize + call_head_len + 7);
    //------------------------------------------------------------
    //填写HookHeader Bytes
    memcpy(hook_item->HookBytes, (PBYTE)InLineHookHead, call_head_len);
    for (i=0; i<call_head_len; i++)
    {
        if (*(PULONG)&hook_item->HookBytes == 0xAAAAAAAA)
        {
            *(PULONG)&hook_item->HookBytes = (ULONG)hook_item->HookBytes + call_head_len;
            i += 4;
        }
        if (*(PULONG)&hook_item->HookBytes == 0xBBBBBBBB)
        {
            *(PULONG)&hook_item->HookBytes = (ULONG)NewAddress;
            i += 4;
        }
    }
    //here is old bytes
    memcpy(hook_item->HookBytes + call_head_len, FunctionAddress, hook_item->OrgBytesSize);
    //7 bytes jmp back
    jmp_back = hook_item->HookBytes + call_head_len + hook_item->OrgBytesSize;
    jmp_back[0] = 0xEA;
    *(PULONG)&jmp_back[1] = (ULONG)(FunctionAddress + hook_item->OrgBytesSize);
    jmp_back[5] = 0x08;
    jmp_back[6] = 0x00;
    //------------------------------------------------------------
    //setup inline hook
    //------------------------------------------------------------
    _asm
    {
        MOV EAX, CR0;            //move CR0 register into EAX
        AND EAX, NOT 10000H;    //disable WP bit
        MOV CR0, EAX;            //write register back
    }
    hook_item->HookAddress[0] = 0xEA;//JMP FAR 0008:0xffffffff
    *(PULONG)&hook_item->HookAddress[1] = (ULONG)hook_item->HookBytes;
    hook_item->HookAddress[5] = 0x08;
    hook_item->HookAddress[6] = 0x00;
    for (i=7; i<hook_item->OrgBytesSize; i++)//fill nop
        hook_item->HookAddress = 0x90;
    _asm
    {
        MOV EAX, CR0;
        OR EAX, 10000H;
        MOV CR0, EAX;
    }
    //------------------------------------------------------------
    KdPrint(("Hook At %08x\n", FunctionAddress));
      
    return (DWORD)hook_item;
}
 
//下面是简单的测试--win2000以及win2003SP1测试通过
 
SetupInlineHook((PBYTE)PacketSend, (PBYTE)InLineHookPacketSend);
 
NDIS_STATUS
InLineHookPacketSend(
                     SEND_HANDLER               OrgPacketSend,
                     IN    NDIS_HANDLE               MacBindingHandle,
                     IN    PNDIS_PACKET            Packet
                     )
{
 
    KdPrint(("InLineHookPacketSend %08x, %08x, %08x!!!\n", OrgPacketSend, MacBindingHandle, Packet));
    return OrgPacketSend(MacBindingHandle, Packet);    
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (2)
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
2
晕!转我的代码麻烦贴下我的名号
boywhp
2008-8-11 07:56
0
雪    币: 321
活跃值: (276)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
呵呵,学习1234
2008-8-11 09:16
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册