FHWWCTeam

Untitled

Feb 8th, 2026
2,696
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.70 KB | None | 0 0
  1. using Reloaded.Hooks;
  2. using Reloaded.Hooks.Definitions;
  3. using Reloaded.Hooks.Definitions.Enums;
  4. using Reloaded.Memory.Utilities;
  5. using System;
  6. using System.Reflection;
  7. using System.Runtime.CompilerServices;
  8. using System.Runtime.InteropServices;
  9. using System.Text;
  10. using System.Threading;
  11.  
  12. // 移除多余的 Reloaded.Hooks.Definitions 引用(4.3 无需,避免冲突)
  13. class Program
  14. {
  15. #region 1. 原生P/Invoke委托与API定义(无修改,适配Winapi)
  16. [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Unicode)]
  17. public delegate int GetPKeyDataDelegate(
  18. string productKey,
  19. IntPtr formatArg,
  20. string skuOrChannel,
  21. IntPtr formatArg2,
  22. int flags,
  23. out IntPtr outDataBlob,
  24. out IntPtr outString1,
  25. out IntPtr outString2,
  26. out IntPtr outString3,
  27. int extraFlag
  28. );
  29.  
  30. [UnmanagedFunctionPointer(CallingConvention.Winapi)]
  31. public unsafe delegate long Sub_7FFBB9DBF60CDelegate(
  32. IntPtr a1,
  33. IntPtr a2,
  34. IntPtr a3,
  35. IntPtr a4, // volatile int*
  36. IntPtr lpMem // const wchar_t**(核心解析目标)
  37. );
  38.  
  39. [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
  40. static extern IntPtr LoadLibrary(string lpFileName);
  41.  
  42. [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
  43. static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
  44.  
  45. [DllImport("kernel32.dll")]
  46. static extern IntPtr GetProcessHeap();
  47.  
  48. [DllImport("kernel32.dll")]
  49. static extern bool HeapFree(IntPtr hHeap, int flags, IntPtr mem);
  50.  
  51. [DllImport("kernel32.dll", SetLastError = true)]
  52. static extern bool FreeLibrary(IntPtr hModule);
  53. #endregion
  54.  
  55. #region 2. Hook核心配置(基址+固定偏移量,全局Hook实例)
  56.  
  57. private const int HOOK_OFFSET = 0x2F924; // ← 正确的 mov rdi,[rbp-41] // 你的固定偏移量0x2F60C
  58.  
  59. //===================使用asmhook========================
  60. private static IAsmHook _asmHook;
  61. private static ReloadedHooks _hooksInstance;
  62. private static IntPtr _callbackPtr;
  63. private static IntPtr hMod = IntPtr.Zero;
  64. //===================使用asmhook========================
  65.  
  66. #endregion
  67.  
  68. static void Main()
  69. {
  70. string productKey = "VD6RP-R2NK7-HBG8F-3DJ8T-KTPKM";
  71. string pkeyConfigXml = AppDomain.CurrentDomain.BaseDirectory + "pkconfig_winNext.xrm-ms";
  72. hMod = IntPtr.Zero;
  73. IntPtr pkeyConfigPtr = IntPtr.Zero;
  74. NativeState.LastMsftPtr = Marshal.AllocHGlobal(8);
  75. Marshal.WriteInt64(NativeState.LastMsftPtr, 0);
  76.  
  77. try
  78. {
  79. // 加载pidgenx.dll并获取基址
  80. hMod = LoadLibrary("pidgenx.dll");
  81. if (hMod == IntPtr.Zero)
  82. {
  83. Console.WriteLine($"❌ 加载pidgenx.dll失败,错误码:0x{Marshal.GetLastWin32Error():X8}");
  84. return;
  85. }
  86. Console.WriteLine($"✅ pidgenx.dll 64位加载基址:0x{hMod.ToString("X16")}");
  87.  
  88. // 动态计算Hook地址(核心:基址 + 固定偏移量,适配ASLR)
  89. IntPtr hookAddress = IntPtr.Add(hMod, HOOK_OFFSET);
  90. Console.WriteLine($"✅ 动态计算Hook实际地址:0x{hookAddress.ToString("X16")}(基址+0x{HOOK_OFFSET:X})");
  91.  
  92. Console.WriteLine($"[+] LastMsftPtr(native) = 0x{NativeState.LastMsftPtr.ToInt64():X16}");
  93.  
  94. // 3️⃣ 创建 AsmHook
  95. InstallAsmHook(hookAddress.ToInt64());
  96.  
  97. // 初始化GetPKeyData委托,执行原始逻辑
  98. IntPtr fnGetPKeyData = GetProcAddress(hMod, "GetPKeyData");
  99. if (fnGetPKeyData == IntPtr.Zero)
  100. {
  101. Console.WriteLine($"❌ 获取GetPKeyData地址失败,错误码:0x{Marshal.GetLastWin32Error():X8}");
  102. return;
  103. }
  104. var getPKeyData = Marshal.GetDelegateForFunctionPointer<GetPKeyDataDelegate>(fnGetPKeyData);
  105.  
  106. // 准备参数并执行GetPKeyData
  107. pkeyConfigPtr = Marshal.StringToHGlobalUni(pkeyConfigXml);
  108. IntPtr outBlob = IntPtr.Zero, outStr1 = IntPtr.Zero, outStr2 = IntPtr.Zero, outStr3 = IntPtr.Zero;
  109.  
  110. Console.WriteLine("\n📌 按任意键执行GetPKeyData,Hook将自动拦截并解析数据...");
  111. Console.ReadKey();
  112.  
  113. int hr = getPKeyData(
  114. productKey,
  115. pkeyConfigPtr,
  116. null,
  117. IntPtr.Zero,
  118. 0,
  119. out outBlob,
  120. out outStr1,
  121. out outStr2,
  122. out outStr3,
  123. 0
  124. );
  125.  
  126. // 输出GetPKeyData执行结果
  127. if (hr >= 0)
  128. {
  129. Console.WriteLine("\n✅ GetPKeyData执行成功,原始返回结果:");
  130. Console.WriteLine($"outStr1密钥描述: {Marshal.PtrToStringUni(outStr1) ?? "空"}");
  131. Console.WriteLine($"outStr2密钥通道: {Marshal.PtrToStringUni(outStr2) ?? "空"}");
  132. Console.WriteLine($"outStr3密钥子类型: {Marshal.PtrToStringUni(outStr3) ?? "空"}");
  133. Console.WriteLine($"outBlobIID唯一标识: {Marshal.PtrToStringUni(outBlob) ?? "空"}");
  134. }
  135. else
  136. {
  137. Console.WriteLine($"\n❌ GetPKeyData执行失败,错误码:0x{hr:X8}");
  138. }
  139. IntPtr msftPtr = Marshal.ReadIntPtr(NativeState.LastMsftPtr);
  140.  
  141. if (msftPtr != IntPtr.Zero)
  142. {
  143. string s = Marshal.PtrToStringUni(msftPtr);
  144. Console.WriteLine($"[AdtConfigKeg:] {s}");
  145. }
  146.  
  147.  
  148. // 释放GetPKeyData返回的堆内存
  149. IntPtr heap = GetProcessHeap();
  150. if (outStr1 != IntPtr.Zero) HeapFree(heap, 0, outStr1);
  151. if (outStr2 != IntPtr.Zero) HeapFree(heap, 0, outStr2);
  152. if (outStr3 != IntPtr.Zero) HeapFree(heap, 0, outStr3);
  153. if (outBlob != IntPtr.Zero) HeapFree(heap, 0, outBlob);
  154. }
  155. catch (Exception ex)
  156. {
  157. Console.WriteLine($"\n❌ 程序全局异常:{ex.Message}\n{ex.StackTrace}");
  158. }
  159. finally
  160. {
  161. // 安全释放所有资源,避免泄漏
  162. if (_asmHook != null && _asmHook.IsEnabled)
  163. {
  164. _asmHook?.Disable();
  165. Console.WriteLine("\n✅ Reloaded.Hooks 4.3 已安全释放");
  166. }
  167. Marshal.FreeHGlobal(NativeState.LastMsftPtr);
  168. if (pkeyConfigPtr != IntPtr.Zero) Marshal.FreeHGlobal(pkeyConfigPtr);
  169. if (hMod != IntPtr.Zero) FreeLibrary(hMod); // 释放DLL句柄
  170. Console.WriteLine("✅ 所有资源已释放完毕,按任意键退出...");
  171. Console.ReadKey();
  172. }
  173. }
  174. private static void InstallAsmHook(long hookAddress)
  175. {
  176. /*
  177. * 栈布局说明:
  178. * - push 8 个非易失寄存器 = 64 字节
  179. * - sub rsp, 20h = shadow space
  180. *
  181. * 原始 RSP = 当前 rsp + 20h + 8*8
  182. */
  183. var asm = new[]
  184. {
  185. "use64",
  186.  
  187. // rdi = msft2009 wchar_t*
  188. $"mov rax, {NativeState.LastMsftPtr.ToInt64()}",
  189. "mov [rax], rdi",
  190. };
  191.  
  192.  
  193. _hooksInstance = new ReloadedHooks();
  194.  
  195. _asmHook = _hooksInstance.CreateAsmHook(
  196. asm,
  197. hookAddress,
  198. AsmHookBehaviour.ExecuteFirst
  199. ).Activate();
  200.  
  201. Console.WriteLine("[+] AsmHook 激活成功");
  202. }
  203.  
  204. static class NativeState
  205. {
  206. public static IntPtr LastMsftPtr;
  207. }
  208.  
  209. }
Advertisement