添加项目文件。

This commit is contained in:
小肥羊 2024-04-18 10:37:40 +08:00
parent e0f252db0e
commit 7b5c3eea84
18 changed files with 1194 additions and 0 deletions

12
.config/dotnet-tools.json Normal file
View File

@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "8.0.3",
"commands": [
"dotnet-ef"
]
}
}
}

View File

@ -0,0 +1 @@
windows

419
AsposeHook/HookManager.cs Normal file
View File

@ -0,0 +1,419 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
namespace ExtractResFile.AsposeHook
{
public static class HookManager
{
private static MethodHook mCompareHook;
private static MethodHook mGreaterThanHook;
private static MethodHook mParseExactHook;
private static MethodHook mInnerTextHook;
private static MethodHook mIndexOfHook;
private static MethodHook mStringSplitHook;
private static MethodHook mMethodInvokeHook;
private static List<string> mAssembliesLicenseSetted = new List<string>();
private static List<MethodHook> mMethodHookList = new List<MethodHook>();
private static readonly string DATE_CHANGED_TO = DateTime.Today.Year + 1 + "0827";
private const string LICENSE_STRING = "PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4xOTA4MjYwODA3NTM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+M2U0NGRlMzAtZmNkMi00MTA2LWIzNWQtNDZjNmEzNzE1ZmMyPC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjAwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT53UGJtNUt3ZTYvRFZXWFNIY1o4d2FiVEFQQXlSR0pEOGI3L00zVkV4YWZpQnd5U2h3YWtrNGI5N2c2eGtnTjhtbUFGY3J0c0cwd1ZDcnp6MytVYk9iQjRYUndTZWxsTFdXeXNDL0haTDNpN01SMC9jZUFxaVZFOU0rWndOQkR4RnlRbE9uYTFQajhQMzhzR1grQ3ZsemJLZFZPZXk1S3A2dDN5c0dqYWtaL1E9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=";
private static void Initialize()
{
if (mMethodHookList.Count == 0)
{
try
{
MethodInfo method = typeof(MethodBase).GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public, null, new Type[2]
{
typeof(object),
typeof(object[])
}, null);
MethodInfo method2 = typeof(HookManager).GetMethod("NewMethodInvoke", BindingFlags.Static | BindingFlags.Public, null, new Type[3]
{
typeof(MethodBase),
typeof(object),
typeof(object[])
}, null);
mMethodInvokeHook = new MethodHook(method, method2);
mMethodHookList.Add(mMethodInvokeHook);
}
catch (Exception ex)
{
Utils.LogWriteLine("Initialize method XmlElement.InnerText.Get error:" + ex.Message, ConsoleColor.DarkRed);
}
try
{
MethodInfo method3 = typeof(DateTime).GetMethod("ParseExact", BindingFlags.Static | BindingFlags.Public, null, new Type[3]
{
typeof(string),
typeof(string),
typeof(IFormatProvider)
}, null);
MethodInfo method4 = typeof(HookManager).GetMethod("NewParseExact", BindingFlags.Static | BindingFlags.Public, null, new Type[3]
{
typeof(string),
typeof(string),
typeof(IFormatProvider)
}, null);
mParseExactHook = new MethodHook(method3, method4);
}
catch (Exception ex2)
{
Utils.LogWriteLine("Initialize method DateTime.ParseExact error:" + ex2.Message, ConsoleColor.DarkRed);
}
try
{
MethodInfo method5 = typeof(DateTime).GetMethod("op_GreaterThan", BindingFlags.Static | BindingFlags.Public, null, new Type[2]
{
typeof(DateTime),
typeof(DateTime)
}, null);
MethodInfo method6 = typeof(HookManager).GetMethod("NewGreaterThan", BindingFlags.Static | BindingFlags.Public, null, new Type[2]
{
typeof(DateTime),
typeof(DateTime)
}, null);
mGreaterThanHook = new MethodHook(method5, method6);
}
catch (Exception ex3)
{
Utils.LogWriteLine("Initialize method DateTime.op_GreaterThan error:" + ex3.Message, ConsoleColor.DarkRed);
}
try
{
MethodInfo method7 = typeof(string).GetMethod("Compare", BindingFlags.Static | BindingFlags.Public, null, new Type[2]
{
typeof(string),
typeof(string)
}, null);
MethodInfo method8 = typeof(HookManager).GetMethod("NewCompare", BindingFlags.Static | BindingFlags.Public, null, new Type[2]
{
typeof(string),
typeof(string)
}, null);
mCompareHook = new MethodHook(method7, method8);
mMethodHookList.Add(mCompareHook);
}
catch (Exception ex4)
{
Utils.LogWriteLine("Initialize method string.Compare error:" + ex4.Message, ConsoleColor.DarkRed);
}
try
{
MethodInfo method9 = typeof(string).GetMethod("IndexOf", BindingFlags.Instance | BindingFlags.Public, null, new Type[1] { typeof(string) }, null);
MethodInfo method10 = typeof(HookManager).GetMethod("NewIndexOf", BindingFlags.Static | BindingFlags.Public, null, new Type[2]
{
typeof(string),
typeof(string)
}, null);
mIndexOfHook = new MethodHook(method9, method10);
}
catch (Exception ex5)
{
Utils.LogWriteLine("Initialize method string.IndexOf error:" + ex5.Message, ConsoleColor.DarkRed);
}
try
{
MethodInfo getMethod = typeof(XmlElement).GetProperty("InnerText", BindingFlags.Instance | BindingFlags.Public).GetMethod;
MethodInfo method11 = typeof(HookManager).GetMethod("NewInnerText", BindingFlags.Static | BindingFlags.Public, null, new Type[1] { typeof(XmlElement) }, null);
mInnerTextHook = new MethodHook(getMethod, method11);
}
catch (Exception ex6)
{
Utils.LogWriteLine("Initialize method XmlElement.InnerText.Get error:" + ex6.Message, ConsoleColor.DarkRed);
}
try
{
MethodInfo method12 = typeof(string).GetMethod("Split", BindingFlags.Instance | BindingFlags.Public, null, new Type[1] { typeof(char[]) }, null);
MethodInfo method13 = typeof(HookManager).GetMethod("NewStringSplitForNET4", BindingFlags.Static | BindingFlags.Public, null, new Type[2]
{
typeof(string),
typeof(char[])
}, null);
mStringSplitHook = new MethodHook(method12, method13);
}
catch (Exception ex7)
{
Utils.LogWriteLine("Initialize method string.Split error:" + ex7.Message, ConsoleColor.DarkRed);
}
}
}
public static void ShowHookDetails(bool show)
{
if (show)
{
Utils.EnableLog();
}
else
{
Utils.DisableLog();
}
}
public static void StartHook()
{
try
{
Initialize();
mMethodHookList.ForEach(delegate (MethodHook item)
{
item?.StartHook();
});
IEnumerable<AssemblyName> enumerable = (from assembly in Assembly.GetCallingAssembly()?.GetReferencedAssemblies().Union(Assembly.GetEntryAssembly()?.GetReferencedAssemblies() ?? new AssemblyName[0])
group assembly by assembly.Name into item
select item.FirstOrDefault() into assembly
where assembly.Name.StartsWith("Aspose") && !assembly.Name.StartsWith("Aspose.Hook")
select assembly);
if (enumerable == null)
{
return;
}
foreach (AssemblyName item in enumerable)
{
if (!mAssembliesLicenseSetted.Contains(item.FullName))
{
Type type = Assembly.Load(item).GetType(item.Name + ".License");
if (type == null)
{
type = Assembly.Load(item).GetType(Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(item.Name.ToLower()) + ".License");
}
if (type != null)
{
Utils.LogWriteLine("\nSETTING..." + type.FullName, ConsoleColor.Yellow);
object obj = Activator.CreateInstance(type);
MethodInfo? method = type.GetMethod("SetLicense", new Type[1] { typeof(Stream) });
object[] parameters = new MemoryStream[1]
{
new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4xOTA4MjYwODA3NTM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+M2U0NGRlMzAtZmNkMi00MTA2LWIzNWQtNDZjNmEzNzE1ZmMyPC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjAwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT53UGJtNUt3ZTYvRFZXWFNIY1o4d2FiVEFQQXlSR0pEOGI3L00zVkV4YWZpQnd5U2h3YWtrNGI5N2c2eGtnTjhtbUFGY3J0c0cwd1ZDcnp6MytVYk9iQjRYUndTZWxsTFdXeXNDL0haTDNpN01SMC9jZUFxaVZFOU0rWndOQkR4RnlRbE9uYTFQajhQMzhzR1grQ3ZsemJLZFZPZXk1S3A2dDN5c0dqYWtaL1E9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4="))
};
method.Invoke(obj, BindingFlags.Instance | BindingFlags.Public, null, parameters, null);
Utils.LogWriteLine(type.FullName + " SET SUCCESSFULLY.", ConsoleColor.Yellow);
mAssembliesLicenseSetted.Add(item.FullName);
}
}
}
}
catch (Exception ex)
{
Exception ex2 = ex;
while (ex2.InnerException != null)
{
ex2 = ex2.InnerException;
}
Utils.LogWriteLine("start hook failed because of " + ex2.Message + ".", ConsoleColor.Red);
}
}
public static void StopHook()
{
mMethodHookList.ForEach(delegate (MethodHook item)
{
item?.StopHook();
});
}
public static object NewMethodInvoke(MethodBase method, object obj, object[] parameters)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "ParseExact" && parameters.Length != 0 && parameters[0].ToString().Contains("0827"))
{
DateTime dateTime = DateTime.ParseExact(DATE_CHANGED_TO, "yyyyMMdd", CultureInfo.InvariantCulture);
ShowLog(method, dateTime, obj, parameters);
return dateTime;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "ParseExact" && parameters.Length != 0 && parameters[0].ToString() == DateTime.Now.ToString("yyyy.MM.01"))
{
DateTime dateTime2 = DateTime.ParseExact("20200501", "yyyyMMdd", CultureInfo.InvariantCulture);
ShowLog(method, dateTime2, obj, parameters);
return dateTime2;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "get_InnerText1" && obj is XmlElement && (obj as XmlElement).Name == "SubscriptionExpiry")
{
ShowLog(method, DATE_CHANGED_TO, obj, parameters);
return DATE_CHANGED_TO;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "get_Ticks" && obj is DateTime dateTime3 && dateTime3.ToString("MMdd") == "0827")
{
long ticks = DateTime.ParseExact(DATE_CHANGED_TO, "yyyyMMdd", CultureInfo.InvariantCulture).Ticks;
ShowLog(method, ticks, obj, parameters);
return ticks;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "Compare")
{
return DATE_CHANGED_TO;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "op_GreaterThan" && parameters.Length == 2 && parameters[1] is DateTime && ((DateTime)parameters[1]).ToString("MMdd") == "0827")
{
ShowLog(method, false, obj, parameters);
return false;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "IndexOf" && parameters.Length != 0 && parameters[0].ToString().Contains("0827"))
{
ShowLog(method, 580, obj, parameters);
return 580;
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "Split" && Regex.Match(obj.ToString(), "^\\d{4}\\.\\d{2}\\.\\d{2}$").Success && obj != null && obj.ToString().Substring(0, 4) == DateTime.Now.Year.ToString())
{
ShowLog(method, "new string[] { \"2019\", \"08\", \"27\" }", obj, parameters);
return new string[3] { "2019", "08", "27" };
}
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && method.Name == "get_Now")
{
DateTime dateTime4 = DateTime.ParseExact("20200518", "yyyyMMdd", CultureInfo.InvariantCulture);
ShowLog(method, dateTime4, obj, parameters);
return dateTime4;
}
return mMethodInvokeHook.InvokeOriginal<object>(method, new object[2]
{
obj,
parameters.ToArray()
});
}
private static void ShowLog(MethodBase method, object ret, object obj, object[] parameters)
{
if (method.Name == "GetBytes" || method.Name == "GetManifestResourceNames" || method.Name == "get_DocumentElement" || method.Name == "get_FirstChild" || method.Name == "op_Equality" || method.Name == "get_LocalName" || method.Name == "Append" || method.Name == "get_Chars" || method.Name == "Write" || method.Name == "get_Length" || method.Name == "WriteByte" || (obj == null && parameters.Length == 1 && parameters[0] is int && (int)parameters[0] < 0))
{
return;
}
string empty = string.Empty;
try
{
empty = ((obj is Stream || parameters == null || parameters.Length == 0 || parameters.Where((object item) => item is Stream || item is StreamingContext).Count() != 0) ? (obj?.ToString() + "," + parameters) : (JsonConvert.SerializeObject(obj) + "," + JsonConvert.SerializeObject((object)parameters)));
}
catch (Exception)
{
empty = obj?.ToString() + "," + parameters;
}
string empty2 = string.Empty;
try
{
empty2 = ((!(ret is Stream)) ? JsonConvert.SerializeObject(ret) : "<STREAM>...");
}
catch (Exception)
{
empty2 = ret.ToString();
}
Utils.LogWriteLine("INVOKE method " + method.Name + "(" + empty + ") RETURN=> " + empty2, ConsoleColor.DarkGray);
}
public static int NewCompare(string s1, string s2)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && s2 == "20200827")
{
Utils.LogWriteLine("HOOK SUCCESS: From " + Assembly.GetCallingAssembly().GetName().Name + " String.Compare(" + s1 + "," + s2 + ") return -1;", ConsoleColor.Green);
return -1;
}
return mCompareHook.InvokeOriginal<int>(null, new object[2] { s1, s2 });
}
public static bool NewGreaterThan(DateTime t1, DateTime t2)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && t2.ToString("yyyyMMdd") == "20200827")
{
Utils.LogWriteLine($"HOOK SUCCESS: From {Assembly.GetCallingAssembly().GetName().Name} DateTime ({t1}>{t2}) return false;", ConsoleColor.Green);
return false;
}
return mGreaterThanHook.InvokeOriginal<bool>(null, new object[2] { t1, t2 });
}
public static DateTime NewParseExact(string s, string format, IFormatProvider provider)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && s == "20200827")
{
Utils.LogWriteLine($"HOOK SUCCESS: From {Assembly.GetCallingAssembly().GetName().Name} DateTime.ParseExact({s},{format},{provider}) return {DATE_CHANGED_TO};", ConsoleColor.Green);
return mParseExactHook.InvokeOriginal<DateTime>(null, new object[3] { DATE_CHANGED_TO, format, provider });
}
return mParseExactHook.InvokeOriginal<DateTime>(null, new object[3] { s, format, provider });
}
public static string NewInnerText(XmlElement element)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && !Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.Words") && !Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.Hook") && element.Name == "SubscriptionExpiry")
{
Utils.LogWriteLine("HOOK SUCCESS: From " + Assembly.GetCallingAssembly().GetName().Name + " XmlElement.InnerText (" + element.Name + "," + element.InnerXml + ") return " + DATE_CHANGED_TO + ";", ConsoleColor.Green);
return DATE_CHANGED_TO;
}
return mInnerTextHook.InvokeOriginal<string>(element, Array.Empty<object>());
}
public static int NewIndexOf(string v1, string v2)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && v2 == DATE_CHANGED_TO)
{
Utils.LogWriteLine("HOOK SUCCESS: From " + Assembly.GetCallingAssembly().GetName().Name + " " + v1.ToString().Substring(0, 9) + "....IndexOf(" + v2 + ") return 580;", ConsoleColor.Green);
return 580;
}
return mIndexOfHook.InvokeOriginal<int>(v1, new object[1] { v2 });
}
public static string[] NewStringSplitForNET6(string value, char separator, StringSplitOptions options)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && value != null && value.Length == 10 && Regex.Match(value, "^\\d{4}\\.\\d{2}\\.\\d{2}$").Success && separator == '.' && options == StringSplitOptions.None)
{
Utils.LogWriteLine($"HOOK SUCCESS: From {Assembly.GetCallingAssembly().GetName().Name} String.Split({value},{separator}) return 20190827;", ConsoleColor.Green);
return new string[3] { "2019", "08", "27" };
}
return mStringSplitHook.InvokeOriginal<string[]>(value, new object[2] { separator, options });
}
public static string[] NewStringSplitForNET4(string value, char[] separator)
{
if (Assembly.GetCallingAssembly() != null && Assembly.GetCallingAssembly().FullName.StartsWith("Aspose.") && value != null && value.Length == 10 && Regex.Match(value, "^\\d{4}\\.\\d{2}\\.\\d{2}$").Success && separator != null && separator.Length != 0 && separator[0] == '.')
{
Utils.LogWriteLine($"HOOK SUCCESS: From {Assembly.GetCallingAssembly().GetName().Name} String.Split({value},{separator}) return 20190827;", ConsoleColor.Green);
return new string[3] { "2019", "08", "27" };
}
return mStringSplitHook.InvokeOriginal<string[]>(value, new object[1] { separator });
}
}
}

