iwolf 发表于 2024-6-27 17:01

某源代码转WORD工具破解免注册分析

本帖最后由 iwolf 于 2024-7-1 14:21 编辑

#前言
申请软著时,需要按一定word格式提交源代码文档,手动复制粘贴然后再调格式比较繁琐,就在网上搜索类似用途的工具,通过一篇介绍申请注意事项的帖子发现一款软件,遂下载使用。大小只有300多K,只要能生成规范的文档,满足功能即可。但是未注册软件只能生成部分文档,且含有多余文字信息,必须购买才能使用。该软件为一家医疗科技公司所开发(医疗科技公司开发软件?我认为这很跨界),并且就这一个小工具竟要3.99/天,当真有人买?软件很小,所以尝试练手破解。适合新手。

#某源代码转WORD工具
混淆:ConfuserEx
版本:2.4.0
#去混淆
首先拖入DIE分析,显示其为.NET程序,保护器: Confuser(1.X),拖入dnSpy中查看确为混淆代码。借助工具脱壳去混淆,最终使用ConfuserEx-Unpacker-v2.0能完全去混淆,然后通过dnSpy反编译出代码。
#分析
与注册有关的功能在XXXUtils命名空间的HDKey、RSACryption、ValidReg这3个类中。HDKey获取机器的编码(类似于硬盘序列号),代码为
```
return HDKey.UserMd5(cpuID + diskID + versionInfo.ProductName);
```
该编码为CPU的ID号、硬盘ID号、软件名称3个字段拼接字符串的MD5。RSACryption是RSA的签名验证算法,其中包含公钥。ValidReg与服务器验证页面通信,结果经RSA签名验证,返回注册状态。

#破解方式一
此方式最直接简单粗暴。修改上图第74行使onlineValid()函数返回true即可。软件只在MainForm类中的Verification()处进行联网注册验证,从代码中可以看出,只要程序不退出,若未注册,则每20S进行一次验证通信;若注册,则每10分钟进行一次验证通信。可以修改此处数值,延长注册验证的间隔时间。

代码能运行到onlineValid()函数内74行的逻辑有两种:1. 收不到服务器响应。2.收到的响应数据经过61行处的函数SignatureDeformatterWithMD5()验证后返回false。在运行前断网或者修改hosts文件使域名指向localhost,该方法可满足逻辑1。正常联网状态则满足逻辑2。这两种逻辑的程序执行路径不同,但都会运行到74行代码处,将此处结果修改为true可通过注册。点击第74行,点击右键,选择“编辑IL指令”,将序号105处的操作码ldc.i4.0更改为ldc.i4.1。记得保存文件。
运行软件,显示为“已注册”状态。

由于之前分析不完整,16楼小伙伴提出使用该方法后,生成文档仍然会有未注册的提示。可以字符串搜索,找到添加提示的代码如下图。

软件中将注册状态分3种:已注册、未注册、未联网。图中代码判断当RegState.AlreadyReg字段不是Valid(数值1,表示已注册),则向生成文档中添加未注册提示。因对dnSpy不熟练,不知道有没有类似IDA中查找字段引用的功能,除了使用简单的搜索外不知道有什么办法能快速定位AlreadyReg字段引用,有熟练的大牛可以评论告知。
若使用逻辑1,不接收响应,则要修改ReadCode2Word()中的if判断条件,或使用dnSpy中编辑方法的功能注释掉图中AddText2Doc(“未注册XXX”)的语句(未测试注释掉语句是否能生效)。若使用逻辑2,可以修改ReadCode2Word()中的内容,也可以按照19楼的方法将 “48行操作码ldc.i4.2更改为ldc.i4.1”   其对应于代码将 RegState.AlreadyReg = RegState.SoftwareState.NotValid;修改为RegState.AlreadyReg = RegState.SoftwareState.Valid;在此感谢评论区指出的问题。
#破解方式二
软件与服务器中的validreg.aspx页面通信,进行注册验证。可以修改第61行处的函数SignatureDeformatterWithMD5(),使其返回true,即可通过验证。

