白云岛资源网 Design By www.pvray.com

根据大佬@cdj68765 提供的思路和方法!的方法,直接跳过了以下的Debug过程,详细请看结尾。
1、最近在用这个Spire.XLS把XLS表格生成PDF,但是免费版的居然也有水印!这我能忍?
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


2、不废话,由于是.NET平台写的,我们直接把它拖进DnsPy先给他PY一下看看.常规操作,先搜索下字符串,这里搜索的时候不建议一上来就搜索完整字符串,因为八成没啥结果。下面搜索出来了几个方法,我们挨个点进去看看
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


从这几个方法的上下文来推断,虽然里面包含了关键字:Evaluation Warning,但是,我可以肯定,和水印上的EvaluationWarning : The document was created with Spire.XLS for .NET没有半毛钱关系,至于我为什么这么肯定,因为我已经NOP掉来调试过了。那么遇到这种情况的时候,字符串搜索不出来什么结果,那么可以肯定的是,字符串八成是被加密了。你以为我就那你没办法了吗!太小看我了,不管你再怎么加密,始终要解密出来,既然要解密出来,那我们怎么知道它啥时候解密,解密的字符串又去哪儿找?当然是去内存里面找,这里写了个简单的demo来生成一个表格并且保存为PDF,经过分析,水印是在保存这一步被添加上去的,我们在保存的这行代码上打个断点让程序跑起来。
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


现在程序已经断下来了,接下来打开调试工具栏-窗口-内存-内存1
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


接下来我们让程序跑起来,然后在内存中搜索字符串,可以看见,内存中的确存在该字符串,接下来大家可能会问,我也看见了,问题是他是从哪儿出来的额?
file:///C:/Users/y15/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
我们在代码上单击SaveToFile进入详细代码
通dnSpy的内存搜索去除Spire.XLS的PDF水印

forum.png


通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


往下找到SaveToPdf方法,我们继续深入他
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


进来以后可以看见,数行代码,我们重点关注黄色的方法调用,可以肯定的是,水印一定是在其中的某个方法中被加上去的,但是我咋知道是那个方法?当然是打断点调试,这里采用二分法打断点,先在中间打一个断点,然后去内存中搜索,逐步缩小范围,直到精确定位到具体方法。
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


上面没有,这里按F10逐过程进行排查。
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


当运行到倒数第二行代码的时候,内存中出现了字符串。我们单击该方法进入。发现里面调用了一个method_28的方法,继续深入。。。
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


代码有点长,我们先在第一行打个断点,然后重新运行程序,在断点处F10逐过程调试
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


经过一系列操作。。。我们定位到了该方法调用
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


再次经过一顿操作,最终最终我定位到了字符串解密的地方
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


难怪搜索不到字符串,它被序列化成数组了。
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


那么接下来的方法就简单了,我们只需要干掉这个判断就行~
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


最后保存模块就收工了,生成的PDF已经没有水印了。
通dnSpy的内存搜索去除Spire.XLS的PDF水印

image.png


感谢大佬@cdj68765 提供的思路和方法!
2022年9月22日更新了一下方法,C#用户直接写一个拓展方法调用即可
调用方法为:
[Asm] 纯文本查看 复制代码
var wb = new Workbook();wb.Crack();

拓展类为:
[Asm] 纯文本查看 复制代码
    public static class SpireOfficeHelpers    {        public static void Print(string path)        {            var wb = new Workbook();            wb.Crack();            wb.LoadFromFile(path);            var p = wb.PrintDocument;#pragma warning disable CA1416 // 验证平台兼容性            p.Print();#pragma warning restore CA1416 // 验证平台兼容性        }        public static void Print(byte[] bytes)        {            MemoryStream memeStream = new(bytes);            var wb = new Workbook();            wb.Crack();            wb.LoadFromStream(memeStream);            var p = wb.PrintDocument;#pragma warning disable CA1416 // 验证平台兼容性            p.Print();#pragma warning restore CA1416 // 验证平台兼容性        }        /// <summary>        /// 注入激活信息        /// </summary>        /// <param name="workbook"></param>        public static void Crack(this Workbook workbook)        {            CrackLicense(workbook);        }        /// <summary>        /// 注入激活信息        /// </summary>        /// <param name="document"></param>        public static void Crack(this Document document)        {            CrackLicense(document);        }        /// <summary>        /// 注入激活信息,并返回该类型        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="t"></param>        /// <returns></returns>        public static T CrackLicense<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;        }    }
白云岛资源网 Design By www.pvray.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
白云岛资源网 Design By www.pvray.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。