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