本帖最后由 千人千面 于 2022-9-22 14:44 编辑
上一篇帖子通过dnSpy逆向爆破了Spire.Xls的水印
然后有大佬@cdj68765 提供了更加简单粗暴的思路和方法,就是通过反射直接赋值激活信息。
我根据大佬提供的代码片段和思路写了一个简单的拓展类,每次New Workbook或者New Document的时候直接调用即可注入激活信息。
使用最新的Nuget包:Spire.Office 7.9.0
目前已知的激活信息有2个分别是:
[C#] 纯文本查看 复制代码 Spire.Spreadsheet
Spire.DocViewer.Wpf
如果有大佬能提供更多的激活字符串
下面是调用和拓展方法
Excel
[C#] 纯文本查看 复制代码
Workbook wb = new Workbook();
wb.Crack();
//或者
Workbook wb = InjectLicense(new Workbook());
Word
[C#] 纯文本查看 复制代码
Document dc = new Document();
dc.Crack();
//或者
Document dc = InjectLicense(new Document());
[C#] 纯文本查看 复制代码 public static class SpireOfficeHelpers
{
/// <summary>
/// 注入激活信息
/// </summary>
/// <param name="workbook"></param>
public static void Crack(this Workbook workbook)
{
InjectLicense(workbook);
}
/// <summary>
/// 注入激活信息
/// </summary>
/// <param name="document"></param>
public static void Crack(this Document document)
{
InjectLicense(document);
}
/// <summary>
/// 注入激活信息,并返回该类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T InjectLicense<T>(T t) where T : class
{
var InternalLicense = t.GetType().GetProperty("InternalLicense", BindingFlags.NonPublic | BindingFlags.Instance);
var TypeLic = InternalLicense.PropertyType.Assembly.CreateInstance(InternalLicense.PropertyType.GetTypeInfo().FullName);
foreach (var item in TypeLic.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
if (item.FieldType.IsArray)
{
item.SetValue(TypeLic, new string[] { "Spire.Spreadsheet", "Spire.DocViewer.Wpf" });
}
else if (item.FieldType.IsEnum)
{
item.SetValue(TypeLic, 3);
}
}
InternalLicense.SetValue(t, TypeLic);
return t;
}
} |