某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 应该一眼就看懂了,不懂的看了我其他帖子也就多少懂了。
所以说 它很良心了 以后就无视它吧...
很受启发,楼主这是武林以和为贵点到为止啊 本帖最后由 pjy612 于 2023-4-27 13:03 编辑
cddc22 发表于 2023-4-27 12:48
学习一下,看来lz对excel是非常执着的
no no no,咱对 excel 和 vba 一点兴趣都没有。。。
主要是你们可能感兴趣。。。。
咱只是对 能力可及,但是却包含不理解的东西 感兴趣和好奇。如果是上了强壳或者混淆的妈都不认识的。。。我也是直接 Shift+Delete 的。。。
比如这次遇到的纯 vsto 。
虽然之前超级v3也遇到过,但那个 不需要改动 dll 所以没仔细看。
这种改了就失效的。 要涉及额外的知识点。。。 月夜飘雪的泪 发表于 2023-4-27 13:08
大佬,IT小白求教方方格子的方法
好好看帖子,最下面已经写了。
没其他好说的了。{:301_971:} 感谢楼主的分享 ,下来试试 我看你挺喜欢折腾Excel插件的。其实国内这帮搞插件的日子过得都很凄惨,基本都是靠爱发电。
你这时不时的来个破解思路,搞得这帮家伙灰心丧气的。
慢慢地就会分化成两类,一类拼命上虚拟机,一类永远停止更新。
这两类也许就是在国内环境下的必然发展方向吧,
你促进了这种分化
不知道是好事还是坏事。 本帖最后由 pjy612 于 2023-4-27 17:13 编辑
Elaineliu 发表于 2023-4-27 16:02
我不需要求破,这插件就是个bool判断,注入之后修改,极其简单。
只是不知道这些年加密有没有什么进步
简单看了下 对外放的是阉割版 没啥研究的必要。
启动有500次限制。清下注册表就行了。。。
HKEY_CURRENT_USER\LingNineteen
Win161 值看着像是 9 的倍数 但是直接干掉就行了。
总结下来 防逆向最好的办法就是 。。。别放出来。。。 {:301_1008:}
{:301_990:} 咱发帖子 也都是别人拱火拱的。。。
有东西了 怎么着儿都得试一试吧。。。 试出来了 就分享下。。。
又不是直接放通杀的成品。。。囧。。。
Elaineliu 发表于 2023-4-27 17:23
国内Excel插件开发技术水平很低,几乎没几个人知道什么是软件保护基础知识,能会个混淆就不错了
至于 ...
{:301_1008:}
好的好的 大佬我错了行不。。。
有看到 你之前在 别的 VBA 帖子下 声讨了。。。
以后不会了。。。求放过。。。
本来 VBACodeAssistantPro 也不小心爆破了。。。
想着是别人的饭碗就没发。。。现在看来还好没发出来。。。
{:301_973:} 3yu3 发表于 2023-4-27 17:22
大佬,到你手里都 是被秒杀啊。
秒毛线。。。
vsto 那玩意 搞到凌晨4点。。。
还好第二天居家办公。。。
不然想刀了你。。。 本帖最后由 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:}
思路很清晰,按步骤确实可以,要是真心学习vba的,还是支持正版吧{:301_1000:} 本帖最后由 pjy612 于 2023-5-8 08:46 编辑
zhanglei1371 发表于 2023-5-8 05:43
拦截删除操作,怎么实现的?用什么工具,该怎么设置,能否指点下?
火绒,自定义规则,禁止指定目录的删除操作。。。{:301_1008:}
毕竟咱不知道具体到底哪个进程执行的解压安装啥的操作,就直接禁止所有程序对指定目录和内容的删除了。。。
反正能拿到结果就行。。。
淘宝确实有点贵,想白嫖可能我悟不出来 pjy612 发表于 2023-4-27 23:27
本职工作就是 .NET 码农 一只。。。
而且是 现在出去可能都找不到工作的那种。。。
明天会在开个帖子讲 ...
互联网行业今年是比较难,毕竟前几年的待遇啥的还是比较好的,不像我们工地打灰的,一直都是一个样 沙发自己的{:301_978:} 蟹蟹楼主分享 感谢分享.... 蟹蟹楼主分享 学习中 谢谢楼主 谢谢楼主 蟹蟹大神分享过程,很有启发{:1_899:} 学习一下,看来lz对excel是非常执着的 楼主威武、学习了。