本教程以Aspose.CAD 24.11.0版本为例进行破解,其它版本如Word,Cells和这个原理应该是一样的,按照教程来基本上是有手就行
破解工具
- dnspy.exe
- Aspose的dll
- 一个Aspose过期的激活码
- Visual Studio/Rider/VSCode等IDE
破解流程
新建一个项目,带有一个控制台程序,我这里用的dotnet 9 sdk,项目配置如下
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Reference Include="Aspose.CAD">
<HintPath>....\Aspose.CAD.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="MessagePack" Version="2.5.192" />
</ItemGroup>
</Project>
其中,Aspose.CAD.dll是从nuget上下载的,目录应该在C:\Users{计算机用户名}.nuget\packages\aspose.cad文件夹下面,MessagePack是Aspose.CAD的依赖项。Program.cs中写入如下代码:
new Aspose.CAD.License().SetLicense(
new MemoryStream(
Convert.FromBase64String(
"PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4="
)
)
);
Console.WriteLine("Hello, World!");
上面的激活码是网上随便找的,已经过期了,编译项目后用dnspy.exe 64位的打开项目目录的bin\Debug\net9.0\{你的exe}以及Aspose.CAD.dll,然后在SetLincense这一行打上断点,开始调试:
在SetLincense函数中我们单步往下调试,直到发现一个关键的代码:
string text12 = ((xmlElement17 != null) ? xmlElement17.InnerText : string.Empty);
DateTime dateTime3 = (text12.Equals(string.Empty) ? DateTime.MaxValue : DateTime.ParseExact(text12, #=zXGEHtrWJyLraARphkd2RogSdcXbS.#=zwsV_nXw=(-1769771424), CultureInfo.InvariantCulture));
这两行代码很明显就是从激活码中读取过期时间的,所以很简单,我们直接把过期时间改成2099年就可以了,这里由于dateTime3是从text12读取出来的,所以直接修改text12的值,我们先看一下对应的il代码
解释一下:
ldloc.s V_79(79)
加载局部变量V_79的值到计算堆栈上,这个变量可能是xmlElement17的引用
brtrue.s 430(0418)
如果堆栈顶部的值不为null/0,则跳转到430行,这是实现条件判断(xmlElement17 != null)的部分,如果V_79为null,执行:
ldsfld string[System.Runtime]String.String::Empty // 加载String.Empty
br.s 432(041F) // 跳转到存储结果的指令
如果V_79不为null,执行:
ldloc.s V_79(79) // 重新加载V_79
callvirt instance string [...] get_InnerText() // 调用InnerText属性
最后将结果存储到局部变量V_76中
stloc.s V_76(76)
上面这一大段看不懂也无所谓,我们只需要用il指令生成一个常量字符串"20990101",然后赋值给V_76(这个就是text12)
修改起来很简单,只需要把426-431行il指令删了,然后插入一条ldstr "20990101" 就可以了
修改完成后,这个text12就变成常量了:
保存模块,然后我们写个测试代码看看能不能正常运行:
using Aspose.CAD.FileFormats.Stp;
using Aspose.CAD.ImageOptions;
// 激活代码省略了
string source = "D:/3D-stp格式.stp";
string output = "D:/3D-stp格式.stl";
using (var cadImage = StpImage.Load(source))
{
cadImage.Save(output,new StlOptions());
}
Console.WriteLine("Hello, World!");
可以看到模型文件正常转换了,并且没有报错,非常的nice