此方式需要搭建伪造服务器站点,同时修改hosts文件,使服务器指向本机。搭建相同路径下的网页站点,validreg.aspx.cs代码如下:
```
protected void Page_Load(object sender, EventArgs e)
{
      string HDKey = Request.Form["HDKey"];
      Response.Write("Valid\n");
      Response.Write(HDKey);
      Response.Write("\nsigndata\n"); //实际应为签名后的数据
      Response.Write("2101 / 1 / 1 0:00:00\n"); //过期时间
}
```
validreg.aspx收到软件post提交的数据后,返回4行信息。第1行固定为"Valid";第2行为机器编码;第3行为服务器使用私钥进行的签名,因为修改SignatureDeformatterWithMD5()使其返回true,跳过签名验证,所以第3行数据可任意写;第4行为软件过期时间。使用VS搭建站点时需取消掉默认使用的MVC路由机制,否则页面会重定向到无aspx后缀的页面。
#破解方式三
不修改方式二中的SignatureDeformatterWithMD5()函数,使其进行正常的RSA签名验证,但需要在validreg.aspx.cs实现代码中添加数据签名的处理过程。首先生成一个公私钥对,网页代码对软件post的字符串使用私钥进行签名,将结果返回给软件。软件用公钥进行签名验证,通过后则注册成功。使用生成的公钥替换掉软件中的公钥即可。


#总结
软件的注册验证机制简单,代码逻辑清晰。方式一最简单直接,修改函数onlineValid()返回值为true,不管联网与否(还需修改RegState.AlreadyReg字段值,详看破解方式一末尾部分)。方式二、三都需要搭建伪造服务器,修改hosts文件,使服务器指向本地。方式三引入RSA签名验证,不用修改函数返回值,但需额外替换公钥。
文中仅简单讨论了破解方式,但对于软件的实际功能并没有实测,评论中也有伙伴给出了开源的类似工具。同时感谢大家的评论,包括指出未完全注册的问题,相应解决办法,类似工具的开源方案,使用hook的方式等等。Hook又是一片新天地,也让我学习了,大家共同进步!
附件:

iwolf 发表于 2024-6-27 19:55

wjbg2022 发表于 2024-6-27 18:30
ConfuserEx-Unpacker-v2.0,楼主,这个工具可以分享一下吗?

论坛里搜一下,有分享这个工具的帖子
https://www.52pojie.cn/thread-1304627-1-1.html

msmvc 发表于 2024-7-2 16:01

本帖最后由 msmvc 于 2024-7-5 16:10 编辑

在楼主的基础上,这几天在尝试使用hook的方式注入onlineValid()方法一直返回true,可以看到画面显示注册成功
试用一下软件功能也发现了楼主在方法一补充的问题,参考16楼
接下来尝试用注入的方式解决上面的问题

2.24/07/05
已成功能hook

https://www.52pojie.cn/thread-1941002-1-1.html

wjbg2022 发表于 2024-6-27 18:30

ConfuserEx-Unpacker-v2.0,楼主,这个工具可以分享一下吗?

luxingyu329 发表于 2024-6-27 19:11

学习了,感谢楼主分享,对于这种组合验证还是需要熟悉运行流程

Yifan2007 发表于 2024-6-27 21:56

没加壳就是好操作,想问问加壳的程序有方法在dnspy里看到这个界面直接改代码然后编译吗

jgn3odl2 发表于 2024-6-27 21:58

学习学习

Lty20000423 发表于 2024-6-28 07:42

这个是从源码破解Office的?

HA19683 发表于 2024-6-28 08:43

感谢,学习了!

iwolf 发表于 2024-6-28 09:01

Lty20000423 发表于 2024-6-28 07:42
这个是从源码破解Office的?

不是的,这个跟office没关系,工具的功能是将自己开发的程序代码转成特定文档格式(用于申请软著),功能有限且简单,所以这工具本身并没有什么价值

iwolf 发表于 2024-6-28 09:14

Yifan2007 发表于 2024-6-27 21:56
没加壳就是好操作,想问问加壳的程序有方法在dnspy里看到这个界面直接改代码然后编译吗

我对加壳脱壳不了解,但是加壳或混淆过的肯定在dnspy里无法直接看到这种可读的代码,应该还是要脱壳
页: [1] 2 3 4
查看完整版本: 某源代码转WORD工具破解免注册分析