15
AsposeHook/Kernel32.cs Normal file
View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ExtractResFile.AsposeHook
{
internal static class Kernel32
{
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool VirtualProtect(IntPtr baseAddress, int protectionSize, uint protectionType, out uint oldProtectionType);
}
}

237
AsposeHook/MethodHook.cs Normal file
View File

@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ExtractResFile.AsposeHook
{
public class MethodHook
{
private byte[] _jmpCodeBytes;
private byte[] _originalMethodBytes;
private MethodMeta _sourceMethodMeta;
private MethodMeta _targetMethodMeta;
private bool _hookInitialized = false;
public bool IsEnabled { get; protected set; }
public MethodHook(MethodBase sourceMethod, MethodBase targetMethod)
{
if (sourceMethod == null)
{
throw new ArgumentException("create source method hook failed because of method is null.");
}
if (targetMethod == null)
{
throw new ArgumentException("create target method hook failed because of method is null.");
}
try
{
_sourceMethodMeta = new MethodMeta
{
Method = sourceMethod
};
_targetMethodMeta = new MethodMeta
{
Method = targetMethod
};
PrepareHook();
_hookInitialized = true;
Utils.LogWriteLine(_sourceMethodMeta.Method.DeclaringType.FullName + "." + _sourceMethodMeta.Method.Name + " is to be HOOKED by " + _targetMethodMeta.Method.Name + ".\n", ConsoleColor.DarkYellow);
}
catch (Exception)
{
_hookInitialized = false;
}
IsEnabled = false;
}
public void StartHook(bool showInfo = true)
{
try
{
if (!IsEnabled && _hookInitialized)
{
Kernel32.VirtualProtect(_sourceMethodMeta.FinalMethodAddress, _jmpCodeBytes.Length, 64u, out var oldProtectionType);
Marshal.Copy(_jmpCodeBytes, 0, _sourceMethodMeta.FinalMethodAddress, _jmpCodeBytes.Length);
Kernel32.VirtualProtect(_sourceMethodMeta.FinalMethodAddress, _jmpCodeBytes.Length, oldProtectionType, out var _);
IsEnabled = true;
if (showInfo)
{
Utils.LogWriteLine(_sourceMethodMeta.Method.Name + " HOOK STARTED.", ConsoleColor.Blue);
}
}
}
catch (Exception ex)
{
Utils.LogWriteLine(_sourceMethodMeta.Method.Name + " start hook error:" + ex.Message, ConsoleColor.DarkRed);
}
}
public void StopHook(bool showInfo = true)
{
try
{
if (IsEnabled && _hookInitialized)
{
Kernel32.VirtualProtect(_sourceMethodMeta.FinalMethodAddress, _originalMethodBytes.Length, 64u, out var oldProtectionType);
Marshal.Copy(_originalMethodBytes, 0, _sourceMethodMeta.FinalMethodAddress, _originalMethodBytes.Length);
Kernel32.VirtualProtect(_sourceMethodMeta.FinalMethodAddress, _originalMethodBytes.Length, oldProtectionType, out var _);
IsEnabled = false;
if (showInfo)
{
Utils.LogWriteLine(_sourceMethodMeta.Method.Name + " HOOK STOPPED.", ConsoleColor.Red);
}
}
}
catch (Exception ex)
{
Utils.LogWriteLine(_sourceMethodMeta.Method.Name + " stop hook error:" + ex.Message, ConsoleColor.DarkRed);
}
}
private void PrepareHook()
{
_sourceMethodMeta.MethodDescAddress = _sourceMethodMeta.Method.MethodHandle.Value;
_sourceMethodMeta.MethodDescValue = _sourceMethodMeta.Method.MethodHandle.Value.ReadIntPtr();
_sourceMethodMeta.FunctionPointerBeforePrepare = _sourceMethodMeta.Method.MethodHandle.GetFunctionPointer();
_sourceMethodMeta.Next1IntptrBeforePrepare = (_sourceMethodMeta.Method.MethodHandle.Value + IntPtr.Size).ReadIntPtr();
_sourceMethodMeta.Next2IntptrBeforePrepare = (_sourceMethodMeta.Method.MethodHandle.Value + IntPtr.Size * 2).ReadIntPtr();
RuntimeHelpers.PrepareMethod(_sourceMethodMeta.Method.MethodHandle);
_sourceMethodMeta.FunctionPointerAfterPrepare = _sourceMethodMeta.Method.MethodHandle.GetFunctionPointer();
_sourceMethodMeta.Next1IntptrAfterPrepare = (_sourceMethodMeta.Method.MethodHandle.Value + IntPtr.Size).ReadIntPtr();
_sourceMethodMeta.Next2IntptrAfterPrepare = (_sourceMethodMeta.Method.MethodHandle.Value + IntPtr.Size * 2).ReadIntPtr();
Utils.ShowMethodInfo(_sourceMethodMeta);
if (Environment.Is64BitProcess)
{
Utils.LogWriteLine("Because of Environment.Is64BitProcess, change method " + _sourceMethodMeta.Method.Name + " PREJIT to JIT through add 0x20.");
Marshal.WriteByte(_sourceMethodMeta.Method.MethodHandle.Value + 7, 32);
Utils.LogWriteLine("method " + _sourceMethodMeta.Method.Name + " MD value has changed to:" + _sourceMethodMeta.Method.MethodHandle.Value.ReadIntPtr().To16String());
}
_sourceMethodMeta.FinalMethodAddress = _sourceMethodMeta.FunctionPointerAfterPrepare;
Utils.LogWriteLine("Finally, wo choose method " + _sourceMethodMeta.Method.Name + " address: " + _sourceMethodMeta.FinalMethodAddress.To16String());
_targetMethodMeta.MethodDescAddress = _targetMethodMeta.Method.MethodHandle.Value;
_targetMethodMeta.MethodDescValue = _targetMethodMeta.Method.MethodHandle.Value.ReadIntPtr();
_targetMethodMeta.FunctionPointerBeforePrepare = _targetMethodMeta.Method.MethodHandle.GetFunctionPointer();
_targetMethodMeta.Next1IntptrBeforePrepare = (_targetMethodMeta.Method.MethodHandle.Value + IntPtr.Size).ReadIntPtr();
_targetMethodMeta.Next2IntptrBeforePrepare = (_targetMethodMeta.Method.MethodHandle.Value + IntPtr.Size * 2).ReadIntPtr();
RuntimeHelpers.PrepareMethod(_targetMethodMeta.Method.MethodHandle);
_targetMethodMeta.FunctionPointerAfterPrepare = _targetMethodMeta.Method.MethodHandle.GetFunctionPointer();
_targetMethodMeta.Next1IntptrAfterPrepare = (_targetMethodMeta.Method.MethodHandle.Value + IntPtr.Size).ReadIntPtr();
_targetMethodMeta.Next2IntptrAfterPrepare = (_targetMethodMeta.Method.MethodHandle.Value + IntPtr.Size * 2).ReadIntPtr();
Utils.ShowMethodInfo(_targetMethodMeta);
_targetMethodMeta.FinalMethodAddress = _targetMethodMeta.FunctionPointerAfterPrepare;
Utils.LogWriteLine("Finally, wo choose method " + _targetMethodMeta.Method.Name + " address: " + _targetMethodMeta.FinalMethodAddress.To16String());
Utils.LogWriteLine("Now change method " + _sourceMethodMeta.Method.Name + " body to jump to " + _targetMethodMeta.Method.Name + " through jmp instuction...");
List<byte> list = new List<byte>();
if (Environment.Is64BitProcess)
{
list.AddRange(new byte[2] { 72, 184 });
list.AddRange(BitConverter.GetBytes((long)_targetMethodMeta.FinalMethodAddress));
list.AddRange(new byte[2] { 255, 224 });
}
else
{
list.Add(184);
list.AddRange(BitConverter.GetBytes((int)_targetMethodMeta.FinalMethodAddress));
list.AddRange(new byte[2] { 255, 224 });
}
_jmpCodeBytes = list.ToArray();
_originalMethodBytes = new byte[_jmpCodeBytes.Length];
Kernel32.VirtualProtect(_sourceMethodMeta.FinalMethodAddress, _jmpCodeBytes.Length, 64u, out var oldProtectionType);
Marshal.Copy(_sourceMethodMeta.FinalMethodAddress, _originalMethodBytes, 0, _jmpCodeBytes.Length);
Kernel32.VirtualProtect(_sourceMethodMeta.FinalMethodAddress, _jmpCodeBytes.Length, oldProtectionType, out var _);
}
public T InvokeOriginal<T>(object instance, params object[] args)
{
try
{
if (IsEnabled)
{
if (instance is MethodBase)
{
object obj = (instance as MethodBase).Invoke(args[0], BindingFlags.Default, null, args[1] as object[], null);
if ((object)typeof(T) != null)
{
return (T)obj;
}
return (T)Convert.ChangeType(obj, typeof(T));
}
StopHook(showInfo: false);
object obj2 = _sourceMethodMeta.Method.Invoke(instance, args);
StartHook(showInfo: false);
if ((object)typeof(T) != null)
{
return (T)obj2;
}
return (T)Convert.ChangeType(obj2, typeof(T));
}
object value = _sourceMethodMeta.Method.Invoke(instance, args);
return (T)Convert.ChangeType(value, typeof(T));
}
catch (Exception ex)
{
Exception ex2 = ex;
while (ex2.InnerException != null)
{
ex2 = ex2.InnerException;
}
Utils.LogWriteLine("call InvokeOriginal error:" + ex2.Message, ConsoleColor.DarkRed);
}
return default(T);
}
public void InvokeOriginal(object instance, params object[] args)
{
try
{
if (IsEnabled)
{
if (instance is MethodBase)
{
(instance as MethodBase).Invoke(args[0], BindingFlags.Default, null, args[1] as object[], null);
return;
}
StopHook(showInfo: false);
_sourceMethodMeta.Method.Invoke(instance, args);
StartHook(showInfo: false);
}
else
{
_sourceMethodMeta.Method.Invoke(instance, args);
}
}
catch (Exception ex)
{
Exception ex2 = ex;
while (ex2.InnerException != null)
{
ex2 = ex2.InnerException;
}
Utils.LogWriteLine("call InvokeOriginal error:" + ex2.Message, ConsoleColor.DarkRed);
}
}
}
}

