/PassGameProtection/TpDriver/WindbgDebug/Hook_KdDebuggerEnabled.h

https://github.com/dazhilang018900/MyVsProjs · C Header · 187 lines · 104 code · 20 blank · 63 comment · 1 complexity · 787d3cebbc612156b54f2926b0f97388 MD5 · raw file

  1. #ifndef __HOOK_KDDEBUGGERENABLED_H__
  2. #define __HOOK_KDDEBUGGERENABLED_H__
  3. #include "..\GlobalFunction.h"
  4. //KdDebuggerEnabled±äÁ¿´æ´¢
  5. BOOL g_bKdDebuggerEnabled = TRUE;
  6. //KdPitchDebugger±äÁ¿´æ´¢
  7. BOOL g_bKdPitchDebugger = FALSE;
  8. //HOOKµÄKdDebuggerEnabled±äÁ¿ºÍµØÖ·
  9. HookVariableAddr g_uKdDebuggerEnabledHookAddrs[5]={0};
  10. ULONG g_uKdDebuggerEnabled;
  11. ULONG g_uKdPitchDebugger;
  12. #pragma PAGECODE
  13. VOID MovKdPitchDebugger_Win7()
  14. {
  15. DisableWP();
  16. *(PULONG)g_uKdPitchDebugger = g_bKdPitchDebugger;
  17. EnableWP();
  18. KdPrint(("KdPitchDebuggerÖµ=%x\n",*(PULONG)g_uKdPitchDebugger));
  19. }
  20. #pragma PAGECODE
  21. VOID MovKdDebuggerEnabled_Win7()
  22. {
  23. DisableWP();
  24. *(PULONG)g_uKdDebuggerEnabled = g_bKdDebuggerEnabled;
  25. EnableWP();
  26. KdPrint(("KdDebuggerEnabledÖµ=%x\n",*(PULONG)g_bKdDebuggerEnabled));
  27. }
  28. #pragma PAGECODE
  29. VOID MoveVariable_Win7()
  30. {
  31. // ULONG uKeUpdateRunTimeAddr = GetServiceOldAddr(L"KeUpdateRunTime");
  32. // char pCode[]={(char)0x74, (char)0x12, (char)0xa1};
  33. // ULONG uAddr = SearchCode(uKeUpdateRunTimeAddr,pCode,sizeof(pCode)) - 8;
  34. // KdPrint(("KeUpdateRunTime->KdDebuggerEnabled=%x\n",uAddr));
  35. // g_uKdDebuggerEnabled = *(PULONG)uAddr;
  36. // DisableWP();
  37. // *(PULONG)(*(PULONG)uAddr) = g_bKdDebuggerEnabled;
  38. // EnableWP();
  39. // 83e850c2 803d2cfdf68300 cmp byte ptr [nt!KdDebuggerEnabled (83f6fd2c)],0
  40. // 83e850c9 7412 je nt!KeUpdateRunTime+0x164 (83e850dd)
  41. // 83e850cb a1ec31f483 mov eax,dword ptr [nt!POGOBuffer+0x6ac (83f431ec)]
  42. // 83e850d0 3b86cc030000 cmp eax,dword ptr [esi+3CCh]
  43. // 83e850d6 7505 jne nt!KeUpdateRunTime+0x164 (83e850dd)
  44. // 83e850d8 e80c000000 call nt!KdCheckForDebugBreak (83e850e9)
  45. //----------------------------¸ÄдKeUpdateRunTimeÖеÄKdDebuggerEnabled
  46. ULONG uKeUpdateRunTimeAddr = GetServiceOldAddr(L"KeUpdateRunTime");
  47. char pCode[]={(char)0x74, (char)0x12, (char)0xa1};
  48. ULONG uAddr = SearchCode(uKeUpdateRunTimeAddr,pCode,sizeof(pCode)) - 8;
  49. KdPrint(("KeUpdateRunTime->KdDebuggerEnabled=%x\n",uAddr));
  50. g_uKdDebuggerEnabledHookAddrs[0].uAddr = uAddr;
  51. g_uKdDebuggerEnabledHookAddrs[0].uVariableAddr = *(PULONG)uAddr;
  52. DisableWP();
  53. *(PULONG)uAddr=(ULONG)&g_bKdDebuggerEnabled;
  54. EnableWP();
  55. //----------------------------¸ÄдKdCheckForDebugBreakÖеÄKdDebuggerEnabled
  56. char pCode2 = (char)0xE8;
  57. //KdCheckForDebugBreakµÄº¯ÊýµØÖ·
  58. uAddr = SearchCode(uAddr,&pCode2,sizeof(pCode2));
  59. uAddr = uAddr + (*(PULONG)uAddr) + 4;
  60. KdPrint(("KdCheckForDebugBreakº¯ÊýµØÖ·=%x\n",uAddr));
  61. //¼Ç¼KdCheckForDebugBreakº¯ÊýµØÖ· ÓÃÓÚKdPitchDebugger±äÁ¿µÄ´¦Àí
  62. ULONG uAddr2 = uAddr;
  63. // 83ebe0f2 803d2c8dfa8300 cmp byte ptr [nt!KdDebuggerEnabled (83fa8d2c)],0
  64. // 83ebe0f9 7410 je nt!KdCheckForDebugBreak+0x22 (83ebe10b)
  65. char pCode3[] = {(char)0x74, (char)0x10, (char)0xe8};
  66. //KdCheckForDebugBreakÖÐKdDebuggerEnabledµÄµØÖ·
  67. uAddr = SearchCode(uAddr,pCode3,sizeof(pCode3)) - 8;
  68. KdPrint(("KdCheckForDebugBreak->KdDebuggerEnabled=%x\n",uAddr));
  69. g_uKdDebuggerEnabledHookAddrs[1].uAddr = uAddr;
  70. g_uKdDebuggerEnabledHookAddrs[1].uVariableAddr = *(PULONG)uAddr;
  71. DisableWP();
  72. *(PULONG)uAddr=(ULONG)&g_bKdDebuggerEnabled;
  73. EnableWP();
  74. //----------------------------¸ÄдKdCheckForDebugBreakÖеÄKdPitchDebugger=ExFreePool+0x72c0
  75. // 83ebe0e9 803d27cdf68300 cmp byte ptr [nt!KdPitchDebugger (83f6cd27)],0
  76. // 83ebe0f0 7519 jne nt!KdCheckForDebugBreak+0x22 (83ebe10b)
  77. //KdPitchDebuggerµÄº¯ÊýµØÖ·
  78. uAddr2 += 2;
  79. // g_uKdPitchDebugger = *(PULONG)uAddr2;
  80. // KdPrint(("KdPitchDebuggerº¯ÊýµØÖ·=%x\n",*(PULONG)uAddr2));
  81. // KdPrint(("KdDebuggerEnabledº¯ÊýµØÖ·=%x\n",g_uKdDebuggerEnabled));
  82. // KdPrint(("KdDebuggerEnabledÖµ=%x\n",*(PULONG)g_uKdDebuggerEnabled));
  83. // DisableWP();
  84. // *(PULONG)g_uKdPitchDebugger = g_bKdPitchDebugger;
  85. // EnableWP();
  86. // KdPrint(("KdPitchDebuggerÖµ=%x\n",*(PULONG)g_uKdPitchDebugger));
  87. // MovKdPitchDebugger_Win7();
  88. // DisableWP();
  89. // *(PULONG)g_uKdDebuggerEnabled = g_bKdDebuggerEnabled;
  90. // EnableWP();
  91. // KdPrint(("KdDebuggerEnabled2Öµ=%x\n",*(PULONG)g_uKdDebuggerEnabled));
  92. // MovKdDebuggerEnabled_Win7();
  93. g_uKdDebuggerEnabledHookAddrs[2].uAddr = uAddr2;
  94. g_uKdDebuggerEnabledHookAddrs[2].uVariableAddr = *(PULONG)uAddr2;
  95. DisableWP();
  96. *(PULONG)uAddr2=(ULONG)&g_bKdPitchDebugger;
  97. EnableWP();
  98. //----------------------------¸ÄдKdPollBreakInÖеÄKdDebuggerEnabled
  99. // 83e850fb e81f000000 call nt!KdPollBreakIn (83e8511f)
  100. // 83e85100 84c0 test al,al
  101. char pCode4[] = {(char)0x84, (char)0xc0};
  102. //KdPollBreakInº¯ÊýµØÖ·
  103. uAddr = SearchCode(uAddr,pCode4,sizeof(pCode4)) - 6;
  104. uAddr = uAddr + *((PULONG)uAddr) + 4;
  105. KdPrint(("KdPollBreakInº¯ÊýµØÖ·=%x\n",uAddr));
  106. //¼Ç¼KdPollBreakInº¯ÊýµØÖ· ÓÃÓÚKdPitchDebugger±äÁ¿µÄ´¦Àí
  107. uAddr2 = uAddr;
  108. // 83e85137 885dff mov byte ptr [ebp-1],bl
  109. // 83e8513a 381d2cfdf683 cmp byte ptr [nt!KdDebuggerEnabled (83f6fd2c)],bl
  110. // 83e85140 0f84c0000000 je nt!KdPollBreakIn+0xe7 (83e85206)
  111. char pCode5[] = {(char)0x88, (char)0x5d, (char)0xff, (char)0x38, (char)0x1d};
  112. //KdPollBreakInº¯ÊýÖÐKdDebuggerEnabledµØÖ·
  113. uAddr = SearchCode(uAddr,pCode5,sizeof(pCode5));
  114. KdPrint(("KdPollBreakIn->KdDebuggerEnabled=%x\n",uAddr));
  115. g_uKdDebuggerEnabledHookAddrs[3].uAddr = uAddr;
  116. g_uKdDebuggerEnabledHookAddrs[3].uVariableAddr = *(PULONG)uAddr;
  117. DisableWP();
  118. *(PULONG)uAddr=(ULONG)&g_bKdDebuggerEnabled;
  119. EnableWP();
  120. //----------------------------¸ÄдKdPollBreakInÖеÄKdPitchDebugger
  121. // 83e85126 33db xor ebx,ebx
  122. // 83e85128 381d273df383 cmp byte ptr [nt!KdPitchDebugger (83f33d27)],bl
  123. // 83e8512e 7407 je nt!KdPollBreakIn+0x18 (83e85137)
  124. char pCode6[] = {(char)0x33, (char)0xdb, (char)0x38, (char)0x1d};
  125. //KdPollBreakInÖеÄKdPitchDebuggerµØÖ·
  126. uAddr2 = SearchCode(uAddr2,pCode6,sizeof(pCode6));
  127. KdPrint(("KdPollBreakIn->KdPitchDebugger=%x\n",uAddr2));
  128. g_uKdDebuggerEnabledHookAddrs[4].uAddr = uAddr2;
  129. g_uKdDebuggerEnabledHookAddrs[4].uVariableAddr = *(PULONG)uAddr2;
  130. DisableWP();
  131. *(PULONG)uAddr2=(ULONG)&g_bKdPitchDebugger;
  132. EnableWP();
  133. }
  134. #pragma PAGECODE
  135. VOID ResetKdPitchDebugger()
  136. {
  137. DisableWP();
  138. *(PULONG)g_uKdPitchDebugger = 0x300;
  139. EnableWP();
  140. KdPrint(("KdPitchDebuggerÖµ=%x\n",*(PULONG)g_uKdPitchDebugger));
  141. }
  142. #pragma PAGECODE
  143. VOID ResetKdDebuggerEnabled()
  144. {
  145. DisableWP();
  146. *(PULONG)g_uKdDebuggerEnabled = g_bKdPitchDebugger;
  147. EnableWP();
  148. KdPrint(("KdDebuggerEnabledÖµ=%x\n",*(PULONG)g_uKdDebuggerEnabled));
  149. }
  150. #pragma PAGECODE
  151. VOID ResetVariable_Win7()
  152. {
  153. // ResetKdPitchDebugger();
  154. // ResetKiDebugRutine_Win7();
  155. // ResetKdDebuggerEnabled();
  156. // ULONG uAddr = 0x83f7ad24;
  157. // DisableWP();
  158. // *(PULONG)uAddr = 1;
  159. // EnableWP();
  160. for (int i = 0; i < 5; i++)
  161. {
  162. DisableWP();
  163. *(PULONG)g_uKdDebuggerEnabledHookAddrs[i].uAddr = g_uKdDebuggerEnabledHookAddrs[i].uVariableAddr;
  164. EnableWP();
  165. }
  166. }
  167. #endif