看流星社区

 找回密码
 注册账号
查看: 4463|回复: 3

游戏保护大放送之HP驱动,新版。

[复制链接]

该用户从未签到

发表于 2012-10-18 20:34:03 | 显示全部楼层 |阅读模式


  1. #include "struct.h"
  2. #include "FGPK.h"

  3. //////////////////////////////////////////////////////////////////////////

  4. char g_pFindOrigCode[8];
  5. ULONG KiSystemService_hack_address=0;
  6. PULONG  pSSDTKernel,pSSWDTKernel;
  7. PSERVICE_DESCRIPTOR_TABLE_SHADOW _KeServiceDescriptorTable;
  8. PSERVICE_DESCRIPTOR_TABLE_SHADOW  ShadowTable;
  9. unsigned long SSDT_reentry_address,SSDTDW_reentry_address;


  10. ULONG g_Dra_count=0;
  11. ULONG g_Sem_count=0;

  12. //////////////////////////////////////////////////////////////////////////
  13. void RePlaceSSDT();
  14. void RestoreSSDT();

  15. ULONG Pass_NtCreateMutant();
  16. VOID UnDetour_NtCreateMutant();

  17. ULONG Pass_NtQuerySystemInformation();
  18. VOID UnDetour_NtQuerySystemInformation();

  19. ULONG Pass_NtOpenProcess();
  20. VOID UnDetour_NtOpenProcess();

  21. NTSTATUS HookFindWindow();
  22. NTSTATUS UnHookFindWindow();

  23. ULONG Pass_NtReadVirtualMemory();
  24. VOID UnDetour_NtReadVirtualMemory();

  25. ULONG Pass_NtWriteVirtualMemory();
  26. VOID UnDetour_NtWriteVirtualMemory();

  27. ULONG Pass_NtCreateSemaphore();
  28. VOID UnDetour_NtCreateSemaphore();


  29. ULONG Pass_NtReleaseSemaphore();
  30. VOID UnDetour_NtReleaseSemaphore();

  31. ULONG Pass_NtOpenSemaphore();
  32. VOID UnDetour_NtOpenSemaphore();

  33. ULONG Pass_NtQueryObject();
  34. VOID UnDetour_NtQueryObject();


  35. ULONG Pass_NtWaitForSingleObject();
  36. VOID UnDetour_NtWaitForSingleObject();

  37. NTSTATUS HookNtUserPostMessage();
  38. NTSTATUS UnHookNtUserPostMessage();

  39. NTSTATUS HookNtUserSendInput();
  40. NTSTATUS UnHookNtUserSendInput();

  41. NTSTATUS HookNtUserMessageCall();
  42. NTSTATUS UnHookNtUserMessageCall();



  43. NTSTATUS InitSWSSDT();

  44. ULONG IsHooked=0;

  45. ULONG HookSysCall();
  46. NTSTATUS GetHookedFunAdd();



  47. //////////////////////////////////////////////////////////////////////////


  48. PEPROCESS crsEProc;

  49. PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTableShadow;

  50. __declspec(dllimport) _stdcall KeAddSystemServiceTable(PVOID, PVOID, PVOID, PVOID, PVOID);


  51. #define ObjectNameInformation  1

  52. #define SystemHandleInformation 0x10

  53. typedef struct _SYSTEM_HANDLE_INFORMATION {
  54.   ULONG ProcessId;
  55.   UCHAR ObjectTypeNumber;
  56.   UCHAR Flags;
  57.   USHORT Handle;
  58.   PVOID Object;
  59.   ACCESS_MASK GrantedAccess;
  60. } _SYSTEM_HANDLE_INFORMATION, *P_SYSTEM_HANDLE_INFORMATION;


  61. typedef struct _SYSTEM_HANDLE_INformATION_EX {
  62.   ULONG NumberOfHandles;
  63.   _SYSTEM_HANDLE_INFORMATION Information[1];
  64. } _SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;

  65. //////////////////////////////////////////////////////////////////////////

  66. NTSTATUS
  67. DriverEntry(
  68.   PDRIVER_OBJECT pDriverObj,
  69.   PUNICODE_STRING pRegistryString
  70.   )
  71. {
  72.   NTSTATUS status = STATUS_SUCCESS;
  73.   UNICODE_STRING ustrLinkName;
  74.   UNICODE_STRING ustrDevName;   
  75.   PDEVICE_OBJECT pDevObj;

  76.   dprintf("[FGPK] DriverEntry\n");
  77.   
  78.   pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
  79.   pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
  80.   pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
  81.   pDriverObj->DriverUnload = DriverUnload;


  82.   RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
  83.   status = IoCreateDevice(pDriverObj,
  84.         0,
  85.         &ustrDevName,
  86.         FILE_DEVICE_UNKNOWN,
  87.         0,
  88.         FALSE,
  89.         &pDevObj);

  90.   if(!NT_SUCCESS(status))  {
  91.     dprintf("[FGPK] IoCreateDevice = 0x%x\n", status);
  92.     return status;
  93.   }

  94.   RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
  95.   status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  
  96.   if(!NT_SUCCESS(status)) {
  97.     dprintf("[FGPK] IoCreateSymbolicLink = 0x%x\n", status);
  98.     IoDeleteDevice(pDevObj);  
  99.     return status;
  100.   }
  101.   

  102.   //
  103.   // 添加执行代码
  104.   //

  105.   RePlaceSSDT();

  106.   InitSWSSDT();

  107. //  Pass_NtQueryObject();

  108. //  Pass_NtCreateMutant();

  109. //  Pass_NtCreateSemaphore();

  110. //  Pass_NtReleaseSemaphore();

  111. //  Pass_NtOpenSemaphore();

  112. //  Pass_NtWaitForSingleObject();

  113. //  Pass_NtQuerySystemInformation();

  114.   Pass_NtOpenProcess();

  115. //  Pass_NtReadVirtualMemory();

  116. //  Pass_NtWriteVirtualMemory();

  117. //  HookFindWindow();

  118. //  HookNtUserMessageCall();

  119. //  HookNtUserSendInput();

  120. //  HookNtUserPostMessage();

  121.   return STATUS_SUCCESS;
  122. }


  123. VOID
  124. DriverUnload(
  125.   PDRIVER_OBJECT pDriverObj
  126.   )
  127. {  
  128.   UNICODE_STRING strLink;
  129.   RtlInitUnicodeString(&strLink, LINK_NAME);

  130.   //
  131.   // 添加卸载代码
  132.   //

  133.   
  134.   
  135. //  UnDetour_NtOpenSemaphore();

  136. //  UnDetour_NtWaitForSingleObject();

  137. //  UnDetour_NtCreateSemaphore();

  138. //  UnDetour_NtReleaseSemaphore();

  139. //  UnDetour_NtCreateMutant();

  140. //  UnDetour_NtQueryObject();

  141. //  UnDetour_NtQuerySystemInformation();

  142.   UnDetour_NtOpenProcess();

  143. //  UnDetour_NtReadVirtualMemory();

  144. //  UnDetour_NtWriteVirtualMemory();

  145. //  UnHookFindWindow();

  146. //  UnHookNtUserPostMessage();

  147. //  UnHookNtUserSendInput();

  148. //  UnHookNtUserMessageCall();

  149.   
  150.   RestoreSSDT();


  151. //  Sleep(5000);
  152.   
  153.   IoDeleteSymbolicLink(&strLink);
  154.   IoDeleteDevice(pDriverObj->DeviceObject);
  155.   dprintf("[FGPK] Unloaded\n");
  156. }


  157. NTSTATUS
  158. DispatchCreate(
  159.   PDEVICE_OBJECT pDevObj,
  160.   PIRP pIrp
  161.   )
  162. {
  163.   pIrp->IoStatus.Status = STATUS_SUCCESS;
  164.   pIrp->IoStatus.Information = 0;

  165.   dprintf("[FGPK] IRP_MJ_CREATE\n");

  166.   IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  167.   return STATUS_SUCCESS;
  168. }


  169. NTSTATUS
  170. DispatchClose(
  171.   PDEVICE_OBJECT pDevObj,
  172.   PIRP pIrp
  173.   )
  174. {
  175.   pIrp->IoStatus.Status = STATUS_SUCCESS;
  176.   pIrp->IoStatus.Information = 0;

  177.   dprintf("[FGPK] IRP_MJ_CLOSE\n");

  178.   IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  179.   return STATUS_SUCCESS;
  180. }


  181. NTSTATUS
  182. DispatchIoctl(
  183.   PDEVICE_OBJECT pDevObj,
  184.   PIRP pIrp
  185.   )
  186. {
  187.   NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
  188.   PIO_STACK_LOCATION pIrpStack;
  189.   ULONG uIoControlCode;
  190.   PVOID pIoBuffer;
  191.   ULONG uInSize;
  192.   ULONG uOutSize;

  193.   pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  194.   uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  195.   pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
  196.   uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
  197.   uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

  198.   switch(uIoControlCode) {

  199.     case IOCTL_HELLO: {
  200.       
  201.       dprintf("[FGPK] Hello\n");

  202.       GetHookedFunAdd();

  203.       HookSysCall();

  204.       IsHooked=1;
  205.       status = STATUS_SUCCESS;
  206.     }
  207.     break;

  208.     //
  209.     // 添加执行代码
  210.     //

  211.   }

  212.   if(status == STATUS_SUCCESS)
  213.     pIrp->IoStatus.Information = uOutSize;
  214.   else
  215.     pIrp->IoStatus.Information = 0;
  216.   
  217.   /////////////////////////////////////
  218.   pIrp->IoStatus.Status = status;
  219.   IoCompleteRequest(pIrp, IO_NO_INCREMENT);

  220.   return status;
  221. }
  222. //////////////////////////////////////////////////////////////////////////

  223. NTSTATUS IsGame()
  224. {
  225.   if (!strcmp("HProtect.exe",GetProcessNameFromEProc(0)) || !strcmp("zhengtu2.dat",GetProcessNameFromEProc(0)))
  226.   {
  227.     return 1;
  228.   }
  229.   return 0;
  230. }

  231. //////////////////////////////////////////////////////////////////////////



  232. void __declspec(naked) my_function_detour_KiFastCallEntry()
  233. {
  234.   __asm
  235.   {
  236.     cmp     ecx,10h
  237.     jne    SSDT

  238.     pushad
  239.     call    IsGame
  240.     cmp    eax,1
  241.     popad
  242.     je      ZTGAME1

  243.     mov    edi,KeServiceDescriptorTable
  244.     sub    edi,0x10

  245. ZTGAME1:
  246.     jmp    [SSDTDW_reentry_address]

  247. SSDT:

  248.     pushad
  249.     call    IsGame
  250.     cmp    eax,1
  251.     popad
  252.     je      ZTGAME2

  253.     mov    edi,KeServiceDescriptorTable
  254.     add    edi,0x20

  255. ZTGAME2:
  256.     jmp    [SSDT_reentry_address]


  257.   }

  258. }

  259. UCHAR findcode[]={0x83,0xf9,0x10,0x75};

  260. VOID FindHackAddr()
  261. {
  262.     ULONG  uSysenter;
  263.     ULONG i=0;
  264.     PUCHAR strSysenter;

  265.   __asm{
  266.         mov ecx,0x176
  267.         rdmsr
  268.         mov uSysenter,eax  //得到KiFastCallEntry地址
  269.       }
  270.   strSysenter=(PUCHAR)uSysenter;
  271.   for (i=0;i<0x100;i++)
  272.   {
  273.     if (
  274.       findcode[0]==strSysenter[i] &&
  275.       findcode[1]==strSysenter[i+1] &&
  276.       findcode[2]==strSysenter[i+2] &&
  277.       findcode[3]==strSysenter[i+3] )
  278.     {
  279.       break;
  280.     }

  281.   }

  282.   KiSystemService_hack_address=uSysenter+i;

  283. }
  284. ULONG HookSysCall()
  285. {
  286.   KIRQL  oldIrql;


  287.   unsigned char newcode[] = { 0xE9, 0x44, 0x33, 0x22, 0x11};

  288.   char *actual_function;

  289.   int i = 0;

  290.   FindHackAddr();

  291.   if (KiSystemService_hack_address==0)
  292.   {
  293.     dprintf("find hack address error!\n");
  294.     return 0;
  295.   }

  296.   actual_function =(char*) KiSystemService_hack_address;

  297.   SSDT_reentry_address = KiSystemService_hack_address+0x20;
  298.   SSDTDW_reentry_address = KiSystemService_hack_address+0x5;

  299.   *( (unsigned long *)(&newcode[1]) ) = (ULONG)my_function_detour_KiFastCallEntry-KiSystemService_hack_address-5;


  300.   WPOFF();
  301.   oldIrql = KeRaiseIrqlToDpcLevel();
  302.   for(i=0;i < 5;i++)
  303.   {
  304.     g_pFindOrigCode[i] = actual_function[i];
  305.     actual_function[i] = newcode[i];
  306.   }
  307.   KeLowerIrql(oldIrql);
  308.   WPON();

  309.   return 1;
  310. }


  311. PVOID GetInfoTable(ULONG ATableType)
  312. {
  313.   ULONG mSize = 0x4000;
  314.   PVOID mPtr = NULL;
  315.   NTSTATUS St;
  316.   do
  317.   {
  318.     mPtr = ExAllocatePool(PagedPool, mSize);
  319.     memset(mPtr, 0, mSize);
  320.     if (mPtr)
  321.     {
  322.       St = ZwQuerySystemInformation(ATableType, mPtr, mSize, NULL);
  323.     } else return NULL;
  324.     if (St == STATUS_INFO_LENGTH_MISMATCH)
  325.     {
  326.       ExFreePool(mPtr);
  327.       mSize = mSize * 2;
  328.     }
  329.   } while (St == STATUS_INFO_LENGTH_MISMATCH);
  330.   if (St == STATUS_SUCCESS) return mPtr;
  331.   ExFreePool(mPtr);
  332.   return NULL;
  333. }

  334. HANDLE GetCsrPid()
  335. {
  336.   HANDLE Process, hObject;
  337.   HANDLE CsrId = (HANDLE)0;
  338.   OBJECT_ATTRIBUTES obj;
  339.   CLIENT_ID cid;
  340.   UCHAR Buff[0x100];
  341.   POBJECT_NAME_INFORMATION ObjName = (PVOID)&Buff;
  342.   PSYSTEM_HANDLE_INFORMATION_EX Handles;
  343.   ULONG r;

  344.   Handles = GetInfoTable(SystemHandleInformation);

  345.   if (!Handles) return CsrId;

  346.   for (r = 0; r < Handles->NumberOfHandles; r++)
  347.   {
  348.     if (Handles->Information[r].ObjectTypeNumber == 21) //Port object
  349.     {
  350.       InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

  351.       cid.UniqueProcess = (HANDLE)Handles->Information[r].ProcessId;
  352.       cid.UniqueThread = 0;

  353.       if (NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
  354.       {
  355.         if (NT_SUCCESS(ZwDuplicateObject(Process, (HANDLE)Handles->Information[r].Handle,NtCurrentProcess(), &hObject, 0, 0, DUPLICATE_SAME_ACCESS)))
  356.         {
  357.           if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL)))
  358.           {
  359.             if (ObjName->Name.Buffer && !wcsncmp(L"\\Windows\\ApiPort", ObjName->Name.Buffer, 20))
  360.             {
  361.               CsrId = (HANDLE)Handles->Information[r].ProcessId;
  362.             }
  363.           }

  364.           ZwClose(hObject);
  365.         }

  366.         ZwClose(Process);
  367.       }
  368.     }
  369.   }

  370.   ExFreePool(Handles);
  371.   return CsrId;
  372. }

  373. unsigned long AddMyServiceTable()
  374. {
  375.   ULONG  nSDTKerCallLen,nSWDTKerCallLen;
  376.   NTSTATUS status;
  377.   PEPROCESS crsEProc;


  378.   __asm
  379.   {
  380.     pushad
  381.       mov   eax,KeServiceDescriptorTable
  382.       mov   _KeServiceDescriptorTable,eax
  383.       sub   eax,0x40
  384.       mov   ShadowTable,eax
  385.       popad
  386.   }
  387.   nSDTKerCallLen  =  _KeServiceDescriptorTable->ntoskrnl.NumberOfServices;
  388.   nSWDTKerCallLen  =  ShadowTable->win32k.NumberOfServices;


  389.   pSSDTKernel =  (PULONG)ExAllocatePool( NonPagedPool, nSDTKerCallLen*sizeof(ULONG));
  390.   pSSWDTKernel=   (PULONG)ExAllocatePool( NonPagedPool, nSWDTKerCallLen*sizeof(ULONG));


  391.   if(!pSSDTKernel || !pSSWDTKernel)
  392.   {
  393.     DbgPrint("AddMyServiceTable  alloc fail\n");
  394.     return 0;
  395.   }
  396.   memset( (PVOID)pSSDTKernel, 0, nSDTKerCallLen*sizeof(ULONG));
  397.   memset( (PVOID)pSSWDTKernel, 0, nSWDTKerCallLen*sizeof(ULONG));


  398.   //填充新的SSDT表
  399.   //
  400.   RtlCopyMemory( (PVOID)pSSDTKernel,(PVOID)_KeServiceDescriptorTable->ntoskrnl.ServiceTableBase,nSDTKerCallLen*sizeof(ULONG) );


  401.   RtlCopyMemory( (PVOID)&_KeServiceDescriptorTable->NotUse1,(PVOID)&_KeServiceDescriptorTable->ntoskrnl,sizeof(SERVICE_DESCRIPTOR_TABLE) );
  402.   //sswdt

  403.   status = PsLookupProcessByProcessId((HANDLE)GetCsrPid(), &crsEProc);
  404.   if (!NT_SUCCESS( status ))
  405.   {
  406.     DbgPrint("PsLookupProcessByProcessId() error\n");
  407.     return status;
  408.   }
  409.   KeAttachProcess(crsEProc);

  410.   __try
  411.   {
  412.     RtlCopyMemory( (PVOID)pSSWDTKernel,(PVOID)ShadowTable->win32k.ServiceTableBase,nSWDTKerCallLen*sizeof(ULONG) );

  413.   }
  414.   __finally
  415.   {
  416.     KeDetachProcess();
  417.   }

  418.   RtlCopyMemory( (PVOID)&ShadowTable->NotUse1,(PVOID)&ShadowTable->ntoskrnl,sizeof(SERVICE_DESCRIPTOR_TABLE));
  419.   RtlCopyMemory( (PVOID)&ShadowTable->NotUse2,(PVOID)&ShadowTable->win32k,sizeof(SERVICE_DESCRIPTOR_TABLE));

  420.   WPOFF();
  421.   RtlCopyMemory((PVOID)&_KeServiceDescriptorTable->NotUse1.ServiceTableBase, &pSSDTKernel, sizeof(ULONG));

  422.   RtlCopyMemory((PVOID)&ShadowTable->NotUse1.ServiceTableBase, &pSSDTKernel, sizeof(ULONG));
  423.   RtlCopyMemory((PVOID)&ShadowTable->NotUse2.ServiceTableBase, &pSSWDTKernel, sizeof(ULONG));

  424.   WPON();

  425.   return 1;
  426. }

  427. void RePlaceSSDT()
  428. {
  429.   if (AddMyServiceTable())
  430.   {
  431.     HookSysCall();
  432.   }

  433. }

  434. void RestoreSSDT()
  435. {
  436.   int i;
  437.   char *actual_function = (char *)(KiSystemService_hack_address);
  438.   KIRQL  oldIrql;
  439.   WPOFF();

  440.   KeRaiseIrql( DISPATCH_LEVEL,&oldIrql );

  441.   for(i=0;i < 5;i++)
  442.   {
  443.     actual_function[i] = g_pFindOrigCode[i];
  444.   }

  445.   KeLowerIrql( oldIrql );
  446.   ExFreePool(pSSDTKernel);
  447.   ExFreePool(pSSWDTKernel);


  448.   WPON();

  449. }

  450. //////////////////////////////////////////////////////////////////////////


  451. //////////////////////////////////////////////////////////////////////////
  452. typedef NTSTATUS (*NTQUERYOBJECT)
  453. (
  454. IN HANDLE ObjectHandle,
  455. IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
  456. OUT PVOID ObjectInformation,
  457. IN ULONG ObjectInformationLength,
  458. OUT PULONG ReturnLength OPTIONAL
  459. );
  460. NTQUERYOBJECT OrgNtQueryObject;

  461. //*****************************************************************************************************************
  462. NTSYSAPI
  463. NTSTATUS
  464. NTAPI
  465. ObQueryNameString(
  466.                __in       PVOID Object,
  467.                __out_opt  POBJECT_NAME_INFORMATION ObjectNameInfo,
  468.                __in       ULONG Length,
  469.                __out      PULONG ReturnLength
  470.                );


  471. NTSTATUS GetObjectNameFromHandle(HANDLE Objecthandle,PUNICODE_STRING filename)
  472. {
  473. //   PFILE_OBJECT      pFileObject;
  474. //   OBJECT_HANDLE_INFORMATION HandleInformationObject;
  475.   NTSTATUS nTstatus;
  476.   POBJECT_NAME_INFORMATION pObjectInformation;
  477.   PVOID Object;
  478.   OBJECT_HANDLE_INFORMATION HandleInformation = {0};
  479.   ULONG TempReturnLength;


  480.   pObjectInformation=ExAllocatePool(PagedPool,0x100);
  481.   RtlZeroMemory(pObjectInformation,0x100);

  482.   __try
  483.   {
  484.     nTstatus = ObReferenceObjectByHandle( Objecthandle,
  485.       0,
  486.       NULL,
  487.       0,
  488.       &Object,
  489.       &HandleInformation );

  490.     if (NT_SUCCESS( nTstatus ))
  491.     {
  492.       nTstatus = ObQueryNameString( Object,
  493.         (POBJECT_NAME_INFORMATION)pObjectInformation,
  494.         0x100,
  495.         &TempReturnLength
  496.          );

  497.       RtlCopyUnicodeString(filename,(PUNICODE_STRING)&(pObjectInformation->Name));
  498.       return 0;
  499.     }
  500.    
  501.       
  502.    
  503.    
  504.   }
  505.   __except(1)
  506.   {
  507.     dprintf("GetObjectNameFromHandle error!\n");
  508.   }

  509.   return -1;

  510. }
  511. //********************************************************************************************************************

  512. NTSTATUS __stdcall MyNtQueryObject(
  513.                    HANDLE ObjectHandle,
  514.                    OBJECT_INFORMATION_CLASS ObjectInformationClass,
  515.                    PVOID ObjectInformation,
  516.                    ULONG ObjectInformationLength,
  517.                    PULONG ReturnLength)
  518. {
  519.   NTSTATUS nTstatus;

  520.   UNICODE_STRING Objectname;
  521.   UNICODE_STRING oldname;

  522.   __try
  523.   {
  524.     if(strcmp(GetProcessNameFromEProc(0),"DragonNest.exe")==0)
  525.     {
  526.       //DragonNest pid 3548 ObjectNameInformation MyNtQueryObject name \BaseNamedObjects\dnx_579876753682410 handle 00000614

  527.       nTstatus=OrgNtQueryObject(ObjectHandle,ObjectInformationClass,ObjectInformation,ObjectInformationLength,ReturnLength);
  528.       switch (ObjectInformationClass)
  529.       {
  530.       case ObjectNameInformation:
  531.         if(ObjectInformation!=NULL)
  532.         {

  533.           POBJECT_NAME_INFORMATION  pobj_name=(POBJECT_NAME_INFORMATION)ObjectInformation;
  534.          
  535.           if (pobj_name->Name.Buffer)
  536.           {
  537.             if (wcsstr(pobj_name->Name.Buffer,L"dnx_57987675368241"))
  538.             {
  539.               dprintf("DragonNest pid %d ObjectNameInformation MyNtQueryObject name %wZ handle %08x\n",PsGetCurrentProcessId(),&(pobj_name->Name),(ULONG)ObjectHandle);
  540.               RtlInitUnicodeString(&oldname,L"\\BaseNamedObjects\\dnx_57987675368241");
  541.               RtlCopyUnicodeString(&(pobj_name->Name),&oldname);
  542.               dprintf("DragonNest pid %d ObjectNameInformation MyNtQueryObject name %wZ handle %08x\n",PsGetCurrentProcessId(),&(pobj_name->Name),(ULONG)ObjectHandle);
  543.             }
  544.             
  545.             else if (wcsstr(pobj_name->Name.Buffer,L"MutexDragonNest"))
  546.             {
  547.               dprintf("DragonNest pid %d ObjectNameInformation MyNtQueryObject name %wZ handle %08x\n",PsGetCurrentProcessId(),&(pobj_name->Name),(ULONG)ObjectHandle);
  548.             //  RtlInitUnicodeString(&oldname,L"\\BaseNamedObjects\\MutexDragonNest");
  549.             //  RtlCopyUnicodeString(&(pobj_name->Name),&oldname);
  550.               dprintf("DragonNest pid %d ObjectNameInformation MyNtQueryObject name %wZ handle %08x\n",PsGetCurrentProcessId(),&(pobj_name->Name),(ULONG)ObjectHandle);

  551.             }
  552.             
  553.           }
  554.         }
  555.         break;
  556.       case ObjectBasicInformation:
  557.         if(ObjectInformation!=NULL)
  558.         {
  559.           POBJECT_BASIC_INFORMATION  pobj_basic=(POBJECT_BASIC_INFORMATION)ObjectInformation;
  560.           dprintf("DragonNest pid %d ObjectBasicInformation HandleCount %d handle %08x\n",PsGetCurrentProcessId(),pobj_basic->HandleCount,(ULONG)ObjectHandle);
  561.         }
  562.         break;

  563.       }

  564.     }

  565.   }
  566.   __except(1)
  567.   {
  568.     dprintf("MyNtQueryObject error!\n");
  569.   }


  570.   return nTstatus;
  571. }

  572. ULONG Pass_NtQueryObject()
  573. {
  574.   KIRQL oldIrql;
  575.   ULONG  Address=0;

  576.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 163 * 4;   

  577.   (ULONG)OrgNtQueryObject = *(ULONG*)Address;    //保存此地址

  578.   WPOFF();
  579.   oldIrql = KeRaiseIrqlToDpcLevel();
  580.   *((ULONG*)Address) = (ULONG)MyNtQueryObject;      //HOOK SSDT
  581.   KeLowerIrql(oldIrql);
  582.   WPON();
  583.   return 1;
  584. }

  585. //反补丁,用于最后恢复用
  586. VOID UnDetour_NtQueryObject()
  587. {
  588.   KIRQL oldIrql;
  589.   ULONG  Address=0;

  590.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 163 * 4;

  591.   WPOFF();
  592.   oldIrql = KeRaiseIrqlToDpcLevel();

  593.   *((ULONG*)Address) = (ULONG)OrgNtQueryObject;  //HOOK SSDT
  594.   KeLowerIrql(oldIrql);
  595.   WPON();
  596. }