32
AsposeHook/MethodMeta.cs Normal file
View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ExtractResFile.AsposeHook
{
internal class MethodMeta
{
public MethodBase Method { get; set; }
public IntPtr MethodDescAddress { get; set; }
public IntPtr MethodDescValue { get; set; }
public IntPtr FunctionPointerBeforePrepare { get; set; }
public IntPtr Next1IntptrBeforePrepare { get; set; }
public IntPtr Next2IntptrBeforePrepare { get; set; }
public IntPtr FunctionPointerAfterPrepare { get; set; }
public IntPtr Next1IntptrAfterPrepare { get; set; }
public IntPtr Next2IntptrAfterPrepare { get; set; }
public IntPtr FinalMethodAddress { get; set; }
}
}

105
AsposeHook/Utils.cs Normal file
View File

@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ExtractResFile.AsposeHook
{
internal static class Utils
{
private static bool _enableLog;
public static void EnableLog()
{
_enableLog = true;
}
public static void DisableLog()
{
_enableLog = false;
}
public static void LogWrite(string msg)
{
if (_enableLog)
{
Console.Write(msg);
}
}
public static void LogWriteLine(string msg, ConsoleColor forgroundColor = ConsoleColor.Gray)
{
if (_enableLog)
{
Console.ForegroundColor = forgroundColor;
Console.WriteLine(msg);
Console.ResetColor();
}
}
public static string To16String(this IntPtr address)
{
if (Environment.Is64BitProcess)
{
return Convert.ToString(address.ToInt64(), 16).PadLeft(16, '0');
}
return Convert.ToString(address.ToInt32(), 16).PadLeft(8, '0');
}
public static IntPtr ReadIntPtr(this IntPtr address)
{
return Marshal.ReadIntPtr(address);
}
public static void ShowMethodInfo(MethodMeta meta)
{
if (_enableLog)
{
Console.WriteLine();
Console.Write("{0,-19}", "Method:");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("{0,-15}", meta.Method.Name);
Console.ResetColor();
Console.Write("{0,-19}", "MethodDesc Addr:");
Console.WriteLine("{0}", meta.MethodDescAddress.To16String());
Console.ResetColor();
Console.Write("{0,-19}", "MethodDesc Value:");
Console.WriteLine("{0}", meta.MethodDescValue.To16String());
Console.ResetColor();
Console.Write("{0,-19}", "GetFunctionPointer:");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("{0} => ", meta.FunctionPointerBeforePrepare.To16String());
if (meta.FunctionPointerBeforePrepare != meta.FunctionPointerAfterPrepare)
{
Console.ForegroundColor = ConsoleColor.Green;
}
Console.WriteLine("{0}", meta.FunctionPointerAfterPrepare.To16String());
Console.ResetColor();
Console.Write("{0,-19}", "IntPtr1:");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("{0} => ", meta.Next1IntptrBeforePrepare.To16String());
if (meta.Next1IntptrBeforePrepare != meta.Next1IntptrAfterPrepare)
{
Console.ForegroundColor = ConsoleColor.Green;
}
Console.WriteLine("{0}", meta.Next1IntptrAfterPrepare.To16String());
Console.ResetColor();
Console.Write("{0,-19}", "IntPtr2:");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("{0} => ", meta.Next2IntptrBeforePrepare.To16String());
if (meta.Next2IntptrBeforePrepare != meta.Next2IntptrAfterPrepare)
{
Console.ForegroundColor = ConsoleColor.Green;
}
Console.WriteLine("{0}", meta.Next2IntptrAfterPrepare.To16String());
Console.ResetColor();
}
}
}
}

