AsposeLicense.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Reflection;
  5. using System.Runtime.CompilerServices;
  6. using System.Text;
  7. using System.Xml;
  8. namespace Masuit.Tools.Models
  9. {
  10. /// <summary>
  11. /// Aspose内存补丁
  12. /// </summary>
  13. public static class AsposeLicense
  14. {
  15. private static readonly string AsposeList = "Aspose.3D.dll, Aspose.BarCode.dll, Aspose.BarCode.Compact.dll, Aspose.BarCode.WPF.dll, Aspose.Cells.GridDesktop.dll, Aspose.Cells.GridWeb.dll, Aspose.CAD.dll, Aspose.Cells.dll, Aspose.Diagram.dll, Aspose.Email.dll, Aspose.Imaging.dll, Aspose.Note.dll, Aspose.OCR.dll, Aspose.Pdf.dll, Aspose.Slides.dll, Aspose.Tasks.dll, Aspose.Words.dll";
  16. /// <summary>
  17. /// 启动Aspose的内存破解
  18. /// </summary>
  19. public static void ActivateMemoryPatching()
  20. {
  21. Assembly[] arr = AppDomain.CurrentDomain.GetAssemblies();
  22. foreach (Assembly assembly in arr)
  23. {
  24. if (AsposeList.IndexOf(assembly.FullName.Split(',')[0] + ".dll") != -1)
  25. ActivateForAssembly(assembly);
  26. }
  27. AppDomain.CurrentDomain.AssemblyLoad += ActivateOnLoad;
  28. }
  29. private static void ActivateOnLoad(object sender, AssemblyLoadEventArgs e)
  30. {
  31. if (AsposeList.IndexOf(e.LoadedAssembly.FullName.Split(',')[0] + ".dll") != -1)
  32. ActivateForAssembly(e.LoadedAssembly);
  33. }
  34. private static void ActivateForAssembly(Assembly assembly)
  35. {
  36. MethodInfo miLicensed1 = typeof(AsposeLicense).GetMethod("InvokeMe1", BindingFlags.NonPublic | BindingFlags.Static);
  37. MethodInfo miLicensed2 = typeof(AsposeLicense).GetMethod("InvokeMe2", BindingFlags.NonPublic | BindingFlags.Static);
  38. MethodInfo miEvaluation = null;
  39. Dictionary<string, MethodInfo> miDict = new Dictionary<string, MethodInfo>
  40. {
  41. ["System.DateTime"] = miLicensed1,
  42. ["System.Xml.XmlElement"] = miLicensed2
  43. };
  44. Type[] arrType = null;
  45. bool isFound = false;
  46. int nCount = 0;
  47. try
  48. {
  49. arrType = assembly.GetTypes();
  50. }
  51. catch (ReflectionTypeLoadException err)
  52. {
  53. arrType = err.Types;
  54. }
  55. foreach (Type type in arrType)
  56. {
  57. if (isFound) break;
  58. if (type == null) continue;
  59. MethodInfo[] arrMInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);
  60. foreach (MethodInfo info in arrMInfo)
  61. {
  62. if (isFound) break;
  63. try
  64. {
  65. string strMethod = info.ToString();
  66. if ((strMethod.IndexOf("(System.Xml.XmlElement, System.String)") > 0) && miDict.ContainsKey(info.ReturnType.ToString()))
  67. {
  68. miEvaluation = info;
  69. MemoryPatching(miEvaluation, miDict[miEvaluation.ReturnType.ToString()]);
  70. nCount++;
  71. if (((assembly.FullName.IndexOf("Aspose.Pdf") == -1) && (nCount == 2)) || ((assembly.FullName.IndexOf("Aspose.Pdf") != -1) && (nCount == 6)))
  72. {
  73. isFound = true;
  74. break;
  75. }
  76. }
  77. }
  78. catch
  79. {
  80. throw new InvalidOperationException("MemoryPatching for \"" + assembly.FullName + "\" failed !");
  81. }
  82. }
  83. }
  84. string[] aParts = assembly.FullName.Split(',');
  85. string fName = aParts[0];
  86. if (fName.IndexOf("Aspose.BarCode.") != -1)
  87. fName = "Aspose.BarCode";
  88. else if (fName.IndexOf("Aspose.3D") != -1)
  89. fName = "Aspose.ThreeD";
  90. try
  91. {
  92. Type type2 = assembly.GetType(fName + ".License");
  93. MethodInfo mi = type2.GetMethod("SetLicense", new[] { typeof(Stream) });
  94. const string LData = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5MaWNlbnNlZTwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPmxpY2Vuc2VlQGVtYWlsLmNvbTwvRW1haWxUbz4KICAgIDxMaWNlbnNlVHlwZT5EZXZlbG9wZXIgT0VNPC9MaWNlbnNlVHlwZT4KICAgIDxMaWNlbnNlTm90ZT5MaW1pdGVkIHRvIDEwMDAgZGV2ZWxvcGVyLCB1bmxpbWl0ZWQgcGh5c2ljYWwgbG9jYXRpb25zPC9MaWNlbnNlTm90ZT4KICAgIDxPcmRlcklEPjc4NDM3ODU3Nzg1PC9PcmRlcklEPgogICAgPFVzZXJJRD4xMTk3ODkyNDM3OTwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIFByb2R1Y3QgRmFtaWx5PC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+e0YyQjk3MDQ1LTFCMjktNEIzRi1CRDUzLTYwMUVGRkExNUFBOX08L1NlcmlhbE51bWJlcj4KICAgIDxTdWJzY3JpcHRpb25FeHBpcnk+MjA5OTEyMzE8L1N1YnNjcmlwdGlvbkV4cGlyeT4KICAgIDxMaWNlbnNlVmVyc2lvbj4zLjA8L0xpY2Vuc2VWZXJzaW9uPgogIDwvRGF0YT4KICA8U2lnbmF0dXJlPlFYTndiM05sTGxSdmRHRnNJRkJ5YjJSMVkzUWdSbUZ0YVd4NTwvU2lnbmF0dXJlPgo8L0xpY2Vuc2U+";
  95. Stream stream = new MemoryStream(Convert.FromBase64String(LData));
  96. stream.Seek(0, SeekOrigin.Begin);
  97. mi.Invoke(Activator.CreateInstance(type2, null), new[] { stream });
  98. }
  99. catch
  100. {
  101. throw new InvalidOperationException("SetLicense for \"" + assembly.FullName + "\" failed !");
  102. }
  103. }
  104. private static DateTime InvokeMe1(XmlElement element, string name)
  105. {
  106. return DateTime.MaxValue;
  107. }
  108. private static XmlElement InvokeMe2(XmlElement element, string name)
  109. {
  110. if (element.LocalName == "License")
  111. {
  112. const string License64 = "PERhdGE+PExpY2Vuc2VkVG8+R3JvdXBEb2NzPC9MaWNlbnNlZFRvPjxMaWNlbnNlVHlwZT5TaXRlIE9FTTwvTGljZW5zZVR5cGU+PExpY2Vuc2VOb3RlPkxpbWl0ZWQgdG8gMTAgZGV2ZWxvcGVyczwvTGljZW5zZU5vdGU+PE9yZGVySUQ+MTMwNzI0MDQwODQ5PC9PcmRlcklEPjxPRU0+VGhpcyBpcyBhIHJlZGlzdHJpYnV0YWJsZSBsaWNlbnNlPC9PRU0+PFByb2R1Y3RzPjxQcm9kdWN0PkFzcG9zZS5Ub3RhbDwvUHJvZHVjdD48L1Byb2R1Y3RzPjxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT48U2VyaWFsTnVtYmVyPjliNTc5NTAxLTUyNjEtNDIyMC04NjcwLWZjMmQ4Y2NkZDkwYzwvU2VyaWFsTnVtYmVyPjxTdWJzY3JpcHRpb25FeHBpcnk+MjAxNDA3MjQ8L1N1YnNjcmlwdGlvbkV4cGlyeT48TGljZW5zZVZlcnNpb24+Mi4yPC9MaWNlbnNlVmVyc2lvbj48L0RhdGE+PFNpZ25hdHVyZT5udFpocmRoL3I0QS81ZFpsU2dWYnhac0hYSFBxSjZ5UVVYa0RvaW4vS2lVZWhUUWZET0lQdHdzUlR2NmRTUVplOVdXekNnV3RGdkdROWpmR2QySmF4YUQvbkx1ZEk2R0VVajhqeVhUMG4vbWRrMEF1WVZNYlBXRjJYd3dSTnFlTmRrblYyQjhrZVFwbDJ2RzZVbnhxS2J6VVFxS2Rhc1pzZ2w1Q0xqSFVEWms9PC9TaWduYXR1cmU+";
  113. element.InnerXml = new UTF8Encoding().GetString(Convert.FromBase64String(License64));
  114. }
  115. if (element.LocalName == "BlackList")
  116. {
  117. const string BlackList64 = "PERhdGE+PC9EYXRhPjxTaWduYXR1cmU+cUJwMEx1cEVoM1ZnOWJjeS8vbUVXUk9KRWZmczRlY25iTHQxYlNhanU2NjY5RHlad09FakJ1eEdBdVBxS1hyd0x5bmZ5VWplYUNGQ0QxSkh2RVUxVUl5eXJOTnBSMXc2NXJIOUFyUCtFbE1lVCtIQkZ4NFMzckFVMnd6dkxPZnhGeU9DQ0dGQ2UraTdiSHlGQk44WHp6R1UwdGRPMGR1RTFoRTQ5M1RNY3pRPTwvU2lnbmF0dXJlPg==";
  118. element.InnerXml = new UTF8Encoding().GetString(Convert.FromBase64String(BlackList64));
  119. }
  120. XmlNodeList elementsByTagName = element.GetElementsByTagName(name);
  121. if (elementsByTagName.Count <= 0)
  122. return null;
  123. return (XmlElement)elementsByTagName[0];
  124. }
  125. private static unsafe void MemoryPatching(MethodBase miEvaluation, MethodBase miLicensed)
  126. {
  127. IntPtr IntPtrEval = GetMemoryAddress(miEvaluation);
  128. IntPtr IntPtrLicensed = GetMemoryAddress(miLicensed);
  129. if (IntPtr.Size == 8)
  130. *(long*)IntPtrEval.ToPointer() = *(long*)IntPtrLicensed.ToPointer();
  131. else
  132. *(int*)IntPtrEval.ToPointer() = *(int*)IntPtrLicensed.ToPointer();
  133. }
  134. private static unsafe IntPtr GetMemoryAddress(MethodBase mb)
  135. {
  136. RuntimeHelpers.PrepareMethod(mb.MethodHandle);
  137. if ((Environment.Version.Major >= 4) || ((Environment.Version.Major == 2) && (Environment.Version.MinorRevision >= 3053)))
  138. return new IntPtr((int*)mb.MethodHandle.Value.ToPointer() + 2);
  139. ulong* location = (ulong*)mb.MethodHandle.Value.ToPointer();
  140. int index = (int)((*location >> 32) & 0xFF);
  141. if (IntPtr.Size == 8)
  142. {
  143. ulong* classStart = (ulong*)mb.DeclaringType.TypeHandle.Value.ToPointer();
  144. ulong* address = classStart + index + 10;
  145. return new IntPtr(address);
  146. }
  147. else
  148. {
  149. uint* classStart = (uint*)mb.DeclaringType.TypeHandle.Value.ToPointer();
  150. uint* address = classStart + index + 10;
  151. return new IntPtr(address);
  152. }
  153. }
  154. }
  155. }
  156. //End