pjy612 发表于 2023-4-27 10:54

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

本帖最后由 pjy612 于 2023-4-27 18:08 编辑


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

### 前情提要
某日 某 3xx3 佬 给咱传了个 链接,说他搞不定这个。。。
咱问他是干啥的,他说 他也不清楚 就是看了名字觉得想弄一下。。。
啊这... 不过咱也好奇 到底是个啥,就折腾看看...

PS.
这个好像是个VBA学习工具,里面生产力的功能到是不多,但是不少图文教程。

**[知乎软文链接](https://zhuanlan.zhihu.com/p/77623351)**

淘宝里面有点贵好像。。。   
就用来当 5.1 礼物吧...(当然想嫖还是要点技术的

### 准备工作
下载安装包

安装完了

注册表也有了

功能也出来了

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

这个会和原始安装包一起放出来 方便大伙分析。

**[原始安装包和提取内容下载地址](https://pan.baidu.com/s/1f6TpscStub1YmvVfUEaeKA?pwd=52pj)**

### 开始分析
打开 产品注册窗口
中文软件的好处 就是可以直接搜名字 比如 激活,产品注册界面

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

试着先去个混淆
```cs
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;
                              string text4 = array;
                              string text5 = array;
                              if (text == text3) //array 要和 编码后的机器码一致
                              {
                                        DateTime dateTime;
                                        if (DateTime.TryParse(text5, out dateTime)) //array 是日期
                                        {
                                                if (DateTime.Today.Subtract(dateTime).Days <= 0) //array 要比当前日期大
                                                {
                                                      Settings.Default.ZhuCeMa = text2;
                                                      Settings.Default.App_RegistryDate = text4;
                                                      Settings.Default.App_RegistryCodeEndValidDate = text5;
                                                      Settings.Default.Save();//配置保存
                                                      string activatingCodeSavePath = Settings.Default.ActivatingCodeSavePath;
                                                      if (!File.Exists(activatingCodeSavePath))
                                                      {
                                                                if (!Directory.Exists(Path.GetDirectoryName(activatingCodeSavePath)))
                                                                {
                                                                        Directory.CreateDirectory(Path.GetDirectoryName(activatingCodeSavePath));
                                                                }
                                                                new FileStream(activatingCodeSavePath, FileMode.Create, FileAccess.ReadWrite).Close();
                                                      }
                                                      File.ReadAllLines(activatingCodeSavePath, Encoding.Default);
                                                      FileStream fileStream = new FileStream(activatingCodeSavePath, FileMode.OpenOrCreate);
                                                      StreamWriter streamWriter = new StreamWriter(fileStream);
                                                      streamWriter.WriteLine(text2);
                                                      streamWriter.Close();
                                                      fileStream.Close();
                                                      Microsoft.Office.Tools.Ribbon.RibbonTab magic_VBA_RibbonTab = Globals.Ribbons.GetRibbon<Ribbon1>().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);
      }
}
```
再来看看 密钥 在哪儿


密钥在这儿了


既然上了 RSA那肯定要替换密钥,
怎么换 可以参考 其他帖子,这里不详述。

值得一提的是,里面有一个明显字样
```cs
private string warnintext = "产品结构被非法篡改,当前用户已标记";
```
咱们瞧瞧都用在哪儿了



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


基本如果要改就是修改上面这两处位置了。
替换一个RSA密钥,然后 替换一下强签名验证的密钥,当然也可以直接强制改为判断成功。
咱这边就没动太多 改了两处文本。

### 编码逻辑
改完文本就要来实现激活码了。
之前已经分析出来 激活码的 格式很简单
```
[编码后的机器码,激活开始日期,激活结束日期]
然后 用字符 隔 拼接
然后 RSA 加密 具体看看怎么加密的
```



可以看到 有个 加密函数在

但是 入参是 两个 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 重新强签名网上一堆。

最后 卸载原版 使用重新签名后的版本安装后。

### 验证结果



### 补丁下载
**这里的补丁 只是做了重新签名,不是破解补丁!**
**这里的补丁 只是做了重新签名,不是破解补丁!**
**这里的补丁 只是做了重新签名,不是破解补丁!**

其中将密钥改为了私钥。
可以拿来针对这个特定版本计算激活码。
下载后 覆盖到 提取的插件目录内,然后双击 vsto 安装即可。



**[补丁文件](https://pan.baidu.com/s/1nkJOpJA5UTimaCjCFQ92_A?pwd=52pj)**




### 郑重声明

**仅供学习交流,请勿用于商业,觉得工具好用的还请支持正版**

### 附录 关于 Excel 插件 某某格子
这个说实话 当打开它的时候 还没出手 它就躺下了...里面是裸的...
虽说价格其实不贵,结果可网上注册机还满天飞...
你要是真想用 推荐支持正版,毕竟好功能都是联网的 按量计费 。
其他的 你真想白嫖用用 下面给个图 自己悟吧。
搞 .Net 应该一眼就看懂了,不懂的看了我其他帖子也就多少懂了。
所以说 它很良心了 以后就无视它吧...




仙鬼同拥 发表于 2023-4-27 12:42

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

pjy612 发表于 2023-4-27 13:02

本帖最后由 pjy612 于 2023-4-27 13:03 编辑

cddc22 发表于 2023-4-27 12:48
学习一下,看来lz对excel是非常执着的
no no no,咱对 excel 和 vba 一点兴趣都没有。。。
主要是你们可能感兴趣。。。。

咱只是对 能力可及,但是却包含不理解的东西 感兴趣和好奇。如果是上了强壳或者混淆的妈都不认识的。。。我也是直接 Shift+Delete 的。。。

比如这次遇到的纯 vsto 。
虽然之前超级v3也遇到过,但那个 不需要改动 dll 所以没仔细看。
这种改了就失效的。 要涉及额外的知识点。。。

pjy612 发表于 2023-4-27 13:11

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

好好看帖子,最下面已经写了。
没其他好说的了。{:301_971:}

ps520 发表于 2023-4-27 13:39

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

Elaineliu 发表于 2023-4-27 15:47

我看你挺喜欢折腾Excel插件的。其实国内这帮搞插件的日子过得都很凄惨,基本都是靠爱发电。

你这时不时的来个破解思路,搞得这帮家伙灰心丧气的。

慢慢地就会分化成两类,一类拼命上虚拟机,一类永远停止更新。

这两类也许就是在国内环境下的必然发展方向吧,

你促进了这种分化

不知道是好事还是坏事。

pjy612 发表于 2023-4-27 17:00

本帖最后由 pjy612 于 2023-4-27 17:13 编辑

Elaineliu 发表于 2023-4-27 16:02
我不需要求破,这插件就是个bool判断,注入之后修改,极其简单。

只是不知道这些年加密有没有什么进步
简单看了下 对外放的是阉割版 没啥研究的必要。
启动有500次限制。清下注册表就行了。。。

HKEY_CURRENT_USER\LingNineteen
Win161 值看着像是 9 的倍数 但是直接干掉就行了。

总结下来 防逆向最好的办法就是 。。。别放出来。。。 {:301_1008:}

{:301_990:} 咱发帖子 也都是别人拱火拱的。。。
有东西了 怎么着儿都得试一试吧。。。 试出来了 就分享下。。。
又不是直接放通杀的成品。。。囧。。。

pjy612 发表于 2023-4-27 17:41

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

至于 ...

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

pjy612 发表于 2023-4-27 18:44

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

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

pjy612 发表于 2023-4-29 18:53

本帖最后由 pjy612 于 2023-4-29 19:00 编辑

cc329533757 发表于 2023-4-29 18:16
讲讲学到你这种程度需要多久, 需要储备哪些知识..看什么资料
{:301_1008:} 不知道。主要是看你的兴趣程度。。。
我算是十年码农,但是 实际学习 也就是 培训班出来的 教的 java和C# 两方向。
咱想着能写桌面应用,最后走的.NET,当时主要学的还是 .NET 三层框架。
之后基本就是 自学,对什么感兴趣就研究什么。
当年对魔兽游戏私服感兴趣,那就要自学mysql什么的,C++虽然半生不熟,但是基本能看。
然后写简单的网页充值和对接口就要用php。
之后 页游私服出来了 要给游戏换皮 那就要解包配置文件。那就要学配置文件 和 flash,flex,还有 as3 脚本。不然不好拆官方的配置文件包。
再往后 工作中 java 也要用,语法和C#大差不差,逻辑通就行了。基本就是学其他框架怎么用。其他的都是自己研究。
再谈和破解相关的,那就是想修改游戏,玩的简单点。那就要碰CE,说的CE就要提到自动汇编。
自动汇编学到的简单技术就又能用到 破解的反汇编里面。
都是 一环套一环 。。。没什么特殊的速成。
所以说 咱就是个野路子,走的 实用流派。 理论那类,知道是个什么就行。
出了问题知道怎么拆分关键词,能搜到解决方案就算是成功了。
面试考的八股。。。我反正压根在工作中基本没用上。线程池没配过,知道线程怎么用的合适就行了。

说到软技能,反正就是 一定要有正常的逻辑思维能力和举一反三能力。有了解决方案也不能固收一招鲜,要学着拓展。
很多东西是互通的,某个领域能处理的问题,换了领域其实应该也有类似的解决方法,可能你不知道他的关键词,但是 大概解决流程是一样的。
多搜搜或者问问就知道了。
{:301_1007:}

有你才不孤单 发表于 2023-4-27 18:48

思路很清晰,按步骤确实可以,要是真心学习vba的,还是支持正版吧{:301_1000:}

pjy612 发表于 2023-5-8 08:45

本帖最后由 pjy612 于 2023-5-8 08:46 编辑

zhanglei1371 发表于 2023-5-8 05:43
拦截删除操作,怎么实现的?用什么工具,该怎么设置,能否指点下?
火绒,自定义规则,禁止指定目录的删除操作。。。{:301_1008:}
毕竟咱不知道具体到底哪个进程执行的解压安装啥的操作,就直接禁止所有程序对指定目录和内容的删除了。。。
反正能拿到结果就行。。。

马叫兽 发表于 2023-4-30 21:25

淘宝确实有点贵,想白嫖可能我悟不出来

Jack-NASA 发表于 2023-4-28 07:52

pjy612 发表于 2023-4-27 23:27
本职工作就是 .NET 码农 一只。。。
而且是 现在出去可能都找不到工作的那种。。。
明天会在开个帖子讲 ...

互联网行业今年是比较难,毕竟前几年的待遇啥的还是比较好的,不像我们工地打灰的,一直都是一个样

pjy612 发表于 2023-4-27 10:55

沙发自己的{:301_978:}

lizy169 发表于 2023-4-27 11:00

蟹蟹楼主分享

lifefriend 发表于 2023-4-27 11:02

感谢分享....

gly198752 发表于 2023-4-27 11:03

蟹蟹楼主分享

做客人间 发表于 2023-4-27 11:03

学习中 谢谢楼主

做客人间 发表于 2023-4-27 11:05

谢谢楼主   

god125 发表于 2023-4-27 11:06

蟹蟹大神分享过程,很有启发{:1_899:}

ycstudio 发表于 2023-4-27 11:07

学习一下,看来lz对excel是非常执着的

lsaizm1314 发表于 2023-4-27 11:08

楼主威武、学习了。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 某Excel插件 MagicalVBA 激活码逆向分析