93
AsposeWordManage.cs Normal file
View File

@ -0,0 +1,93 @@
using Aspose.Words;
using Aspose.Words.Fields;
using Aspose.Words.Layout;
using Aspose.Words.Loading;
using Aspose.Words.Tables;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace LearnWordManage
{
public static class AsposeWordManage
{
static AsposeWordManage()
{
////使用注册码
//new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String(
// "PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGl" +
// "jZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZW" +
// "xvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pd" +
// "GVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+" +
// "CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2V" +
// "uc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0Pg" +
// "ogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOd" +
// "W1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0" +
// "aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnN" +
// "lVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy" +
// "91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ" +
// "1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhE" +
// "ejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJ" +
// "vU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));
}
public static byte[] HtmlToPageWord(string htmlBody, string headerName="")
{
//Document doc = new Document();
//DocumentBuilder builder = new DocumentBuilder(doc);
//var html = $"<html><body>{htmlBody}</body></html>";//这是html文本
//// 替换图片svg为png
//builder.InsertHtml(newHtml);
HtmlLoadOptions loadOptions = new HtmlLoadOptions { ConvertSvgToEmf =false, PreferredControlType = HtmlControlType.StructuredDocumentTag };
var html =$"<!DOCTYPE html><html lang=\"zh\"><head> <meta charset=\"UTF-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <title>{headerName}</title></head><body>{htmlBody}</body></html>";
using var mStream = new MemoryStream(Encoding.UTF8.GetBytes(html));
var doc = new Document(mStream, loadOptions);
//设置页眉
if (!string.IsNullOrEmpty(headerName))
{
DocumentBuilder builder = new DocumentBuilder(doc);
// 设置页面第一页和其它页显示不同
doc.FirstSection.PageSetup.DifferentFirstPageHeaderFooter = true;
// 移动到新 Section 的页眉位置开始插入页眉内容。
builder.MoveToHeaderFooter(HeaderFooterType.HeaderFirst);
builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
builder.Font.Name = "宋体";
builder.Font.Size = 12;
builder.Font.Color = Color.Gray;
builder.Write($"{headerName}");
// 设置第一页页码页数
builder.MoveToHeaderFooter(HeaderFooterType.FooterFirst);
builder.ParagraphFormat.Alignment = ParagraphAlignment.Right;
builder.Font.Name = "宋体";
builder.Font.Size = 12;
builder.Font.Color = Color.Gray;
builder.InsertField("PAGE", "");
builder.Write("/");
builder.InsertField("NUMPAGES", "");
// 设置设置第二页页码页数
builder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);
builder.ParagraphFormat.Alignment = ParagraphAlignment.Right;
builder.Font.Name = "宋体";
builder.Font.Size = 12;
builder.Font.Color = Color.Gray;
builder.InsertField("PAGE", "");
builder.Write("/");
builder.InsertField("NUMPAGES", "");
}
using var stream = new MemoryStream();
doc.Save(stream, SaveFormat.Docx);
return stream.ToArray();
}
}
}

