(转)SSDT&Shadow Hook的实现,完整代码

http://bbs.pediy.com/showthread.php?t=138747&highlight=inline+hook

View Code
   1 #include <ntddk.h>
   2 //辛苦了几周的成果
   3 
   4 
   5 typedef struct ServiceDescriptorEntry {
   6   PVOID *ServiceTableBase;
   7   ULONG *ServiceCounterTableBase; //Used only in checked build
   8   ULONG NumberOfService;   //Null
   9   PVOID *ParamTableBase;
  10 } ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
  11 
  12 PServiceDescriptorTableEntry KeServiceDescriptorTableShadow;
  13 
  14 __declspec(dllimport) _stdcall KeAddSystemServiceTable(PVOID, PVOID, PVOID, PVOID, PVOID);
  15 __declspec(dllimport)  ServiceDescriptorTableEntry KeServiceDescriptorTable;
  16 
  17 //---------------------------------------------------
  18 
  19 typedef enum _SYSTEM_INFORMATION_CLASS {
  20 SystemBasicInformation, // 0 Y N
  21 SystemProcessorInformation, // 1 Y N
  22 SystemPerformanceInformation, // 2 Y N
  23 SystemTimeOfDayInformation, // 3 Y N
  24 SystemNotImplemented1, // 4 Y N
  25 SystemProcessesAndThreadsInformation, // 5 Y N
  26 SystemCallCounts, // 6 Y N
  27 SystemConfigurationInformation, // 7 Y N
  28 SystemProcessorTimes, // 8 Y N
  29 SystemGlobalFlag, // 9 Y Y
  30 SystemNotImplemented2, // 10 Y N
  31 SystemModuleInformation, // 11 Y N
  32 SystemLockInformation, // 12 Y N
  33 SystemNotImplemented3, // 13 Y N
  34 SystemNotImplemented4, // 14 Y N
  35 SystemNotImplemented5, // 15 Y N
  36 SystemHandleInformation, // 16 Y N
  37 SystemObjectInformation, // 17 Y N
  38 SystemPagefileInformation, // 18 Y N
  39 SystemInstructionEmulationCounts, // 19 Y N
  40 SystemInvalidInfoClass1, // 20
  41 SystemCacheInformation, // 21 Y Y
  42 SystemPoolTagInformation, // 22 Y N
  43 SystemProcessorStatistics, // 23 Y N
  44 SystemDpcInformation, // 24 Y Y
  45 SystemNotImplemented6, // 25 Y N
  46 SystemLoadImage, // 26 N Y
  47 SystemUnloadImage, // 27 N Y
  48 SystemTimeAdjustment, // 28 Y Y
  49 SystemNotImplemented7, // 29 Y N
  50 SystemNotImplemented8, // 30 Y N
  51 SystemNotImplemented9, // 31 Y N
  52 SystemCrashDumpInformation, // 32 Y N
  53 SystemExceptionInformation, // 33 Y N
  54 SystemCrashDumpStateInformation, // 34 Y Y/N
  55 SystemKernelDebuggerInformation, // 35 Y N
  56 SystemContextSwitchInformation, // 36 Y N
  57 SystemRegistryQuotaInformation, // 37 Y Y
  58 SystemLoadAndCallImage, // 38 N Y
  59 SystemPrioritySeparation, // 39 N Y
  60 SystemNotImplemented10, // 40 Y N
  61 SystemNotImplemented11, // 41 Y N
  62 SystemInvalidInfoClass2, // 42
  63 SystemInvalidInfoClass3, // 43
  64 SystemTimeZoneInformation, // 44 Y N
  65 SystemLookasideInformation, // 45 Y N
  66 SystemSetTimeSlipEvent, // 46 N Y
  67 SystemCreateSession, // 47 N Y
  68 SystemDeleteSession, // 48 N Y
  69 SystemInvalidInfoClass4, // 49
  70 SystemRangeStartInformation, // 50 Y N
  71 SystemVerifierInformation, // 51 Y Y
  72 SystemAddVerifier, // 52 N Y
  73 SystemSessionProcessesInformation // 53 Y N
  74 } SYSTEM_INFORMATION_CLASS;
  75 
  76 typedef struct _SYSTEM_MODULE_INFORMATION { // Information Class 11
  77 ULONG Reserved[2];
  78 PVOID Base;
  79 ULONG Size;
  80 ULONG Flags;
  81 USHORT Index;
  82 USHORT Unknown;
  83 USHORT LoadCount;
  84 USHORT ModuleNameOffset;
  85 CHAR ImageName[256];
  86 } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
  87 
  88 typedef struct _SYSTEM_HANDLE_INFORMATION 
  89 {
  90   ULONG ProcessId;
  91   UCHAR ObjectTypeNumber;
  92   UCHAR Flags;
  93   USHORT Handle;
  94   PVOID Object;
  95   ACCESS_MASK GrantedAccess;
  96 } _SYSTEM_HANDLE_INFORMATION, *P_SYSTEM_HANDLE_INFORMATION;
  97 
  98 typedef struct _SYSTEM_HANDLE_INformATION_EX {
  99   ULONG NumberOfHandles;
 100   _SYSTEM_HANDLE_INFORMATION Information[1];
 101 } _SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
 102 
 103 
 104 
 105 
 106 
 107 
 108 
 109 //-----------------------
 110 typedef NTSTATUS (*NTGDIGETPIXEL)
 111 (
 112 );
 113 
 114 NTGDIGETPIXEL               g_OriginalNtGdiGetPixel;
 115 
 116 
 117 //-----------------API申明-----------
 118 
 119 PVOID GetUndocumentFunctionAdress();
 120 VOID Hook();
 121 VOID Unhook();
 122 VOID WPOFF(VOID);
 123 VOID WPON(VOID);
 124 VOID InitCallNumber();
 125 VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
 126 
 127 //--------shadow-----------
 128 PVOID GetInfoTable(ULONG ATableType);
 129 HANDLE GetCsrPid();
 130 VOID KeAttPro();
 131 VOID HookShadow();
 132 VOID UnhookShadow();
 133 ULONG MyNtGdiGetPixel();
 134 
 135 NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS * pEProcess);
 136 
 137 NTSTATUS ZwQuerySystemInformation( 
 138     IN ULONG SystemInformationClass, 
 139     IN PVOID SystemInformation, 
 140     IN ULONG SystemInformationLength, 
 141     OUT PULONG ReturnLength);
 142 
 143 NTSTATUS ZwDuplicateObject(
 144                  IN HANDLE                 SourceProcessHandle,
 145                  IN PHANDLE                 SourceHandle,
 146                  IN HANDLE                 TargetProcessHandle,
 147                  OUT PHANDLE               TargetHandle,
 148                  IN ACCESS_MASK             DesiredAccess OPTIONAL,
 149                  IN BOOLEAN                 InheritHandle,
 150                  IN ULONG                   Options );
 151 
 152 NTSTATUS ZwQueryObject(
 153     IN HANDLE                ObjectHandle,
 154     IN ULONG                 ObjectInformationClass,
 155     OUT PVOID                ObjectInformation,
 156     IN ULONG                 ObjectInformationLength,
 157     OUT PULONG               ReturnLength OPTIONAL);
 158 
 159 
 160 NTSTATUS PsLookupProcessByProcessId(
 161        IN ULONG               ulProcId, 
 162        OUT PEPROCESS *        pEProcess);
 163 
 164 
 165 NTSTATUS KeAttachProcess(PEPROCESS pPeb);
 166 NTSTATUS KeDetachProcess();
 167 
 168 //--------shadow-----------
 169 
 170 
 171 
 172 
 173 
 174 
 175 //---------------全局变量------------
 176 PEPROCESS crsEProc;
 177 
 178 ULONG JmpAddress;
 179 ULONG JmpAddress1;
 180 ULONG JmpAddress2;
 181 ULONG JmpAddress3;
 182 ULONG JmpAddress4;
 183 ULONG JmpAddress5;
 184 ULONG JmpAddress6;
 185 ULONG JmpAddress7;
 186 
 187 ULONG JmpAddRead_xp;
 188 ULONG JmpAddWrite_xp;
 189 ULONG JmpAddOpen_xp;
 190 
 191 //--------shadow-----------
 192 ULONG JmpAddress_Shadow_GdiGetPixel;
 193 //--------shadow-----------
 194 
 195 ULONG OldServiceAddress;
 196 ULONG OldServiceAddress1;
 197 ULONG OldServiceAddress2;
 198 ULONG OldServiceAddress3;
 199 ULONG OldServiceAddress4;
 200 ULONG Adds;
 201 ULONG retAddr1;  
 202 ULONG retAddr;  
 203 ULONG retAddr2;  
 204 
 205 ULONG retAddrRwpm_Xp;
 206 ULONG retAddrIoCF_Xp;
 207 
 208 
 209 //----------------------定义常量---------
 210 ULONG NtOpenProcess_CallNumber = 0;   //服号
 211 ULONG NtReadVirtualMemory_CallNumber = 0;   //服号
 212 ULONG NtWriteVirtualMemory_CallNumber = 0;   //服号
 213 ULONG NtClose_CallNumber = 0; 
 214 ULONG NtDeviceIoControlFile_CallNumber = 0; 
 215 
 216 //--------shadow-----------
 217 ULONG NtGdiGetPixel_callnumber = 0;
 218 //--------shadow-----------
 219 
 220 #define DELAY_ONE_MICROSECOND (-10)
 221 #define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
 222 
 223 
 224 
 225 
 226 
 227 //------------------------函数部分---------------
 228 
 229 //-----------------shadow--------------
 230 unsigned int getAddressOfShadowTable()
 231 {
 232     unsigned int i;
 233     unsigned char *p;
 234     unsigned int dwordatbyte;
 235 
 236     p = (unsigned char*) KeAddSystemServiceTable;
 237 
 238     for(i = 0; i < 4096; i++, p++)
 239     {
 240         __try
 241         {
 242             dwordatbyte = *(unsigned int*)p;
 243         }
 244         __except(EXCEPTION_EXECUTE_HANDLER)
 245         {
 246             return 0;
 247         }
 248 
 249         if(MmIsAddressValid((PVOID)dwordatbyte))
 250         {
 251             if(memcmp((PVOID)dwordatbyte, &KeServiceDescriptorTable, 16) == 0)
 252             {
 253                 if((PVOID)dwordatbyte == &KeServiceDescriptorTable)
 254                 {
 255                     continue;
 256                 }
 257 
 258                 return dwordatbyte;
 259             }
 260         }
 261     }
 262 
 263     return 0;
 264 }
 265 
 266 ULONG getShadowTable()
 267 {
 268     KeServiceDescriptorTableShadow = (PServiceDescriptorTableEntry) getAddressOfShadowTable();
 269 
 270     if(KeServiceDescriptorTableShadow == NULL)
 271     {  
 272         return FALSE;
 273     }
 274     else
 275     {
 276         return TRUE;
 277     }
 278 } 
 279 
 280 PVOID GetInfoTable(ULONG ATableType)
 281 {
 282   ULONG mSize = 0x4000;
 283   PVOID mPtr = NULL;
 284   NTSTATUS St;
 285   do
 286   {
 287      mPtr = ExAllocatePool(PagedPool, mSize);
 288      memset(mPtr, 0, mSize);
 289      if (mPtr)
 290      {
 291         St = ZwQuerySystemInformation(ATableType, mPtr, mSize, NULL);
 292      } else return NULL;
 293      if (St == STATUS_INFO_LENGTH_MISMATCH)
 294      {
 295         ExFreePool(mPtr);
 296         mSize = mSize * 2;
 297      }
 298   } while (St == STATUS_INFO_LENGTH_MISMATCH);
 299   if (St == STATUS_SUCCESS) return mPtr;
 300   ExFreePool(mPtr);
 301   return NULL;
 302 }
 303 
 304 //--------------------下面这个函数必须的--------
 305 HANDLE GetCsrPid()
 306 {
 307   HANDLE Process, hObject;
 308   HANDLE CsrId = (HANDLE)0;
 309   OBJECT_ATTRIBUTES obj;
 310   CLIENT_ID cid;
 311   UCHAR Buff[0x100];
 312   POBJECT_NAME_INFORMATION ObjName = (PVOID)&Buff;
 313   PSYSTEM_HANDLE_INFORMATION_EX Handles;
 314   ULONG r;
 315 
 316   Handles = GetInfoTable(0x10); //SystemHandleInformation =  0x10
 317 
 318   if (!Handles) return CsrId;
 319 
 320   for (r = 0; r < Handles->NumberOfHandles; r++)
 321   {
 322     if (Handles->Information[r].ObjectTypeNumber == 21) //Port object
 323     {
 324       InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
 325 
 326       cid.UniqueProcess = (HANDLE)Handles->Information[r].ProcessId;
 327       cid.UniqueThread = 0;
 328 
 329       if (NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
 330       {
 331         if (NT_SUCCESS(ZwDuplicateObject(Process, (HANDLE)Handles->Information[r].Handle,NtCurrentProcess(), &hObject, 0, 0, DUPLICATE_SAME_ACCESS)))
 332         {
 333           if (NT_SUCCESS(ZwQueryObject(hObject, 1, ObjName, 0x100, NULL))) //ObjectNameInformation == 1
 334           {
 335             if (ObjName->Name.Buffer && !wcsncmp(L"\\Windows\\ApiPort", ObjName->Name.Buffer, 20))
 336             {
 337               CsrId = (HANDLE)Handles->Information[r].ProcessId;
 338             } 
 339           }
 340 
 341           ZwClose(hObject);
 342         }
 343 
 344         ZwClose(Process);
 345       }
 346     }
 347   }
 348 
 349   ExFreePool(Handles);
 350   return CsrId;
 351 }
 352 
 353 BOOLEAN Sleep(ULONG MillionSecond)
 354 {
 355   NTSTATUS st;
 356   LARGE_INTEGER DelayTime;
 357   DelayTime = RtlConvertLongToLargeInteger(-10000*MillionSecond);
 358   st=KeDelayExecutionThread( KernelMode, FALSE, &DelayTime );
 359   return (NT_SUCCESS(st));
 360 }
 361 
 362 
 363 
 364 //-----------------shadow--------------
 365 
 366 
 367 
 368 
 369 
 370 
 371 
 372 
 373 
 374 
 375 
 376 
 377 
 378 
 379 
 380 
 381 
 382 
 383 
 384 
 385 
 386 
 387 
 388 PVOID
 389 GetUndocumentFunctionAdress()
 390 {
 391 
 392   ULONG size,index;
 393   PULONG buf;
 394       ULONG i;
 395   PSYSTEM_MODULE_INFORMATION module;
 396   PVOID driverAddress=0;
 397      ULONG ntosknlBase;
 398   ULONG ntosknlEndAddr;
 399   ULONG curAddr;
 400   NTSTATUS status;
 401 
 402   ULONG  code1_sp2=0x0035ff64,code2_sp2=0x8b000000,code3_sp2=0x89102444,code4_sp2=0x8d10246c;
 403   ULONG  code1_cal=0x8908758b,code2_cal=0xffff08b5,code3_cal=0x89db33ff,code4_cal=0xffff149d;
 404 
 405   ULONG  code1_Fil=0x33207d8b,code2_Fil=0xd85d89db,code3_Fil=0x831c758b,code4_Fil=0x758903e6;
 406   ULONG  code1_rwm=0x66f845dd,code2_rwm=0x7f087d81,code3_rwm=0xd9037402,code4_rwm=0xc3c9086d;
 407 
 408   ULONG  code1_IoF=0x5d89db33,code2_IoF=0x1c758be0,code3_IoF=0x8903e683,code4_IoF=0xa164d475;
 409 
 410 
 411   ZwQuerySystemInformation(SystemModuleInformation,&size, 0, &size);
 412 
 413   if(NULL==(buf = (PULONG)ExAllocatePool(PagedPool, size)))
 414   {
 415     DbgPrint("failed alloc memory failed  \n");
 416     return 0;
 417   }
 418      
 419   status=ZwQuerySystemInformation(SystemModuleInformation,buf, size , 0);
 420   if(!NT_SUCCESS( status ))
 421   {
 422              DbgPrint("failed  query\n");
 423           return 0;
 424   }
 425 
 426   module = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);
 427   
 428   ntosknlEndAddr=(ULONG)module->Base+(ULONG)module->Size;
 429   ntosknlBase=(ULONG)module->Base;
 430   curAddr=ntosknlBase;
 431   ExFreePool(buf);
 432 
 433   for (i=curAddr;i<=ntosknlEndAddr;i++)
 434     {
 435       if ((*((ULONG *)i)==code1_sp2)&&(*((ULONG *)(i+4))==code2_sp2)&&(*((ULONG *)(i+8))==code3_sp2)&&(*((ULONG *)(i+12))==code4_sp2)) 
 436        
 437       {
 438             
 439         retAddr = i-5;  //为什么-5 BECAUSE..函数第一句5个字节.
 440               
 441       }
 442 
 443       if ((*((ULONG *)i)==code1_cal)&&(*((ULONG *)(i+4))==code2_cal)&&(*((ULONG *)(i+8))==code3_cal)&&(*((ULONG *)(i+12))==code4_cal)) 
 444        
 445       {
 446             
 447         retAddr1 = i-0xF;
 448               
 449       }
 450 
 451       if ((*((ULONG *)i)==code1_Fil)&&(*((ULONG *)(i+4))==code2_Fil)&&(*((ULONG *)(i+8))==code3_Fil)&&(*((ULONG *)(i+12))==code4_Fil)) 
 452        
 453       {
 454             
 455         retAddr2 = i-0xC;
 456             
 457       }
 458       if ((*((ULONG *)i)==code1_rwm)&&(*((ULONG *)(i+4))==code2_rwm)&&(*((ULONG *)(i+8))==code3_rwm)&&(*((ULONG *)(i+12))==code4_rwm)) 
 459        
 460       {
 461             
 462         retAddrRwpm_Xp = i+0x10;
 463             
 464       }
 465       if ((*((ULONG *)i)==code1_IoF)&&(*((ULONG *)(i+4))==code2_IoF)&&(*((ULONG *)(i+8))==code3_IoF)&&(*((ULONG *)(i+12))==code4_IoF)) 
 466        
 467       {
 468             
 469         retAddrIoCF_Xp = i-0xC;
 470             
 471       }
 472 
 473   }
 474 return 0;
 475 
 476 }
 477 
 478 //------------------暂停函数----------------
 479 
 480 VOID MySleep(LONG msec)
 481 {
 482 LARGE_INTEGER my_interval;
 483 my_interval.QuadPart = DELAY_ONE_MILLISECOND;
 484 my_interval.QuadPart *= msec;
 485 KeDelayExecutionThread(KernelMode,0,&my_interval);
 486 }
 487 
 488 //--------------获取服务号----------------
 489 VOID InitCallNumber()
 490 {
 491   ULONG majorVersion, minorVersion;
 492   PsGetVersion( &majorVersion, &minorVersion, NULL, NULL );
 493 
 494   if ( majorVersion == 5 && minorVersion == 1 )
 495       {
 496     DbgPrint("Running on Windows Xp");
 497 
 498     NtOpenProcess_CallNumber = 0x7A;
 499     NtReadVirtualMemory_CallNumber =0xBA;
 500     NtWriteVirtualMemory_CallNumber = 0x115;
 501     NtClose_CallNumber = 0x19; 
 502     NtDeviceIoControlFile_CallNumber = 0x42; 
 503 
 504     NtGdiGetPixel_callnumber = 0xBF;
 505   }
 506 
 507   else if ( majorVersion == 6 && minorVersion == 1 )
 508   {
 509     DbgPrint("Running on Windows 7");
 510 
 511     NtOpenProcess_CallNumber = 0xBE;
 512     NtReadVirtualMemory_CallNumber =0x115;
 513     NtWriteVirtualMemory_CallNumber = 0x18F;
 514     NtClose_CallNumber = 0x32; 
 515     NtDeviceIoControlFile_CallNumber = 0x6B; 
 516 
 517     NtGdiGetPixel_callnumber = 0xC8;
 518   }
 519 
 520 
 521 }
 522 
 523 //-------------------下面是处理内存权限-读写开关-----------------
 524 
 525 VOID WPOFF(VOID)
 526 {
 527 __asm
 528 {
 529 cli
 530 mov eax,cr0
 531 and eax,not 10000h
 532 mov cr0,eax
 533 }
 534 }
 535 
 536 
 537 
 538 VOID WPON(VOID)
 539 {
 540 __asm
 541 {
 542 mov eax,cr0
 543 or eax,10000h
 544 mov cr0,eax
 545 sti
 546 }
 547 }
 548 
 549 
 550 
 551 //------------------------构造自己的函数--------------------
 552 
 553 __declspec(naked) NTSTATUS MyNtDeviceIoControlFile(
 554     HANDLE FileHandle,
 555     HANDLE Event,
 556     PIO_APC_ROUTINE ApcRoutine,
 557     PVOID ApcContext,
 558     PIO_STATUS_BLOCK IoStatusBlock,
 559     ULONG IoControlCode,
 560     PVOID InputBuffer,
 561     ULONG InputBufferLength,
 562     PVOID OutputBuffer,
 563     ULONG OutputBufferLength
 564 )
 565 {
 566   __asm{
 567 
 568 //  Jmp [JmpAddress7]
 569   mov edi, edi
 570   push ebp
 571   mov ebp, esp
 572   push 1
 573   push dword ptr [ebp+0x2C]
 574   push dword ptr [ebp+0x28]
 575   push dword ptr [ebp+0x24]
 576   push dword ptr [ebp+0x20]
 577   push dword ptr [ebp+0x1C]
 578   push dword ptr [ebp+0x18]
 579   push dword ptr [ebp+0x14]
 580   push dword ptr [ebp+0x10]
 581   push dword ptr [ebp+0xC]
 582   push dword ptr [ebp+0x8]
 583         call retAddr2
 584   Jmp [JmpAddress6]
 585        }
 586 }
 587 
 588 
 589 __declspec(naked) NTSTATUS __stdcall MyNtClose(HANDLE ObjectHandle)
 590 {
 591   __asm{
 592 //  Jmp [JmpAddress4]
 593   mov edi, edi
 594   push ebp
 595   mov ebp, esp
 596   Jmp [JmpAddress5]
 597        }
 598 }
 599 
 600 
 601 __declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,
 602                ACCESS_MASK DesiredAccess,
 603                POBJECT_ATTRIBUTES ObjectAttributes,
 604                PCLIENT_ID ClientId) 
 605 {
 606  // DbgPrint("NtOpenProcess() called");
 607   __asm{
 608 
 609 //      jmp     [JmpAddress2]
 610 
 611   mov edi, edi
 612   push ebp
 613   mov ebp, esp
 614   push ecx
 615   push ecx
 616   mov eax, fs:[0x124]
 617   mov al, byte ptr [eax+0x13A]
 618   mov ecx, [ebp+0x14]
 619   mov edx, [ebp+0x10]
 620   mov byte ptr [ebp-0x4], al
 621   push [ebp-0x4]
 622   push [ebp-0x4]
 623   push [ebp+0xC]
 624   push [ebp+0x8]
 625   call retAddr1
 626   jmp     [JmpAddress3]
 627 //      _emit 0x0F 
 628 
 629 
 630 
 631 
 632   }
 633 }
 634 
 635 __declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory(HANDLE ProcessHandle,
 636                PVOID BaseAddress,
 637                PVOID Buffer,
 638                ULONG NumberOfBytesToRead,
 639          PULONG NumberOfBytesReaded) 
 640 {
 641   //跳过去
 642   __asm
 643   {
 644 //    jmp     [JmpAddress]
 645     push    0x18;
 646     push 0x832a8B08;
 647     call retAddr
 648     jmp     [JmpAddress]
 649   }
 650 }
 651 
 652 __declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory(HANDLE ProcessHandle,
 653                PVOID BaseAddress,
 654                PVOID Buffer,
 655                ULONG NumberOfBytesToWrite,
 656          PULONG NumberOfBytesReaded) 
 657 {
 658   //跳过去
 659   __asm
 660   {
 661 //    jmp     [JmpAddress1]
 662 
 663     push    0x18;
 664     push 0x832a8AE0;
 665     call retAddr
 666     jmp     [JmpAddress1] 
 667   }
 668 }
 669 //-----------------------Xp----------------
 670 
 671 __declspec(naked) NTSTATUS MyNtDeviceIoControlFile_Xp(
 672     HANDLE FileHandle,
 673     HANDLE Event,
 674     PIO_APC_ROUTINE ApcRoutine,
 675     PVOID ApcContext,
 676     PIO_STATUS_BLOCK IoStatusBlock,
 677     ULONG IoControlCode,
 678     PVOID InputBuffer,
 679     ULONG InputBufferLength,
 680     PVOID OutputBuffer,
 681     ULONG OutputBufferLength
 682 )
 683 {
 684   __asm{
 685 
 686 //  Jmp [JmpAddress7]
 687   mov edi, edi
 688   push ebp
 689   mov ebp, esp
 690   push 1
 691   push dword ptr [ebp+0x2C]
 692   push dword ptr [ebp+0x28]
 693   push dword ptr [ebp+0x24]
 694   push dword ptr [ebp+0x20]
 695   push dword ptr [ebp+0x1C]
 696   push dword ptr [ebp+0x18]
 697   push dword ptr [ebp+0x14]
 698   push dword ptr [ebp+0x10]
 699   push dword ptr [ebp+0xC]
 700   push dword ptr [ebp+0x8]
 701         call retAddrIoCF_Xp
 702   Jmp [JmpAddress6]
 703 
 704 
 705        }
 706 }
 707 
 708 
 709 __declspec(naked) NTSTATUS __stdcall MyNtOpenProcess_Xp(PHANDLE ProcessHandle,
 710                ACCESS_MASK DesiredAccess,
 711                POBJECT_ATTRIBUTES ObjectAttributes,
 712                PCLIENT_ID ClientId) 
 713 {
 714   __asm{
 715 //  jmp [JmpAddress2]
 716   push 0xC4
 717   push 0x804EB0D8
 718   call retAddrRwpm_Xp
 719         jmp     [JmpAddOpen_xp]
 720 
 721   }
 722 }
 723 
 724 __declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory_Xp(HANDLE ProcessHandle,
 725                PVOID BaseAddress,
 726                PVOID Buffer,
 727                ULONG NumberOfBytesToRead,
 728          PULONG NumberOfBytesReaded) 
 729 {
 730   //跳过去
 731   __asm
 732   {
 733 //    jmp     [JmpAddress]
 734     push    0x1C;
 735     push    0x832a8B08;
 736     call    retAddrRwpm_Xp
 737     jmp     [JmpAddRead_xp]
 738   }
 739 }
 740 
 741 __declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory_Xp(HANDLE ProcessHandle,
 742                PVOID BaseAddress,
 743                PVOID Buffer,
 744                ULONG NumberOfBytesToWrite,
 745          PULONG NumberOfBytesReaded) 
 746 {
 747   //跳过去
 748   __asm
 749   {
 750 //    jmp     [JmpAddress1]
 751     push    0x1C;
 752     push    0x832a8AE0;
 753     call    retAddrRwpm_Xp
 754     jmp     [JmpAddWrite_xp] 
 755   }
 756 }
 757 
 758 //------------------------驱动入口-------------
 759 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
 760 {
 761   DriverObject->DriverUnload = OnUnload;
 762   InitCallNumber();
 763   getShadowTable();                     //获得shadow表地址
 764 
 765   GetUndocumentFunctionAdress();        //-------获取Call函数地址----------
 766 
 767   KeAttPro();                 //插入进程
 768 
 769   HookShadow();
 770 
 771   Hook();
 772   return STATUS_SUCCESS;
 773 }
 774 //-------------------卸载---------------------
 775 VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
 776 {
 777   DbgPrint("驱动卸载中!\n");              //-------无法返回,只能完成--------
 778   Unhook();  
 779 
 780   KeAttPro();
 781   UnhookShadow();
 782                              //-------恢复被HOOK的函数----------
 783 }
 784 //--------------Hook部分函数------------------
 785 VOID Hook()
 786 {
 787   
 788   ULONG  Address, Address1, Address2, Address3, Address4;
 789 
 790 
 791   Address = (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtReadVirtualMemory_CallNumber];
 792   Address1 = (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtWriteVirtualMemory_CallNumber];
 793   Address2 = (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtOpenProcess_CallNumber];   
 794   Address3 = (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtClose_CallNumber];// NtClose
 795   Address4 = (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtDeviceIoControlFile_CallNumber];   //IoDeviceFile
 796 
 797   DbgPrint("SSDT_NtClose:0x%08X",Address3);
 798 
 799 
 800  //-------保存原始函数地址----------
 801   OldServiceAddress  = Address;   //保存原来NtReadVirtualMemory的地址
 802   OldServiceAddress1 = Address1;
 803   OldServiceAddress2 = Address2;
 804   OldServiceAddress3 = Address3;
 805   OldServiceAddress4 = Address4;
 806 
 807     DbgPrint("备份的地址_NtClose:0x%08X",OldServiceAddress3);
 808 
 809 
 810 
 811  //--------绕过INLINE跳转到后面的地址
 812 
 813   JmpAddress  = (ULONG)Address + 0xC;
 814   JmpAddress1 = (ULONG)Address1 + 0xC;
 815   JmpAddress2 = (ULONG)Address2; 
 816   JmpAddress3 = (ULONG)Address2 +0x2D; 
 817   JmpAddress4 = (ULONG)Address3; 
 818   JmpAddress5 = (ULONG)Address3 +0x5; 
 819   JmpAddress6 = (ULONG)Address4 +0x2A; 
 820   JmpAddress7 = (ULONG)Address4; 
 821 
 822   JmpAddRead_xp = (ULONG)OldServiceAddress +0xC; 
 823   JmpAddWrite_xp = (ULONG)OldServiceAddress1 +0xC; 
 824   JmpAddOpen_xp = (ULONG)NtOpenProcess +0xF; 
 825 
 826 
 827 
 828 
 829       DbgPrint("跳转_NtReadVirtualMemory:0x%08X",JmpAddress);
 830       DbgPrint("跳转_NtWriteVirtualMemory:0x%08X",JmpAddress1);
 831       DbgPrint("跳转_NtOpenProcess:0x%08X",JmpAddress2);
 832       DbgPrint("跳转_NtDeviceIoControlFile:0x%08X",JmpAddress3);
 833       DbgPrint("跳转_NtClose:0x%08X",JmpAddress4);
 834 
 835 
 836 //------------------时钟控制------------------
 837 
 838 //while(1)
 839 //{ 
 840 
 841 //---------------------------------系统判断---------------------
 842 
 843   if ( NtOpenProcess_CallNumber == 0x7A )
 844   {
 845 
 846 
 847   WPOFF();
 848     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtReadVirtualMemory_CallNumber] = (ULONG)MyNtReadVirtualMemory_Xp;
 849     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtWriteVirtualMemory_CallNumber] = (ULONG)MyNtWriteVirtualMemory_Xp;
 850     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtOpenProcess_CallNumber] = (ULONG)MyNtOpenProcess_Xp;
 851      (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtClose_CallNumber] = (ULONG)MyNtClose; 
 852     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtDeviceIoControlFile_CallNumber] = (ULONG)MyNtDeviceIoControlFile_Xp; 
 853 
 854 
 855   WPON(); 
 856 
 857 
 858       DbgPrint("HOOK地址_NtClose:0x%08X",Address3);
 859       DbgPrint("HOOK地址_NtOpenProcess:0x%08X",Address2);
 860 
 861       DbgPrint("HOOK地址_自己的程序_NtClose:0x%08X",(ULONG)MyNtClose);
 862   }
 863 
 864   else if ( NtOpenProcess_CallNumber == 0xBE )
 865   {
 866   WPOFF();
 867     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtReadVirtualMemory_CallNumber] = (ULONG)MyNtReadVirtualMemory;
 868     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtWriteVirtualMemory_CallNumber] = (ULONG)MyNtWriteVirtualMemory;
 869     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtOpenProcess_CallNumber] = (ULONG)MyNtOpenProcess;
 870      (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtClose_CallNumber] = (ULONG)MyNtClose; 
 871     (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtDeviceIoControlFile_CallNumber] = (ULONG)MyNtDeviceIoControlFile; 
 872   WPON(); 
 873   }
 874 
 875 //MySleep(2000);
 876 }
 877 //  }  
 878 
 879 
 880 //--------------------------shadow-------------------------
 881 
 882 VOID HookShadow()
 883 {
 884 
 885   __try
 886   {
 887     if ((KeServiceDescriptorTableShadow!=NULL)) //读取到地址就保存起来
 888     {  
 889 
 890   g_OriginalNtGdiGetPixel = KeServiceDescriptorTableShadow[1].ServiceTableBase[NtGdiGetPixel_callnumber];
 891 
 892   JmpAddress_Shadow_GdiGetPixel = (ULONG)g_OriginalNtGdiGetPixel + 0x5;
 893 
 894 
 895     DbgPrint("获取Shadow地址成功!\n");
 896       DbgPrint("Shadow:0x%08X",g_OriginalNtGdiGetPixel);
 897 
 898     }
 899 
 900 
 901 
 902 
 903     else
 904     {
 905       DbgPrint("获取地址失败!\n");
 906       KeServiceDescriptorTableShadow=NULL; 
 907     }
 908 
 909 
 910 
 911 //-----------------系统判断--------------------
 912 
 913 
 914 
 915   if ( NtOpenProcess_CallNumber == 0x7A )
 916   {
 917 
 918 
 919   WPOFF();
 920       KeServiceDescriptorTableShadow[1].ServiceTableBase[NtGdiGetPixel_callnumber] = MyNtGdiGetPixel;
 921   WPON(); 
 922 
 923   }
 924 
 925   else if ( NtOpenProcess_CallNumber == 0xBE )
 926   {
 927 //  WPOFF();
 928 //      KeServiceDescriptorTableShadow[1].ServiceTableBase[NtGdiGetPixel_callnumber] = MyNtGdiGetPixel;
 929 //  WPON(); 
 930 
 931     DbgPrint("暂时没找到WIN7的Shadow Hook解决方案~\n");
 932 
 933   }
 934 
 935 
 936 
 937   }
 938   __finally
 939   {
 940       KeDetachProcess(); 
 941   }
 942 
 943 }
 944 
 945 
 946 VOID KeAttPro()
 947 {
 948   NTSTATUS status;
 949 
 950   status = PsLookupProcessByProcessId((ULONG)GetCsrPid(), &crsEProc);
 951   if (!NT_SUCCESS( status ))
 952   {
 953     DbgPrint("PsLookupProcessByProcessId() error\n");
 954     return ;
 955   }
 956   KeAttachProcess(crsEProc);
 957 }
 958 
 959 
 960 //////////////////////////////////////////////////////
 961 VOID Unhook()
 962 {
 963   InitCallNumber();
 964 
 965 
 966     WPOFF(); 
 967 
 968       (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtReadVirtualMemory_CallNumber] = OldServiceAddress;
 969       (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtWriteVirtualMemory_CallNumber] = OldServiceAddress1;
 970       (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtOpenProcess_CallNumber] = OldServiceAddress2;
 971        (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtClose_CallNumber] = OldServiceAddress3; 
 972       (ULONG)KeServiceDescriptorTable.ServiceTableBase[NtDeviceIoControlFile_CallNumber] = OldServiceAddress4; 
 973 
 974     WPON(); 
 975 
 976   DbgPrint("卸载完成\n");
 977 }
 978 
 979 
 980 VOID UnhookShadow()
 981 {
 982   __try
 983   {
 984 //  WPOFF();
 985 
 986 //  KeServiceDescriptorTableShadow[1].ServiceTableBase[NtGdiGetPixel_callnumber] = g_OriginalNtGdiGetPixel;
 987 
 988 //  WPON();
 989     DbgPrint("暂时没找到WIN7的Shadow Hook解决方案~\n");
 990          }
 991   __finally
 992        {
 993      KeDetachProcess();
 994      Sleep(50);
 995        }
 996 }
 997 
 998 
 999 
1000 
1001 
1002 
1003 
1004 //---------------------shadow自定义函数-----------------------
1005 __declspec(naked) ULONG MyNtGdiGetPixel()
1006 {
1007   __asm
1008   {
1009 //  jmp g_OriginalNtGdiGetPixel
1010 
1011   mov edi, edi
1012   push ebp
1013   mov ebp, esp
1014 
1015   jmp JmpAddress_Shadow_GdiGetPixel
1016   }
1017 }

 

posted @ 2012-12-21 17:19  himessage  阅读(861)  评论(0编辑  收藏  举报