某Excel插件 MagicalVBA 激活码逆向分析

查看 173|回复 18
作者:pjy612   
某Excel插件 MagicalVBA 激活码逆向分析
前情提要
某日 某 3xx3 佬 给咱传了个 链接,说他搞不定这个。。。
咱问他是干啥的,他说 他也不清楚 就是看了名字觉得想弄一下。。。
啊这... 不过咱也好奇 到底是个啥,就折腾看看...  
PS.
这个好像是个VBA学习工具,里面生产力的功能到是不多,但是不少图文教程。  
知乎软文链接  
淘宝里面有点贵好像。。。
就用来当 5.1 礼物吧...  (当然想嫖还是要点技术的  
准备工作
下载安装包


1.png (45.16 KB, 下载次数: 0)
下载附件
2023-4-27 10:48 上传

安装完了


2.png (50.52 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

注册表也有了


3.png (73.02 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

功能也出来了  
但是 插件的 dll 呢?文件没了?!这不科学。。。
看样子是安装完就自动删除了。。。
得想办法 文件提取出来。。。
由于对这块儿不熟,所以直接笨办法,那杀毒软件 给屏蔽了删除操作
最后提取出了 具体的安装文件和 vsto


4.png (81.64 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

这个会和原始安装包一起放出来 方便大伙分析。  
原始安装包和提取内容下载地址  
开始分析
打开 产品注册窗口
中文软件的好处 就是可以直接搜名字 比如 激活,产品注册界面


5.png (107.39 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

然后 既然是个 Form 那里面的按钮肯定是 Button,简单看一眼


6.png (134.48 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

试着先去个混淆  
private void uiButton1_Click_1(object sender, EventArgs e)
{
        try
        {
                string text = this.tb_ComputerFingerPrint.Text;  //机器码文本框的值 基本就是 编码后的机器码
                string text2 = this.tb_ActivateCode.Text;        //激活码文本框 就是 传入的激活码 了
                if (!string.IsNullOrWhiteSpace(text2))
                {
                        //RSA解密
                        string[] array = new RSA(this._clientPublicKey).DencryptWithPublicKey(text2).Split(new char[] { '隔' });
                        //解析后 用 隔 分割,长度为3
                        if (array.Length != 3)
                        {
                                UIMessageBox.ShowError("激活码错误", true, false);
                        }
                        else
                        {
                                string text3 = array[0];
                                string text4 = array[1];
                                string text5 = array[2];
                                if (text == text3) //array[0] 要和 编码后的机器码一致
                                {
                                        DateTime dateTime;
                                        if (DateTime.TryParse(text5, out dateTime)) //array[2] 是日期
                                        {
                                                if (DateTime.Today.Subtract(dateTime).Days ().Magic_VBA_RibbonTab;
                                                        foreach (RibbonGroup ribbonGroup in magic_VBA_RibbonTab.Groups)
                                                        {
                                                                //....................
                                                        }
                                                        magic_VBA_RibbonTab.ResumeLayout(true);
                                                        magic_VBA_RibbonTab.PerformLayout();
                                                        base.Dispose();
                                                }
                                                else
                                                {
                                                        UIMessageBox.ShowError("当前激活码授予的使用权已过期!请购买新的激活码", true, false);
                                                }
                                        }
                                        else
                                        {
                                                UIMessageBox.ShowError("激活码错误", true, false);
                                        }
                                }
                                else
                                {
                                        UIMessageBox.ShowError("激活码错误", true, false);
                                }
                        }
                }
        }
        catch (Exception ex)
        {
                MessageBox.Show(ex.Message);
        }
}
再来看看 密钥 在哪儿


7.png (54.7 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

密钥在这儿了


8.png (27.12 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

既然上了 RSA那肯定要替换密钥,
怎么换 可以参考 其他帖子,这里不详述。
值得一提的是,里面有一个明显字样
private string warnintext = "产品结构被非法篡改,当前用户已标记";
咱们瞧瞧都用在哪儿了


9.png (75.66 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传



10.png (13.96 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

霍儿~ 用了强命名检查呢~
数据是这儿的


11.png (88.86 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

基本如果要改就是修改上面这两处位置了。
替换一个RSA密钥,然后 替换一下强签名验证的密钥,当然也可以直接强制改为判断成功。
咱这边就没动太多 改了两处文本。
编码逻辑
改完文本就要来实现激活码了。
之前已经分析出来 激活码的 格式很简单
[编码后的机器码,激活开始日期,激活结束日期]
然后 用字符 隔 拼接
然后 RSA 加密 具体看看怎么加密的


12.png (11.94 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传



13.png (82.72 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

可以看到 有个 加密函数在


14.png (85.07 KB, 下载次数: 0)
下载附件
2023-4-27 10:49 上传

但是 入参是 两个 BigInteger
我们可以逆推一下
//公钥解密是下面这样
RSAHelper.ResolveKey(key, out array, out array2);
BigInteger bigInteger = new BigInteger(array);
BigInteger bigInteger2 = new BigInteger(array2);
text = RSAHelper.DecryptString(encryptString, bigInteger, bigInteger2);
key = RSAHelper.ComponentKey(publicKeyParameters.Exponent, publicKeyParameters.Modulus);
那么 私钥加密 也应该是 类似这样
然后 看到 上面有个
public static RSAHelper.RSAKey GetRASKey()
{
        RSACryptoServiceProvider.UseMachineKeyStore = true;
        RSAParameters rsaparameters = new RSACryptoServiceProvider(1024).ExportParameters(true);
        return new RSAHelper.RSAKey
        {
                PublicKey = RSAHelper.ComponentKey(rsaparameters.Exponent, rsaparameters.Modulus),
                PrivateKey = RSAHelper.ComponentKey(rsaparameters.D, rsaparameters.Modulus)
        };
}
那么很明显了 私钥大概 用的就是 rsaparameters.D 和 rsaparameters.Modulus
key = RSAHelper.ComponentKey(rsaparameters.D, rsaparameters.Modulus);
RSAHelper.ResolveKey(key, out array, out array2);
BigInteger bigInteger = new BigInteger(array);
BigInteger bigInteger2 = new BigInteger(array2);
text = RSAHelper.EncryptString(encryptString, bigInteger, bigInteger2);
可以直接省略为
BigInteger bigInteger = new BigInteger(rsaparameters.D);
BigInteger bigInteger2 = new BigInteger(rsaparameters.Modulus);
text = RSAHelper.EncryptString(encryptString, bigInteger, bigInteger2);
开工
开始码代码实现了,老样子 偷懒用反射
无名小银,如果您要查看本帖隐藏内容请回复
杂项
默认的 插件安装逻辑里面 好像还有 强签名验证,vsto 验证什么的。   
如果对插件进行修改后不重新签名 可能导致插件不加载  
这里又是一大段的重新签名环节,而且感觉网上对这块儿 说明甚少。
为了减少影响 我真不做详细说明。
有兴趣的 可以自己去尝试,我这边会提供重新签名之后的补丁供大家尝试。
vsto 重新签名 参考文档:
https://learn.microsoft.com/zh-cn/visualstudio/deployment/how-to-re-sign-application-and-deployment-manifests?view=vs-2022  
.net dll 重新强签名网上一堆。
最后 卸载原版 使用重新签名后的版本安装后。
验证结果


16.png (341.41 KB, 下载次数: 0)
下载附件
2023-4-27 11:25 上传

补丁下载
这里的补丁 只是做了重新签名,不是破解补丁!
这里的补丁 只是做了重新签名,不是破解补丁!
这里的补丁 只是做了重新签名,不是破解补丁!  
其中将密钥改为了私钥。
可以拿来针对这个特定版本计算激活码。
下载后 覆盖到 提取的插件目录内,然后双击 vsto 安装即可。  
无名小银,如果您要查看本帖隐藏内容请回复
郑重声明
仅供学习交流,请勿用于商业,觉得工具好用的还请支持正版
附录 关于 Excel 插件 某某格子
这个说实话 当打开它的时候 还没出手 它就躺下了...  里面是裸的...
虽说价格其实不贵,结果可网上注册机还满天飞...
你要是真想用 推荐支持正版,毕竟好功能都是联网的 按量计费 。
其他的 你真想白嫖用用 下面给个图 自己悟吧。
搞 .Net 应该一眼就看懂了,不懂的看了我其他帖子也就多少懂了。
所以说 它很良心了 以后就无视它吧...  
无名小银,如果您要查看本帖隐藏内容请回复

下载次数, 下载附件

仙鬼同拥   

很受启发,楼主这是武林以和为贵点到为止啊
pjy612
OP
  


cddc22 发表于 2023-4-27 12:48
学习一下,看来lz对excel是非常执着的

no no no,咱对 excel 和 vba 一点兴趣都没有。。。
主要是你们可能感兴趣。。。。
咱只是对 能力可及,但是却包含不理解的东西 感兴趣和好奇。如果是上了强壳或者混淆的妈都不认识的。。。我也是直接 Shift+Delete 的。。。
比如这次遇到的纯 vsto 。
虽然之前超级v3也遇到过,但那个 不需要改动 dll 所以没仔细看。
这种改了就失效的。 要涉及额外的知识点。。。
pjy612
OP
  


月夜飘雪的泪 发表于 2023-4-27 13:08
大佬,IT小白求教方方格子的方法

好好看帖子,最下面已经写了。
没其他好说的了。
Elaineliu   

感谢楼主的分享 ,下来试试
pjy612
OP
  

我看你挺喜欢折腾Excel插件的。其实国内这帮搞插件的日子过得都很凄惨,基本都是靠爱发电。
你这时不时的来个破解思路,搞得这帮家伙灰心丧气的。
慢慢地就会分化成两类,一类拼命上虚拟机,一类永远停止更新。
这两类也许就是在国内环境下的必然发展方向吧,
你促进了这种分化
不知道是好事还是坏事。
pjy612
OP
  


Elaineliu 发表于 2023-4-27 16:02
我不需要求破,这插件就是个bool判断,注入之后修改,极其简单。
只是不知道这些年加密有没有什么进步

简单看了下 对外放的是阉割版 没啥研究的必要。
启动有500次限制。清下注册表就行了。。。
HKEY_CURRENT_USER\LingNineteen
Win161 值看着像是 9 的倍数 但是直接干掉就行了。
总结下来 防逆向最好的办法就是 。。。别放出来。。。
咱发帖子 也都是别人拱火拱的。。。
有东西了 怎么着儿都得试一试吧。。。 试出来了 就分享下。。。
又不是直接放通杀的成品。。。囧。。。
pjy612
OP
  


Elaineliu 发表于 2023-4-27 17:23
国内Excel插件开发技术水平很低,几乎没几个人知道什么是软件保护基础知识,能会个混淆就不错了
至于 ...

好的好的 大佬我错了行不。。。
有看到 你之前在 别的 VBA 帖子下 声讨了。。。
以后不会了。。。求放过。。。
本来 VBACodeAssistantPro 也不小心爆破了。。。
想着是别人的饭碗就没发。。。现在看来还好没发出来。。。
有你才不孤单   


3yu3 发表于 2023-4-27 17:22
大佬,到你手里都 是被秒杀啊。

秒毛线。。。
vsto 那玩意 搞到凌晨4点。。。
还好第二天居家办公。。。
不然想刀了你。。。
pjy612
OP
  

思路很清晰,按步骤确实可以,要是真心学习vba的,还是支持正版吧
您需要登录后才可以回帖 登录 | 立即注册

返回顶部