View File

@ -0,0 +1,50 @@
using ExtractResFile.AsposeHook;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using System.ComponentModel.DataAnnotations;
using System.Text;
using System.Web;
namespace LearnWordManage.Controllers
{
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
private readonly ILogger<PdfController> _logger;
public PdfController(ILogger<PdfController> logger)
{
_logger = logger;
HookManager.StartHook();
}
/// <summary>
/// html转换word数据模型
/// </summary>
public class HtmlToPagePDFDto
{
[Required]
public string? HtmlBody { get; set; }
public string HeaderName { get; set; } = "";
}
///// <summary>
///// html转换word
///// </summary>
//[HttpPost, Route("htmltopageword")]
//public FileContentResult HtmlToPageWord(HtmlToPagePDFDto req)
//{
// if (req.HtmlBody is null)
// throw new Exception("无效转换内容");
// HttpContext.Response.Headers.AccessControlExposeHeaders = "Content-Disposition";
// HttpContext.Response.Headers.Add("Content-Disposition", " attachment;filename=" + HttpUtility.UrlEncode(req.HeaderName, Encoding.UTF8).ToUpper() + ".docx");
// var byteResult = AsposeWordManage.HtmlToPageWord(req.HtmlBody, req.HeaderName);
// var fileName = req.HeaderName+".docx";
// var mimeType = "application/ms-word";
// return new FileContentResult(byteResult, mimeType)
// {
// FileDownloadName = fileName
// };
//}
}
}