复制代码

该用户从未签到

 楼主| 发表于 2012-10-18 20:35:33 | 显示全部楼层


  1. //////////////////////////////////////////////////////////////////////////
  2. typedef NTSYSAPI NTSTATUS (__stdcall *ZWCREATEMUTANT)(
  3.   OUT PHANDLE             MutantHandle,
  4.   IN ACCESS_MASK          DesiredAccess,
  5.   IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
  6.   IN BOOLEAN              InitialOwner );

  7. ZWCREATEMUTANT OrgZwCreateMutant;

  8. ULONG g_mutex_count=0;
  9. NTSTATUS __stdcall MyZwCreateMutant(
  10.                   OUT PHANDLE             MutantHandle,
  11.                   IN ACCESS_MASK          DesiredAccess,
  12.                   IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
  13.                   IN BOOLEAN              InitialOwner )
  14. {
  15.   PUNICODE_STRING p_mutex_name;
  16.   UNICODE_STRING uni_count;
  17.   WCHAR wzCount[3];
  18.   UNICODE_STRING tmpunicodestring,tmpunicodestring1;
  19.   OBJECT_ATTRIBUTES tmpobjatus;

  20.   NTSTATUS nTstatus;
  21.   __try
  22.   {
  23.     if (!strcmp(GetProcessNameFromEProc(0),"DragonNest.exe"))
  24.     {
  25.       if(ObjectAttributes==NULL)
  26.         return OrgZwCreateMutant(MutantHandle,DesiredAccess,ObjectAttributes,InitialOwner);

  27.       p_mutex_name=ObjectAttributes->ObjectName;

  28.       if(p_mutex_name  )
  29.       {
  30.         if (p_mutex_name->Buffer)
  31.         {
  32.           //    dprintf("mutex %S\n",p_mutex_name->Buffer);

  33.           if (!wcscmp(p_mutex_name->Buffer,L"Global\\MutexDragonNest"))
  34.           {
  35.         //    return OrgZwCreateMutant(MutantHandle,DesiredAccess,ObjectAttributes,InitialOwner);
  36.             dprintf("fack mutex!\n");
  37.             return STATUS_SUCCESS;
  38.         //    DbgBreakPoint();
  39.             
  40.             nTstatus=OrgZwCreateMutant(MutantHandle,DesiredAccess,ObjectAttributes,InitialOwner);

  41.             
  42.             while(1)
  43.             {
  44.               
  45.               if (nTstatus==STATUS_OBJECT_NAME_EXISTS)
  46.               {
  47.                 dprintf("STATUS_OBJECT_NAME_EXISTS\n");

  48.                 g_mutex_count++;
  49.                 if(g_mutex_count==20)  g_mutex_count=0;
  50.                 dprintf("g_mutex_count %d\n",g_mutex_count);
  51.                 uni_count.Buffer=(PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);
  52.                 uni_count.MaximumLength=BUFFER_SIZE;
  53.                 nTstatus=RtlIntegerToUnicodeString(g_mutex_count,10,&uni_count);

  54.                 if (NT_SUCCESS(nTstatus))
  55.                 {
  56.                   dprintf("uni_count %wZ\n",uni_count);

  57.                   RtlInitUnicodeString(&tmpunicodestring1,L"Global\\MutexDragonNest");
  58.                   tmpunicodestring.Buffer=(PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);
  59.                   tmpunicodestring.MaximumLength=BUFFER_SIZE;
  60.                   //wcscpy(tmpunicodestring.Buffer,L"Global\\MutexDragonNest");
  61.                   RtlCopyUnicodeString(&tmpunicodestring,&tmpunicodestring1);
  62.                   RtlAppendUnicodeStringToString(&tmpunicodestring,&uni_count);
  63.                   DbgPrint("tmpunicodestring %wZ\n",&tmpunicodestring);
  64.                   InitializeObjectAttributes(&tmpobjatus,&tmpunicodestring,ObjectAttributes->Attributes,
  65.                     ObjectAttributes->RootDirectory,ObjectAttributes->SecurityDescriptor);
  66.                   nTstatus=OrgZwCreateMutant(MutantHandle,DesiredAccess,&tmpobjatus,InitialOwner);
  67.                   dprintf("name %wZ\n",tmpobjatus.ObjectName);
  68.                   RtlFreeUnicodeString(&tmpunicodestring);

  69.                 }
  70.                 else
  71.                 {
  72.                   dprintf("RtlIntegerToUnicodeString error!\n");
  73.                 }
  74.                 RtlFreeUnicodeString(&uni_count);

  75.                 //  RtlInitUnicodeString(&uni_count,wzCount);
  76.               }
  77.               else
  78.               {
  79.                 dprintf("CreateMutex sucess! Mutex name %S\n",p_mutex_name->Buffer);
  80.                 return nTstatus;
  81.               }

  82.             }
  83.   
  84.           }
  85.         }

  86.       }
  87.     }
  88.   }
  89.   __except(1)
  90.   {
  91.     dprintf("MyZwCreateMutant error\n");
  92.   }
  93.   return OrgZwCreateMutant(MutantHandle,DesiredAccess,ObjectAttributes,InitialOwner);
  94. }

  95. ULONG Pass_NtCreateMutant()
  96. {
  97.   KIRQL oldIrql;
  98.   ULONG  Address=0;

  99.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 43 * 4;   

  100.   (ULONG)OrgZwCreateMutant = *(ULONG*)Address;    //保存此地址

  101.   WPOFF();
  102.   oldIrql = KeRaiseIrqlToDpcLevel();
  103.   *((ULONG*)Address) = (ULONG)MyZwCreateMutant;      //HOOK SSDT
  104.   KeLowerIrql(oldIrql);
  105.   WPON();
  106.   return 1;
  107. }

  108. //反补丁,用于最后恢复用
  109. VOID UnDetour_NtCreateMutant()
  110. {
  111.   KIRQL oldIrql;
  112.   ULONG  Address=0;

  113.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 43 * 4;

  114.   WPOFF();
  115.   oldIrql = KeRaiseIrqlToDpcLevel();

  116.   *((ULONG*)Address) = (ULONG)OrgZwCreateMutant;  //HOOK SSDT
  117.   KeLowerIrql(oldIrql);
  118.   WPON();
  119. }



  120. //////////////////////////////////////////////////////////////////////////


  121. typedef NTSTATUS (*NTQUERYSYSTEMINFORMATION)
  122. (
  123. ULONG SystemInformationCLass,
  124. PVOID SystemInformation,
  125. ULONG SystemInformationLength,
  126. PULONG ReturnLength
  127. );

  128. NTQUERYSYSTEMINFORMATION OldNtQuerySystemInformation;


  129. typedef struct _SYSTEM_BASIC_INFORMATION {
  130.   BYTE Reserved1[24];
  131.   PVOID Reserved2[4];
  132.   CCHAR NumberOfProcessors;
  133. } SYSTEM_BASIC_INFORMATION;



  134. NTSTATUS NewNtQuerySystemInformation(
  135.                    IN ULONG SystemInformationClass,
  136.                    IN PVOID SystemInformation,
  137.                    IN ULONG SystemInformationLength,
  138.                    OUT PULONG ReturnLength)
  139. {

  140.   NTSTATUS ntStatus;
  141.   UNICODE_STRING gamename;
  142.   UNICODE_STRING launchername;


  143.   ntStatus = OldNtQuerySystemInformation(
  144.     SystemInformationClass,
  145.     SystemInformation,
  146.     SystemInformationLength,
  147.     ReturnLength );


  148.   if (!_stricmp(GetProcessNameFromEProc(0),"DragonNest.exe") || !_stricmp(GetProcessNameFromEProc(0),"dnlauncher.exe"))
  149.   {

  150.     if( NT_SUCCESS(ntStatus))
  151.     {


  152.       if(SystemInformationClass == 5)
  153.       {

  154.         struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
  155.         struct _SYSTEM_PROCESSES *prev = NULL;

  156.         while(curr)
  157.         {

  158.           if (curr->ProcessName.Buffer != NULL)
  159.           {
  160.             //  dprintf("processid %d\n",curr->ProcessId);

  161.             RtlInitUnicodeString(&gamename,L"DragonNest.exe");
  162.             RtlInitUnicodeString(&launchername,L"dnlauncher.exe");
  163.             

  164.             if((!RtlCompareUnicodeString(&(curr->ProcessName),&gamename,FALSE) && (ULONG)PsGetCurrentProcessId()!=curr->ProcessId) ||
  165.               !RtlCompareUnicodeString(&(curr->ProcessName),&launchername,FALSE))
  166.             {
  167.               //  dprintf("FIND DNF PDI %d\n",curr->ProcessId);

  168.               if(prev)
  169.               {
  170.                 if(curr->NextEntryDelta)
  171.                 {
  172.                   prev->NextEntryDelta += curr->NextEntryDelta;
  173.                 }

  174.                 else
  175.                 {
  176.                   prev->NextEntryDelta = 0;
  177.                 }
  178.               }
  179.               else
  180.               {
  181.                 if(curr->NextEntryDelta)
  182.                 {

  183.                   (char *)SystemInformation += curr->NextEntryDelta;
  184.                 }
  185.                 else
  186.                 {
  187.                   SystemInformation = NULL;
  188.                 }

  189.               }


  190.             }
  191.             else
  192.             {
  193.               prev = curr;
  194.             }
  195.           }

  196.           if(curr->NextEntryDelta)
  197.           {
  198.             ((char *)curr += curr->NextEntryDelta);
  199.           }
  200.           else
  201.           {
  202.             curr = NULL;
  203.           }


  204.         }
  205.       }


  206.     }

  207.   }

  208.   return ntStatus;
  209. }

  210. ULONG Pass_NtQuerySystemInformation()
  211. {
  212.   KIRQL oldIrql;
  213.   ULONG  Address=0;

  214.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 173 * 4;   

  215.   (ULONG)OldNtQuerySystemInformation = *(ULONG*)Address;    //保存此地址

  216.   WPOFF();
  217.   oldIrql = KeRaiseIrqlToDpcLevel();
  218.   *((ULONG*)Address) = (ULONG)NewNtQuerySystemInformation;      //HOOK SSDT
  219.   KeLowerIrql(oldIrql);
  220.   WPON();
  221.   return 1;
  222. }

  223. //反补丁,用于最后恢复用
  224. VOID UnDetour_NtQuerySystemInformation()
  225. {
  226.   KIRQL oldIrql;
  227.   ULONG  Address=0;

  228.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 173 * 4;

  229.   WPOFF();
  230.   oldIrql = KeRaiseIrqlToDpcLevel();

  231.   *((ULONG*)Address) = (ULONG)OldNtQuerySystemInformation;  //HOOK SSDT
  232.   KeLowerIrql(oldIrql);
  233.   WPON();
  234. }

  235. //////////////////////////////////////////////////////////////////////////
  236. /*
  237. 805c1148 8bff            mov     edi,edi
  238. 805c114a 55              push    ebp
  239. 805c114b 8bec            mov     ebp,esp
  240. 805c114d 83ec10          sub     esp,10h
  241. */


  242. VOID UnHook()
  243. {
  244.   KIRQL oldIrql;

  245.   unsigned char  oldcode[]={0x8b,0xff,0x55,0x8b,0xec,0x83,0xec,0x10};
  246.   unsigned char* obcheckobjectaccessptr=(unsigned char*)GetFunctionAddr(L"ObCheckObjectAccess");
  247.   
  248.   ULONG  Address=(ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 257 * 4;
  249.   unsigned char* ntterminateprocessptr=(unsigned char*)(*(ULONG*)Address);  
  250.   

  251.   if (obcheckobjectaccessptr[0]==0x68)
  252.   {
  253.    
  254.     WPOFF();
  255.     oldIrql = KeRaiseIrqlToDpcLevel();
  256.     RtlCopyMemory(obcheckobjectaccessptr,oldcode,8);
  257.     KeLowerIrql(oldIrql);
  258.     WPON();

  259.   }
  260.   if (ntterminateprocessptr[0]==0x68)
  261.   {
  262.    

  263.     WPOFF();
  264.     oldIrql = KeRaiseIrqlToDpcLevel();
  265.     RtlCopyMemory(ntterminateprocessptr,oldcode,8);
  266.     KeLowerIrql(oldIrql);
  267.     WPON();

  268.   }

  269. }

  270. //////////////////////////////////////////////////////////////////////////NtOpenProcess
  271. typedef NTSTATUS (*NTOPENPROCESS) (
  272.           __out PHANDLE ProcessHandle,
  273.           __in ACCESS_MASK DesiredAccess,
  274.           __in POBJECT_ATTRIBUTES ObjectAttributes,
  275.           __in_opt PCLIENT_ID ClientId
  276.           );

  277. NTOPENPROCESS OldNtProcessAdd;
  278. NTOPENPROCESS HookedNtOpenProcess;

  279. extern POBJECT_TYPE PsProcessType;

  280. NTSTATUS
  281. NewNtOpenProcess (
  282.         __out PHANDLE ProcessHandle,
  283.         __in ACCESS_MASK DesiredAccess,
  284.         __in POBJECT_ATTRIBUTES ObjectAttributes,
  285.         __in_opt PCLIENT_ID ClientId
  286.         )
  287. {

  288.   HANDLE Handle;
  289.   KPROCESSOR_MODE PreviousMode;
  290.   NTSTATUS Status;
  291.   PEPROCESS Process;
  292.   PETHREAD Thread;
  293.   CLIENT_ID CapturedCid={0};
  294.   BOOLEAN ObjectNamePresent;
  295.   BOOLEAN ClientIdPresent;
  296.   ACCESS_STATE AccessState;
  297.   AUX_ACCESS_DATA AuxData;
  298.   ULONG Attributes;
  299.   LUID SeDebugPrivilege = {0};

  300.   POBJECT_TYPE _PsProcessType;

  301.   PEPROCESS tempeprocess;

  302.   if (!strcmp("Open.exe",GetProcessNameFromEProc(0)))
  303.   {
  304.     DbgPrint("open.exe openprocess!\n");
  305.   }

  306.   if (!strcmp("HProtect.exe",GetProcessNameFromEProc(0)) || !strcmp("zhengtu2.dat",GetProcessNameFromEProc(0)))
  307.   {
  308.   //  return HookedNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);

  309.     PsLookupProcessByProcessId(ClientId->UniqueProcess,&tempeprocess);
  310.     __try
  311.     {
  312.       if (
  313.         !strcmp("DML.exe",GetProcessNameFromEProc(tempeprocess)) ||
  314.         (!strcmp("DragonNest.exe",GetProcessNameFromEProc(tempeprocess)) && PsGetCurrentProcessId()!=ClientId->UniqueProcess)
  315.         /*!strcmp("DeRoX.exe",GetProcessNameFromEProc(tempeprocess))*/
  316.         )
  317.       {
  318.         return STATUS_ACCESS_DENIED;
  319.       }

  320.     }
  321.     __except (EXCEPTION_EXECUTE_HANDLER)
  322.     {
  323.       dprintf("GetExceptionCode %08x\n",GetExceptionCode());
  324.       return GetExceptionCode();
  325.     }

  326.    
  327.   }


  328. //  UnHook();

  329.   (ULONG)_PsProcessType=*(ULONG*)PsProcessType;
  330.   PreviousMode = KeGetPreviousMode();
  331.   SeDebugPrivilege =RtlConvertLongToLuid(SE_DEBUG_PRIVILEGE);
  332.   if (PreviousMode != KernelMode) {
  333.     __try {
  334.       ProbeForWriteHandle (ProcessHandle);

  335.       ProbeForReadSmallStructure (ObjectAttributes,
  336.         sizeof(OBJECT_ATTRIBUTES),
  337.         sizeof(ULONG));
  338.       ObjectNamePresent = (BOOLEAN)ARGUMENT_PRESENT (ObjectAttributes->ObjectName);
  339.       Attributes = ObSanitizeHandleAttributes (ObjectAttributes->Attributes, UserMode);

  340.       if (ARGUMENT_PRESENT (ClientId)) {
  341.         ProbeForReadSmallStructure (ClientId, sizeof (CLIENT_ID), sizeof (ULONG));
  342.         CapturedCid = *ClientId;
  343.         ClientIdPresent = TRUE;
  344.       } else {
  345.         ClientIdPresent = FALSE;
  346.       }
  347.     }
  348.     __except (EXCEPTION_EXECUTE_HANDLER) {
  349.       return GetExceptionCode();
  350.     }
  351.   } else {
  352.     ObjectNamePresent = (BOOLEAN)ARGUMENT_PRESENT (ObjectAttributes->ObjectName);
  353.     Attributes = ObSanitizeHandleAttributes (ObjectAttributes->Attributes, KernelMode);
  354.     if (ARGUMENT_PRESENT (ClientId)) {
  355.       CapturedCid = *ClientId;
  356.       ClientIdPresent = TRUE;
  357.     } else {
  358.       ClientIdPresent = FALSE;
  359.     }
  360.   }

  361.   if (ObjectNamePresent && ClientIdPresent) {
  362.     return STATUS_INVALID_PARAMETER_MIX;
  363.   }

  364.   Status = SeCreateAccessState(
  365.     &AccessState,
  366.     &AuxData,
  367.     DesiredAccess,
  368.     &_PsProcessType->TypeInfo.GenericMapping
  369.     );

  370.   if ( !NT_SUCCESS(Status) ) {

  371.     return Status;
  372.   }

  373.   if (SeSinglePrivilegeCheck( SeDebugPrivilege, PreviousMode )) {

  374.     if ( AccessState.RemainingDesiredAccess & MAXIMUM_ALLOWED ) {
  375.       AccessState.PreviouslyGrantedAccess |= PROCESS_ALL_ACCESS;

  376.     } else {

  377.       AccessState.PreviouslyGrantedAccess |= ( AccessState.RemainingDesiredAccess );
  378.     }

  379.     AccessState.RemainingDesiredAccess = 0;

  380.   }
  381.   if (ObjectNamePresent) {


  382.     Status = ObOpenObjectByName(
  383.       ObjectAttributes,
  384.       _PsProcessType,
  385.       PreviousMode,
  386.       &AccessState,
  387.       0,
  388.       NULL,
  389.       &Handle
  390.       );

  391.     SeDeleteAccessState( &AccessState );

  392.     if ( NT_SUCCESS(Status) ) {
  393.       __try {
  394.         *ProcessHandle = Handle;
  395.       }
  396.       __except (EXCEPTION_EXECUTE_HANDLER) {
  397.         return GetExceptionCode ();
  398.       }
  399.     }
  400.     return Status;
  401.   }

  402.   if ( ClientIdPresent ) {

  403.     Thread = NULL;
  404.     if (CapturedCid.UniqueThread) {
  405.       Status = PsLookupProcessThreadByCid(
  406.         &CapturedCid,
  407.         &Process,
  408.         &Thread
  409.         );

  410.       if (!NT_SUCCESS(Status)) {
  411.         SeDeleteAccessState( &AccessState );
  412.         return Status;
  413.       }
  414.     } else {
  415.       Status = PsLookupProcessByProcessId(
  416.         CapturedCid.UniqueProcess,
  417.         &Process
  418.         );

  419.       if ( !NT_SUCCESS(Status) ) {
  420.         SeDeleteAccessState( &AccessState );
  421.         return Status;
  422.       }
  423.     }

  424.     //
  425.     // OpenObjectByAddress
  426.     //
  427.     Status = ObOpenObjectByPointer(
  428.       Process,
  429.       Attributes,
  430.       &AccessState,
  431.       0,
  432.       _PsProcessType,
  433.       PreviousMode,
  434.       &Handle
  435.       );

  436.     SeDeleteAccessState( &AccessState );

  437.     if (Thread) {
  438.       ObDereferenceObject(Thread);
  439.     }

  440.     ObDereferenceObject(Process);

  441.     if (NT_SUCCESS (Status)) {

  442.       __try {
  443.         *ProcessHandle = Handle;
  444.       }
  445.       __except (EXCEPTION_EXECUTE_HANDLER) {
  446.         return GetExceptionCode ();
  447.       }
  448.     }
  449.     return Status;
  450.   }
  451.   return STATUS_INVALID_PARAMETER_MIX;
  452. }


  453. ULONG Pass_NtOpenProcess()
  454. {

  455.   KIRQL oldIrql;
  456.   ULONG  Address=0;

  457.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase +  0x7A * 4;

  458.   (ULONG)OldNtProcessAdd = *(ULONG*)Address;

  459.   WPOFF();
  460.   oldIrql = KeRaiseIrqlToDpcLevel();

  461.   *((ULONG*)Address) = (ULONG)NewNtOpenProcess;  //HOOK SSDT
  462.   KeLowerIrql(oldIrql);
  463.   WPON();

  464.   return 1;
  465. }

  466. VOID UnDetour_NtOpenProcess()
  467. {
  468.   KIRQL oldIrql;
  469.   ULONG  Address=0;

  470.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase +  0x7A * 4;

  471.   WPOFF();
  472.   oldIrql = KeRaiseIrqlToDpcLevel();

  473.   *((ULONG*)Address) =(ULONG) OldNtProcessAdd;  //HOOK SSDT
  474.   KeLowerIrql(oldIrql);
  475.   WPON();

  476. }

  477. //////////////////////////////////////////////////////////////////////////
  478. typedef
  479. NTSTATUS
  480. (*NTREADVIRTUALMEMORY)(
  481.           IN HANDLE ProcessHandle,
  482.           IN PVOID BaseAddress,
  483.           OUT PVOID Buffer,
  484.           IN ULONG NumberOfBytesToRead,
  485.           OUT PULONG NumberOfBytesReaded OPTIONAL );

  486. NTREADVIRTUALMEMORY OldNtReadVirtualMemoryAdd;
  487. NTREADVIRTUALMEMORY HookedNtReadVirtualMemoryAdd;

  488. NTSTATUS NewNtReadVirtualMemory(
  489.                 IN HANDLE               ProcessHandle,
  490.                 IN PVOID                BaseAddress,
  491.                 OUT PVOID               Buffer,
  492.                 IN ULONG                NumberOfBytesToRead,
  493.                 OUT PULONG              NumberOfBytesReaded OPTIONAL
  494.                 )
  495. {

  496.   NTSTATUS    status;
  497.   PEPROCESS   pEProcess=0;
  498.   char*       proname=0;

  499.   


  500.   if (!strcmp("HProtect.exe",GetProcessNameFromEProc(0)) || !strcmp("zhengtu2.dat",GetProcessNameFromEProc(0)))
  501.   {
  502.     return HookedNtReadVirtualMemoryAdd(ProcessHandle,BaseAddress,Buffer,NumberOfBytesToRead,NumberOfBytesReaded);

  503.     if (!ProcessHandle)
  504.     {
  505.       return 0;

  506.     }

  507.     status = ObReferenceObjectByHandle(ProcessHandle,PROCESS_ALL_ACCESS,NULL,0,&pEProcess,NULL);

  508.     if(!NT_SUCCESS(status))
  509.     {
  510.       dprintf("ObReferenceObjectByHandle fail! %08x \n",status);
  511.       return 0;

  512.     }
  513.     ObDereferenceObject(pEProcess);
  514.     proname=GetProcessNameFromEProc(pEProcess);
  515.     if (PsGetCurrentProcessId()!=PsGetProcessId(pEProcess))
  516.     {
  517.       if (!strcmp("DragonNest.exe",proname) || !strcmp("MDL.exe",proname))
  518.       {
  519.         return STATUS_ACCESS_DENIED;
  520.       }
  521.     }

  522.   }
  523.   return OldNtReadVirtualMemoryAdd(ProcessHandle,BaseAddress,Buffer,NumberOfBytesToRead,NumberOfBytesReaded);

  524. }



  525. //////////////////////////////////////////////////////////////////////////NtReadVirtualMemory



  526. ULONG Pass_NtReadVirtualMemory()
  527. {
  528.   KIRQL oldIrql;
  529.   ULONG  Address=0;

  530.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 0xBA * 4;    //得到NtReadVirtualMemory的服务地址

  531.   (ULONG)OldNtReadVirtualMemoryAdd = *(ULONG*)Address;    //保存此地址


  532.   WPOFF();
  533.   oldIrql = KeRaiseIrqlToDpcLevel();
  534.   *((ULONG*)Address) = (ULONG)NewNtReadVirtualMemory;  //HOOK SSDT

  535.   KeLowerIrql(oldIrql);
  536.   WPON();
  537.   return 1;
  538. }

  539. //反补丁,用于最后恢复用
  540. VOID UnDetour_NtReadVirtualMemory()
  541. {
  542.   KIRQL oldIrql;
  543.   ULONG  Address=0;

  544.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 0xBA * 4;

  545.   WPOFF();
  546.   oldIrql = KeRaiseIrqlToDpcLevel();

  547.   *((ULONG*)Address) = (ULONG)OldNtReadVirtualMemoryAdd;  //HOOK SSDT
  548.   KeLowerIrql(oldIrql);
  549.   WPON();
  550. }
  551. //////////////////////////////////////////////////////////////////////////

  552. typedef NTSTATUS (*NTWRITEVIRTUALMEMORY)(

  553.            IN HANDLE               ProcessHandle,
  554.            IN PVOID                BaseAddress,
  555.            IN PVOID                Buffer,
  556.            IN ULONG                NumberOfBytesToWrite,
  557.            OUT PULONG              NumberOfBytesWritten OPTIONAL );

  558. NTWRITEVIRTUALMEMORY OldNtWriteVirtualMemoryAdd;
  559. NTWRITEVIRTUALMEMORY HookedNtWriteVirtualMemoryAdd;


  560. NTSTATUS
  561. NTAPI
  562. NewNtWriteVirtualMemory(

  563.            IN HANDLE               ProcessHandle,
  564.            IN PVOID                BaseAddress,
  565.            IN PVOID                Buffer,
  566.            IN ULONG                NumberOfBytesToWrite,
  567.            OUT PULONG              NumberOfBytesWritten OPTIONAL )
  568. {

  569.   if (!strcmp("HProtect.exe",GetProcessNameFromEProc(0)) || !strcmp("zhengtu2.dat",GetProcessNameFromEProc(0)))
  570.   {
  571.     return HookedNtWriteVirtualMemoryAdd(ProcessHandle,BaseAddress,Buffer,NumberOfBytesToWrite,NumberOfBytesWritten);
  572.   }

  573.   return OldNtWriteVirtualMemoryAdd(ProcessHandle,BaseAddress,Buffer,NumberOfBytesToWrite,NumberOfBytesWritten);

  574. }

  575. ULONG Pass_NtWriteVirtualMemory()
  576. {
  577.   KIRQL oldIrql;
  578.   ULONG  Address=0;

  579.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 277 * 4;   

  580.   (ULONG)OldNtWriteVirtualMemoryAdd = *(ULONG*)Address;    //保存此地址


  581.   WPOFF();
  582.   oldIrql = KeRaiseIrqlToDpcLevel();
  583.   *((ULONG*)Address) = (ULONG)NewNtWriteVirtualMemory;  //HOOK SSDT

  584.   KeLowerIrql(oldIrql);
  585.   WPON();
  586.   return 1;
  587. }

  588. //反补丁,用于最后恢复用
  589. VOID UnDetour_NtWriteVirtualMemory()
  590. {
  591.   KIRQL oldIrql;
  592.   ULONG  Address=0;

  593.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 277 * 4;

  594.   WPOFF();
  595.   oldIrql = KeRaiseIrqlToDpcLevel();

  596.   *((ULONG*)Address) = (ULONG)OldNtWriteVirtualMemoryAdd;  //HOOK SSDT
  597.   KeLowerIrql(oldIrql);
  598.   WPON();
  599. }

  600. //////////////////////////////////////////////////////////////////////////

  601. typedef NTSTATUS (*NTCREATESEMAPHORE)(
  602.           OUT PHANDLE             SemaphoreHandle,
  603.           IN ACCESS_MASK          DesiredAccess,
  604.           IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
  605.           IN ULONG                InitialCount,
  606.           IN ULONG                MaximumCount );

  607. NTCREATESEMAPHORE OrgNtCreateSemaphore;

  608. ULONG semhandle=0;

  609. NTSTATUS __stdcall MyNtCreateSemaphore(
  610.                      OUT PHANDLE             SemaphoreHandle,
  611.                      IN ACCESS_MASK          DesiredAccess,
  612.                      IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
  613.                      IN ULONG                InitialCount,
  614.                      IN ULONG                MaximumCount
  615.                      )
  616. {
  617.   PUNICODE_STRING p_mutex_name;
  618.   UNICODE_STRING uni_count={0};


  619.   HANDLE tmphand;
  620.   NTSTATUS nTstatus;
  621.   __try
  622.   {
  623.     if (!strcmp(GetProcessNameFromEProc(0),"DragonNest.exe"))
  624.     {
  625.       if(ObjectAttributes==NULL)
  626.         return OrgNtCreateSemaphore(SemaphoreHandle,DesiredAccess,ObjectAttributes,InitialCount,MaximumCount);

  627.       p_mutex_name=ObjectAttributes->ObjectName;

  628.       if(p_mutex_name  )
  629.       {
  630.         if (p_mutex_name->Buffer)
  631.         {
  632.           //dprintf("Semaphore %S\n",p_mutex_name->Buffer);
  633.           //dnx_57987675368241

  634.           if (wcsstr(p_mutex_name->Buffer,L"dnx_57987675368241"))
  635.           {      
  636.             /*         
  637.             nTstatus=OrgNtCreateSemaphore(SemaphoreHandle,DesiredAccess,ObjectAttributes,InitialCount,MaximumCount);
  638.             dprintf("Semaphore %S\n",p_mutex_name->Buffer);
  639.             dprintf("OrgNtCreateSemaphore nTstatus %08x\n",nTstatus);
  640.             //    semhandle=(ULONG)*SemaphoreHandle;
  641.             //    dprintf("DragonNest pid %d MyNtCreateSemaphore dnx_57987675368241 handle %08x\n",PsGetCurrentProcessId(),semhandle);
  642.             return nTstatus;
  643.             */      

  644.             
  645.             while(1)
  646.             {
  647.               nTstatus=OrgNtCreateSemaphore(SemaphoreHandle,DesiredAccess,ObjectAttributes,InitialCount,MaximumCount);
  648.               if (nTstatus==STATUS_OBJECT_NAME_EXISTS)
  649.               {
  650.                 dprintf("STATUS_OBJECT_NAME_EXISTS\n");
  651.                 if (SemaphoreHandle)
  652.                 {
  653.                   dprintf("SemaphoreHandle %08x\n",*(ULONG*)SemaphoreHandle);
  654.                   tmphand=*(HANDLE*)SemaphoreHandle;
  655.                   if (tmphand)
  656.                   {
  657.                     ZwClose(tmphand);
  658.                   }
  659.                 }
  660.                
  661.                 g_Sem_count++;
  662.                 if(g_Sem_count==20)  g_Sem_count=0;
  663.                 uni_count.Buffer=(PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);
  664.                 uni_count.MaximumLength=BUFFER_SIZE;
  665.                 nTstatus=RtlIntegerToUnicodeString(g_Sem_count,10,&uni_count);
  666.                   if (NT_SUCCESS(nTstatus))
  667.                   {
  668.                     p_mutex_name->MaximumLength=0x100;
  669.                     RtlAppendUnicodeStringToString(p_mutex_name,&uni_count);
  670.                   }
  671.                   else
  672.                   {
  673.                     dprintf("RtlIntegerToUnicodeString error!\n");
  674.                   }
  675.                   RtlFreeUnicodeString(&uni_count);

  676.               //  RtlInitUnicodeString(&uni_count,wzCount);
  677.               }
  678.               else
  679.               {
  680.                 dprintf("CreateSemaphore sucess! Semaphore name %S\n",p_mutex_name->Buffer);
  681.                 return nTstatus;
  682.               }

  683.             }
  684.             //  MaximumCount=10;
  685.             //  dprintf("DragonNest CreateSemaphore MaximumCount :%d InitialCount :%d\n",MaximumCount,InitialCount);
  686.             //  dprintf("fack mutex!\n");
  687.             //  return STATUS_SUCCESS;
  688.           }
  689.         }

  690.       }
  691.     }
  692.   }
  693.   __except(1)
  694.   {
  695.     dprintf("MyNtCreateSemaphore error\n");
  696.   }
  697.   return OrgNtCreateSemaphore(SemaphoreHandle,DesiredAccess,ObjectAttributes,InitialCount,MaximumCount);
  698. }

  699. ULONG Pass_NtCreateSemaphore()
  700. {
  701.   KIRQL oldIrql;
  702.   ULONG  Address=0;

  703.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 51 * 4;   

  704.   (ULONG)OrgNtCreateSemaphore = *(ULONG*)Address;    //保存此地址

  705.   WPOFF();
  706.   oldIrql = KeRaiseIrqlToDpcLevel();
  707.   *((ULONG*)Address) = (ULONG)MyNtCreateSemaphore;      //HOOK SSDT
  708.   KeLowerIrql(oldIrql);
  709.   WPON();
  710.   return 1;
  711. }

  712. //反补丁,用于最后恢复用
  713. VOID UnDetour_NtCreateSemaphore()
  714. {
  715.   KIRQL oldIrql;
  716.   ULONG  Address=0;

  717.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 51 * 4;

  718.   WPOFF();
  719.   oldIrql = KeRaiseIrqlToDpcLevel();

  720.   *((ULONG*)Address) = (ULONG)OrgNtCreateSemaphore;  //HOOK SSDT
  721.   KeLowerIrql(oldIrql);
  722.   WPON();
  723. }
  724. //////////////////////////////////////////////////////////////////////////

  725. typedef NTSTATUS (*NTRELEASESEMAPHORE)(

  726.            IN HANDLE               SemaphoreHandle,
  727.            IN ULONG                ReleaseCount,
  728.            OUT PULONG              PreviousCount OPTIONAL );

  729. NTRELEASESEMAPHORE OrgNtReleaseSemaphore;

  730. NTSTATUS __stdcall MyNtReleaseSemaphore(
  731.                     IN HANDLE               SemaphoreHandle,
  732.                     IN ULONG                ReleaseCount,
  733.                     OUT PULONG              PreviousCount OPTIONAL
  734.                     )
  735. {
  736.   UNICODE_STRING semaphorename;
  737.   __try
  738.   {
  739.     if (!strcmp(GetProcessNameFromEProc(0),"DragonNest.exe"))
  740.     {

  741.       if (semhandle==(ULONG)SemaphoreHandle)
  742.       {
  743.         dprintf("DragonNest pid %d ReleaseSemaphore handle %08x\n",PsGetCurrentProcessId(),SemaphoreHandle);
  744.       }
  745.       
  746. /*
  747.       if (!GetObjectNameFromHandle(SemaphoreHandle,&semaphorename))
  748.       {
  749.         if (!wcscmp(semaphorename.Buffer,L"dnx_57987675368241"))
  750.         {
  751.           dprintf("DragonNest pid %d ReleaseSemaphore name %wZ\n",PsGetCurrentProcessId(),&semaphorename);
  752.         }
  753.         
  754.       }
  755.       */
  756.     }
  757.   }
  758.   __except(1)
  759.   {
  760.     dprintf("MyNtReleaseSemaphore error!\n");
  761.   }
  762.   return OrgNtReleaseSemaphore(SemaphoreHandle,ReleaseCount,PreviousCount);
  763. }

  764. ULONG Pass_NtReleaseSemaphore()
  765. {
  766.   KIRQL oldIrql;
  767.   ULONG  Address=0;

  768.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 189 * 4;   

  769.   (ULONG)OrgNtReleaseSemaphore = *(ULONG*)Address;    //保存此地址

  770.   WPOFF();
  771.   oldIrql = KeRaiseIrqlToDpcLevel();
  772.   *((ULONG*)Address) = (ULONG)MyNtReleaseSemaphore;      //HOOK SSDT
  773.   KeLowerIrql(oldIrql);
  774.   WPON();
  775.   return 1;
  776. }

  777. //反补丁,用于最后恢复用
  778. VOID UnDetour_NtReleaseSemaphore()
  779. {
  780.   KIRQL oldIrql;
  781.   ULONG  Address=0;

  782.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 189 * 4;

  783.   WPOFF();
  784.   oldIrql = KeRaiseIrqlToDpcLevel();

  785.   *((ULONG*)Address) = (ULONG)OrgNtReleaseSemaphore;  //HOOK SSDT
  786.   KeLowerIrql(oldIrql);
  787.   WPON();
  788. }
  789. //////////////////////////////////////////////////////////////////////////


  790. typedef  NTSTATUS (*NTOPENSEMAPHORE)(

  791.         OUT PHANDLE             SemaphoreHandle,
  792.         IN ACCESS_MASK          DesiredAccess,
  793.         IN POBJECT_ATTRIBUTES   ObjectAttributes );

  794. NTOPENSEMAPHORE OrgNtOpenSemaphore;

  795. NTSTATUS __stdcall MyNtOpenSemaphore(
  796.                    OUT PHANDLE             SemaphoreHandle,
  797.                    IN ACCESS_MASK          DesiredAccess,
  798.                    IN POBJECT_ATTRIBUTES   ObjectAttributes )
  799. {
  800.   PUNICODE_STRING p_mutex_name;
  801.   __try
  802.   {
  803.     if (!strcmp(GetProcessNameFromEProc(0),"DragonNest.exe"))
  804.     {
  805.   //    dprintf("DragonNest pid %d OpenSemaphore\n",PsGetCurrentProcessId());

  806.       p_mutex_name=ObjectAttributes->ObjectName;

  807.       if(p_mutex_name  )
  808.       {
  809.         if (p_mutex_name->Buffer)
  810.         {
  811.           if (wcsstr(p_mutex_name->Buffer,L"dnx_57987675368241"))
  812.           {
  813.             dprintf("DragonNest PID %d NtOpenSemaphore name %S\n",PsGetCurrentProcessId(),p_mutex_name->Buffer);
  814.           }  
  815.         }
  816.       }

  817.       
  818.     }
  819.   }
  820.   __except(1)
  821.   {
  822.     dprintf("MyNtOpenSemaphore error!\n");
  823.   }
  824.   return OrgNtOpenSemaphore(SemaphoreHandle,DesiredAccess,ObjectAttributes);
  825. }

  826. ULONG Pass_NtOpenSemaphore()
  827. {
  828.   KIRQL oldIrql;
  829.   ULONG  Address=0;

  830.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 126 * 4;   

  831.   (ULONG)OrgNtOpenSemaphore = *(ULONG*)Address;    //保存此地址

  832.   WPOFF();
  833.   oldIrql = KeRaiseIrqlToDpcLevel();
  834.   *((ULONG*)Address) = (ULONG)MyNtOpenSemaphore;      //HOOK SSDT
  835.   KeLowerIrql(oldIrql);
  836.   WPON();
  837.   return 1;
  838. }

  839. //反补丁,用于最后恢复用
  840. VOID UnDetour_NtOpenSemaphore()
  841. {
  842.   KIRQL oldIrql;
  843.   ULONG  Address=0;

  844.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 126 * 4;

  845.   WPOFF();
  846.   oldIrql = KeRaiseIrqlToDpcLevel();

  847.   *((ULONG*)Address) = (ULONG)OrgNtOpenSemaphore;  //HOOK SSDT
  848.   KeLowerIrql(oldIrql);
  849.   WPON();
  850. }
  851. //////////////////////////////////////////////////////////////////////////



  852. typedef NTSTATUS (*NTWAITFORSINGLEOBJECT)(

  853.             IN HANDLE               ObjectHandle,
  854.             IN BOOLEAN              Alertable,
  855.             IN PLARGE_INTEGER       TimeOut );

  856. NTWAITFORSINGLEOBJECT OrgNtWaitForSingleObject;

  857. NTSTATUS __stdcall MyNtWaitForSingleObject(
  858.   IN HANDLE               ObjectHandle,
  859.   IN BOOLEAN              Alertable,
  860.   IN PLARGE_INTEGER       TimeOut )
  861. {
  862.   UNICODE_STRING Objectname;
  863.   __try
  864.   {
  865.     if (!strcmp(GetProcessNameFromEProc(0),"DragonNest.exe"))
  866.     {
  867.       if (semhandle==(ULONG)ObjectHandle)
  868.       {
  869.         dprintf("DragonNest pid %d MyNtWaitForSingleObject name %wZ TimeOut %d\n",PsGetCurrentProcessId(),&Objectname,TimeOut);
  870.       }
  871.       /*
  872.       if (!GetObjectNameFromHandle(ObjectHandle,&Objectname))
  873.       {
  874.         if (!wcscmp(Objectname.Buffer,L"dnx_57987675368241"))
  875.         {
  876.           dprintf("DragonNest pid %d MyNtWaitForSingleObject name %wZ TimeOut %d\n",PsGetCurrentProcessId(),&Objectname,TimeOut);
  877.         }
  878.         
  879.       }
  880.       */
  881.     }
  882.   }
  883.   __except(1)
  884.   {
  885.     dprintf("MyNtOpenSemaphore error!\n");
  886.   }
  887.   return OrgNtWaitForSingleObject(ObjectHandle,Alertable,TimeOut);
  888. }

  889. ULONG Pass_NtWaitForSingleObject()
  890. {
  891.   KIRQL oldIrql;
  892.   ULONG  Address=0;

  893.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 271 * 4;   

  894.   (ULONG)OrgNtWaitForSingleObject = *(ULONG*)Address;    //保存此地址

  895.   WPOFF();
  896.   oldIrql = KeRaiseIrqlToDpcLevel();
  897.   *((ULONG*)Address) = (ULONG)MyNtWaitForSingleObject;      //HOOK SSDT
  898.   KeLowerIrql(oldIrql);
  899.   WPON();
  900.   return 1;
  901. }

  902. //反补丁,用于最后恢复用
  903. VOID UnDetour_NtWaitForSingleObject()
  904. {
  905.   KIRQL oldIrql;
  906.   ULONG  Address=0;

  907.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase + 271 * 4;

  908.   WPOFF();
  909.   oldIrql = KeRaiseIrqlToDpcLevel();

  910.   *((ULONG*)Address) = (ULONG)OrgNtWaitForSingleObject;  //HOOK SSDT
  911.   KeLowerIrql(oldIrql);
  912.   WPON();
  913. }


  914. //////////////////////////////////////////////////////////////////////////



  915. //////////////////////////////////////////////////////////////////////////


  916. typedef UINT_PTR (*NTUSERQUERYWINDOW)(
  917.                     IN ULONG WindowHandle,
  918.                     IN ULONG TypeInformation);

  919. NTUSERQUERYWINDOW OldNtUserQueryWindow;


  920. NTSTATUS FindNtUserQueryWindow()
  921. {
  922.   NTSTATUS status=0;

  923.   KeAttachProcess(crsEProc);

  924.   __try
  925.   {
  926.     if (KeServiceDescriptorTableShadow!=NULL)
  927.     {
  928.       OldNtUserQueryWindow = (NTUSERQUERYWINDOW)KeServiceDescriptorTableShadow[1].ServiceTableBase[0x1E3];

  929.     }
  930.   }
  931.   __finally
  932.   {
  933.     KeDetachProcess();
  934.   }


  935.   return status ;


  936. }


  937. //////////////////////////////////////////////////////////////////////////

  938. unsigned int getAddressOfShadowTable()
  939. {
  940.   unsigned int i;
  941.   unsigned char *p;
  942.   unsigned int dwordatbyte;

  943.   p = (unsigned char*) KeAddSystemServiceTable;

  944.   for(i = 0; i < 4096; i++, p++)
  945.   {
  946.     __try
  947.     {
  948.       dwordatbyte = *(unsigned int*)p;
  949.     }
  950.     __except(EXCEPTION_EXECUTE_HANDLER)
  951.     {
  952.       return 0;
  953.     }

  954.     if(MmIsAddressValid((PVOID)dwordatbyte))
  955.     {
  956.       if(memcmp((PVOID)dwordatbyte, &KeServiceDescriptorTable, 16) == 0)
  957.       {
  958.         if((PVOID)dwordatbyte == &KeServiceDescriptorTable)
  959.         {
  960.           continue;
  961.         }

  962.         return dwordatbyte;
  963.       }
  964.     }
  965.   }

  966.   return 0;
  967. }

  968. ULONG getShadowTable()
  969. {
  970.   KeServiceDescriptorTableShadow = (PSERVICE_DESCRIPTOR_TABLE) getAddressOfShadowTable();

  971.   if(KeServiceDescriptorTableShadow == NULL)
  972.   {
  973.     dprintf("hooker.sys: Couldnt find shadowtable!\n");

  974.     return FALSE;
  975.   }
  976.   else
  977.   {
  978.     dprintf("hooker.sys: Shadowtable has been found!\n");

  979.     dprintf("hooker.sys: Shadowtable entries: %d\n", KeServiceDescriptorTableShadow[1].NumberOfServices);
  980.     return TRUE;
  981.   }
  982. }





  983. //6A 30       PUSH 0x30
  984. //68 70D898BF    PUSH 0xBF98D870

  985. unsigned long reentry_ntuserfinwind;
  986. UCHAR g_oldcode_ntuserfindwind[8];

  987. __declspec(naked) NTSTATUS _NtUserFindWindowEx(
  988.   HANDLE hwndParent,
  989.   HANDLE hwndChild,
  990.   PUNICODE_STRING pstrClassName ,
  991.   PUNICODE_STRING pstrWindowName ,
  992.   DWORD dwType)

  993. {

  994.   __asm
  995.   {
  996.     push 0x30
  997.     push 0xBF98D870
  998.     jmp  [reentry_ntuserfinwind]
  999.   }

  1000. }

  1001. NTSTATUS InitSWSSDT()
  1002. {
  1003.   NTSTATUS status;
  1004.   getShadowTable();

  1005.   


  1006.   status = PsLookupProcessByProcessId((HANDLE)GetCsrPid(), &crsEProc);
  1007.   if (!NT_SUCCESS( status ))
  1008.   {
  1009.     dprintf("PsLookupProcessByProcessId() error\n");

  1010.   }
  1011.   FindNtUserQueryWindow();
  1012.   return status;
  1013. }
  1014. char* GetProcessName( ULONG nProcessId)
  1015. {
  1016.   NTSTATUS rStutus;

  1017.   PEPROCESS       curproc;

  1018.   rStutus=PsLookupProcessByProcessId((HANDLE)nProcessId,&curproc);
  1019.   if (!rStutus)
  1020.   {
  1021.     ObDereferenceObject(curproc);
  1022.     return GetProcessNameFromEProc(curproc);
  1023.   }
  1024.   return 0;

  1025. }

  1026. NTSTATUS MyNtUserFindWindowEx(
  1027.                 IN HANDLE hwndParent,
  1028.                 IN HANDLE hwndChild,
  1029.                 IN PUNICODE_STRING pstrClassName OPTIONAL,
  1030.                 IN PUNICODE_STRING pstrWindowName OPTIONAL,
  1031.                 IN DWORD dwType)
  1032. {
  1033.   ULONG result;
  1034.   UNICODE_STRING CLASSNAME;
  1035.   //UNICODE_STRING FIXCLASSNAME;
  1036.   ULONG FindProcessID;
  1037.   char* szFindProcessName;
  1038.   ULONG ProcessID;  

  1039.   result = _NtUserFindWindowEx(hwndParent, hwndChild, pstrClassName, pstrWindowName, dwType);

  1040.   if (!_stricmp("DragonNest.exe",GetProcessNameFromEProc(0)))
  1041.   {
  1042.      
  1043.     ProcessID = OldNtUserQueryWindow(result, 0);
  1044.    
  1045.     if (ProcessID!=(ULONG)PsGetCurrentProcessId())   
  1046.     {

  1047.       if (pstrClassName!=0)
  1048.       {
  1049.         RtlInitUnicodeString(&CLASSNAME,L"DRAGONNEST");
  1050.         if (!RtlCompareUnicodeString(pstrClassName,&CLASSNAME,FALSE))
  1051.         {

  1052.           return 0;  

  1053.         }
  1054.       }
  1055.       if (pstrWindowName!=0)
  1056.       {
  1057.         RtlInitUnicodeString(&CLASSNAME,L"龙之谷");
  1058.         if (!RtlCompareUnicodeString(pstrWindowName,&CLASSNAME,FALSE))
  1059.         {

  1060.           return 0;

  1061.         }
  1062.         RtlInitUnicodeString(&CLASSNAME,L"DML");
  1063.         if (!RtlCompareUnicodeString(pstrWindowName,&CLASSNAME,FALSE))
  1064.         {

  1065.           return 0;

  1066.         }
  1067.       }

  1068.     }
  1069.    
  1070.   }


  1071.   return result;
  1072. }





  1073. typedef NTSTATUS (*NTUSERFINDWINDOWEX)(
  1074.                      HANDLE hwndParent,
  1075.                      HANDLE hwndChild,
  1076.                      PUNICODE_STRING pstrClassName ,
  1077.                      PUNICODE_STRING pstrWindowName ,
  1078.                      DWORD dwType);


  1079. NTUSERFINDWINDOWEX          g_OriginalNtUserFindWindowEx;




  1080. NTSTATUS HookFindWindow()
  1081. {
  1082.   NTSTATUS status=0;

  1083.   unsigned char newcode[] = { 0xE9, 0x44, 0x33, 0x22, 0x11,0x90,0x90};


  1084.   KeAttachProcess(crsEProc);

  1085.   __try
  1086.   {
  1087.     if (KeServiceDescriptorTableShadow!=NULL)
  1088.     {
  1089.       g_OriginalNtUserFindWindowEx     = (NTUSERFINDWINDOWEX)KeServiceDescriptorTableShadow[1].ServiceTableBase[0x17A];
  1090.       memcpy(g_oldcode_ntuserfindwind,(UCHAR*)g_OriginalNtUserFindWindowEx,7);
  1091.       reentry_ntuserfinwind=(unsigned long)g_OriginalNtUserFindWindowEx+7;
  1092.       *( (unsigned long *)(&newcode[1]) ) = (unsigned long)MyNtUserFindWindowEx-(unsigned long)g_OriginalNtUserFindWindowEx-5;

  1093.     }
  1094.     else
  1095.       KeServiceDescriptorTableShadow=NULL;


  1096.     WPOFF();
  1097.     if (KeServiceDescriptorTableShadow!=NULL )
  1098.     {

  1099.       memcpy((UCHAR*)g_OriginalNtUserFindWindowEx,newcode,7);
  1100.     }

  1101.     WPON();
  1102.   }
  1103.   __finally
  1104.   {
  1105.     KeDetachProcess();
  1106.   }



  1107.   return status ;
  1108. }

  1109. NTSTATUS UnHookFindWindow()
  1110. {
  1111.   NTSTATUS status;

  1112.   KeAttachProcess(crsEProc);

  1113.   __try
  1114.   {
  1115.     WPOFF();

  1116.     if (KeServiceDescriptorTableShadow!=NULL)
  1117.     {
  1118.       memcpy((UCHAR*)g_OriginalNtUserFindWindowEx,g_oldcode_ntuserfindwind,7);

  1119.     }

  1120.     WPON();
  1121.   }
  1122.   __finally
  1123.   {
  1124.     KeDetachProcess();
  1125.     Sleep(50);
  1126.   }
  1127.   return 0;
  1128. }



  1129. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  1130. //////////////////////////////////////////////////////////////////////////



  1131. ULONG          OldNtUserPostMessage;


  1132. NTSTATUS __declspec(naked) MyNtUserPostMessage()
  1133. {
  1134.   __asm
  1135.   {
  1136.     push ebp
  1137.     mov  ebp,esp
  1138.     push  esi
  1139.     mov   eax,OldNtUserPostMessage
  1140.     add   eax,6
  1141.     jmp   eax
  1142.   }
  1143.   
  1144. }

  1145. NTSTATUS HookNtUserPostMessage()
  1146. {

  1147.   KIRQL oldIrql;
  1148.   ULONG  Address=0;

  1149.   __try
  1150.   {
  1151.     KeAttachProcess(crsEProc);

  1152.     Address = (ULONG)ShadowTable->NotUse2.ServiceTableBase + 475 * 4;   
  1153.     (ULONG)OldNtUserPostMessage = *(ULONG*)Address;   

  1154.     WPOFF();
  1155.     oldIrql = KeRaiseIrqlToDpcLevel();
  1156.     *((ULONG*)Address) = (ULONG)MyNtUserPostMessage;  //HOOK SSDT
  1157.     KeLowerIrql(oldIrql);
  1158.     WPON();
  1159.    
  1160.   }
  1161.   __finally
  1162.   {
  1163.     KeDetachProcess();
  1164.   }
  1165.   return 0 ;
  1166. }

  1167. NTSTATUS UnHookNtUserPostMessage()
  1168. {
  1169.   KIRQL oldIrql;
  1170.   ULONG  Address=0;

  1171.   __try
  1172.   {
  1173.     KeAttachProcess(crsEProc);

  1174.     Address = (ULONG)ShadowTable->NotUse2.ServiceTableBase +475 * 4;
  1175.     WPOFF();
  1176.     oldIrql = KeRaiseIrqlToDpcLevel();

  1177.     *((ULONG*)Address) = (ULONG)OldNtUserPostMessage;  //HOOK SSDT
  1178.     KeLowerIrql(oldIrql);
  1179.     WPON();

  1180.   }
  1181.   __finally
  1182.   {
  1183.     KeDetachProcess();
  1184.   }

  1185.   return 0;
  1186. }


  1187. //////////////////////////////////////////////////////////////////////////




  1188. ULONG          OldNtUserMessageCall;


  1189. NTSTATUS __declspec(naked) MyNtUserMessageCall()
  1190. {
  1191.   __asm
  1192.   {
  1193.     push ebp
  1194.     mov  ebp,esp
  1195.     sub  esp,0xc
  1196.     mov   eax,OldNtUserMessageCall
  1197.     add   eax,8
  1198.     jmp   eax
  1199.   }

  1200. }

  1201. NTSTATUS HookNtUserMessageCall()
  1202. {

  1203.   KIRQL oldIrql;
  1204.   ULONG  Address=0;
  1205.   
  1206.   __try
  1207.   {
  1208.     KeAttachProcess(crsEProc);

  1209.     Address = (ULONG)ShadowTable->NotUse2.ServiceTableBase + 460 * 4;   
  1210.     (ULONG)OldNtUserMessageCall = *(ULONG*)Address;   

  1211.     WPOFF();
  1212.     oldIrql = KeRaiseIrqlToDpcLevel();
  1213.     *((ULONG*)Address) = (ULONG)MyNtUserMessageCall;  //HOOK SSDT
  1214.     KeLowerIrql(oldIrql);
  1215.     WPON();

  1216.   }
  1217.   __finally
  1218.   {
  1219.     KeDetachProcess();
  1220.   }


  1221.   return 0 ;
  1222. }

  1223. NTSTATUS UnHookNtUserMessageCall()
  1224. {
  1225.   KIRQL oldIrql;
  1226.   ULONG  Address=0;
  1227.   
  1228.   __try
  1229.   {
  1230.     KeAttachProcess(crsEProc);

  1231.     Address = (ULONG)ShadowTable->NotUse2.ServiceTableBase +460 * 4;
  1232.     WPOFF();
  1233.     oldIrql = KeRaiseIrqlToDpcLevel();

  1234.     *((ULONG*)Address) = (ULONG)OldNtUserMessageCall;  //HOOK SSDT
  1235.     KeLowerIrql(oldIrql);
  1236.     WPON();

  1237.   }
  1238.   __finally
  1239.   {
  1240.     KeDetachProcess();
  1241.   }


  1242.   return 0;
  1243. }

  1244. //////////////////////////////////////////////////////////////////////////

  1245. typedef struct tagKEYBDINPUT {
  1246.   SHORT wVk;
  1247.   SHORT wScan;
  1248.   ULONG dwFlags;
  1249.   ULONG time;
  1250.   ULONG_PTR dwExtraInfo;
  1251. } KEYBDINPUT, *PKEYBDINPUT;

  1252. typedef struct tagMOUSEINPUT {
  1253.   LONG dx;
  1254.   LONG dy;
  1255.   ULONG mouseData;
  1256.   ULONG dwFlags;
  1257.   ULONG time;
  1258.   ULONG_PTR dwExtraInfo;
  1259. } MOUSEINPUT, *PMOUSEINPUT;

  1260. typedef struct tagHARDWAREINPUT {
  1261.   ULONG uMsg;
  1262.   SHORT wParamL;
  1263.   SHORT wParamH;
  1264. } HARDWAREINPUT, *PHARDWAREINPUT;

  1265. typedef struct tagINPUT {  
  1266.   ULONG type;  
  1267.   union {MOUSEINPUT mi;  
  1268.   KEYBDINPUT ki;
  1269.   HARDWAREINPUT hi;
  1270.   };
  1271. }INPUT, *PINPUT;

  1272. typedef ULONG (NTAPI*NTUSERSENDINPUT)(ULONG,PINPUT,int);




  1273. NTUSERSENDINPUT          OldNtUserSendInput;
  1274. //ULONG OldNtUserSendInputree;


  1275. NTSTATUS __declspec(naked) _NtUserSendInput(IN ULONG nInputs,IN PINPUT pInputs,IN int cbSize)
  1276. {
  1277.   __asm
  1278.   {
  1279.     push 0x18
  1280.     push 0xbf98f050
  1281.     mov  eax,OldNtUserSendInput
  1282.     add  eax,7
  1283.     jmp   eax
  1284.   }

  1285. }

  1286. ULONG NTAPI MyNtUserSendInput(IN ULONG nInputs,IN PINPUT pInputs,IN int cbSize)
  1287. {
  1288.   if (!strcmp(GetProcessNameFromEProc(0),"DragonNest.exe"))
  1289.   {
  1290.     dprintf("DragonNest NtUserSendInput\n");
  1291.    
  1292.   }

  1293.   return OldNtUserSendInput(nInputs,pInputs,cbSize);

  1294. //  return _NtUserSendInput(nInputs,pInputs,cbSize);

  1295. }


  1296. NTSTATUS HookNtUserSendInput()
  1297. {

  1298.   KIRQL oldIrql;
  1299.   ULONG  Address=0;
  1300.   
  1301.   __try
  1302.   {
  1303.     KeAttachProcess(crsEProc);

  1304.     Address = (ULONG)ShadowTable->NotUse2.ServiceTableBase + 502 * 4;   
  1305.     (ULONG)OldNtUserSendInput = *(ULONG*)Address;   

  1306. //    OldNtUserSendInputree=OldNtUserSendInput+7;

  1307.     WPOFF();
  1308.     oldIrql = KeRaiseIrqlToDpcLevel();
  1309.     *((ULONG*)Address) = (ULONG)_NtUserSendInput;  //HOOK SSDT
  1310.     KeLowerIrql(oldIrql);
  1311.     WPON();

  1312.   }
  1313.   __finally
  1314.   {
  1315.     KeDetachProcess();
  1316.   }

  1317.   return 0 ;
  1318. }

  1319. NTSTATUS UnHookNtUserSendInput()
  1320. {
  1321.   KIRQL oldIrql;
  1322.   ULONG  Address=0;
  1323.   
  1324.   __try
  1325.   {
  1326.     KeAttachProcess(crsEProc);

  1327.     Address = (ULONG)ShadowTable->NotUse2.ServiceTableBase +502 * 4;
  1328.     WPOFF();
  1329.     oldIrql = KeRaiseIrqlToDpcLevel();

  1330.     *((ULONG*)Address) = (ULONG)OldNtUserSendInput;  //HOOK SSDT
  1331.     KeLowerIrql(oldIrql);
  1332.     WPON();

  1333.   }
  1334.   __finally
  1335.   {
  1336.     KeDetachProcess();
  1337.   }

  1338.   return 0;
  1339. }

  1340. //////////////////////////////////////////////////////////////////////////

  1341. NTSTATUS GetHookedFunAdd()
  1342. {
  1343.   ULONG  Address=0;

  1344.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase +  0x7A * 4;
  1345.   
  1346.   (ULONG)HookedNtOpenProcess = *(ULONG*)Address;

  1347.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase +  0xBA * 4;

  1348.   (ULONG)HookedNtReadVirtualMemoryAdd = *(ULONG*)Address;

  1349.   Address = (ULONG)_KeServiceDescriptorTable->NotUse1.ServiceTableBase +  277 * 4;

  1350.   (ULONG)HookedNtWriteVirtualMemoryAdd = *(ULONG*)Address;
  1351.   
  1352.   return 0;
  1353. }

复制代码

该用户从未签到

发表于 2012-10-19 22:03:29 | 显示全部楼层
先收藏先谢谢LZ

该用户从未签到

发表于 2012-10-19 23:10:58 | 显示全部楼层
求成品 不会C++
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-1 00:55

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表