View File

@ -0,0 +1,62 @@
using ExtractResFile.AsposeHook;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using System.ComponentModel.DataAnnotations;
using System.Text;
using System.Web;
namespace LearnWordManage.Controllers
{
[ApiController]
[Route("[controller]")]
public class WordController : ControllerBase
{
private readonly ILogger<WordController> _logger;
public WordController(ILogger<WordController> logger)
{
_logger = logger;
}
/// <summary>
/// html转换word数据模型
/// </summary>
public class HtmlToPageWordDto
{
[Required]
public string? HtmlBody { get; set; }
public string HeaderName { get; set; } = "";
}
/// <summary>
/// html转换word
/// </summary>
[HttpPost, Route("htmltopageword")]
public FileContentResult HtmlToPageWord(HtmlToPageWordDto req)
{
Console.WriteLine($"【html转换word】{DateTime.Now} " +req.HeaderName);
try
{
HookManager.StartHook();
if (req.HtmlBody is null)
throw new Exception("无效转换内容");
HttpContext.Response.Headers.AccessControlExposeHeaders = "Content-Disposition";
HttpContext.Response.Headers.Add("Content-Disposition", " attachment;filename=" + HttpUtility.UrlEncode(req.HeaderName, Encoding.UTF8).ToUpper() + ".docx");
var byteResult = AsposeWordManage.HtmlToPageWord(req.HtmlBody, req.HeaderName);
var fileName = req.HeaderName + ".docx";
var mimeType = "application/ms-word";
return new FileContentResult(byteResult, mimeType)
{
FileDownloadName = fileName
};
}
catch (Exception ex)
{
Console.WriteLine("【html转换word】出现异常" + ex.Message);
Console.WriteLine(ex.StackTrace);
throw;
}
}
}
}

27
CustomExceptionFilter.cs Normal file
View File

@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace LearnWordManage
{
class CustomExceptionFilter : IAsyncExceptionFilter
{
public async Task OnExceptionAsync(ExceptionContext context)
{
var result = new
{
Code = -1,
Message = context.Exception.Message,
StackTrace = context.Exception.StackTrace
};
context.Result = new JsonResult(result);
Console.WriteLine(context.Exception.Message );
Console.WriteLine( context.Exception.StackTrace);
context.ExceptionHandled = true;
}
}
}

21
LearnWordManage.csproj Normal file
View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspose.Words" Version="23.12.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<Content Update="runtimeconfig.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

25
LearnWordManage.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LearnWordManage", "LearnWordManage.csproj", "{BAC76F58-37E7-4CF0-9183-38119A33ACAA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BAC76F58-37E7-4CF0-9183-38119A33ACAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAC76F58-37E7-4CF0-9183-38119A33ACAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BAC76F58-37E7-4CF0-9183-38119A33ACAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAC76F58-37E7-4CF0-9183-38119A33ACAA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6BB05D13-30F4-445A-829B-9EFBDDB274BF}
EndGlobalSection
EndGlobal

40
Program.cs Normal file
View File

@ -0,0 +1,40 @@
using LearnWordManage;
try
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddControllers(options =>
{
options.Filters.Add<CustomExceptionFilter>();
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
}
app.UseSwagger();
app.UseSwaggerUI();
app.UseAuthorization();
app.MapControllers();
Console.WriteLine("ϵͳÆô¶¯");
app.Run();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}

View File

@ -0,0 +1,31 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:37666",
"sslPort": 44355
}
},
"profiles": {
"LearnWordManage": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7099;http://localhost:5021",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

9
appsettings.json Normal file
View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

7
runtimeconfig.json Normal file
View File

@ -0,0 +1,7 @@
{
"runtimeOptions": {
"configProperties": {
"System.GC.Concurrent": false
}
}
}