前言

这款软件也算是一款老牌的软件了,正好之前学过一段时间的逆向,打算借此机会磨练一下技术

本篇文章仅供学习交流,不提供任何样本下载,只是讨论技术,不存在破解软件等侵犯知识产权的可能性!

可以看到如果没有注册的话,会提示以下内容,提示我们注册软件

image-20260916130412278

如果注册码填写的不对,则会提示注册失败

image-20260918210714483

我们的目标是写一个注册机出来,是再好不过了。或者也可以patch某部分代码,实现注册成功

我们现在入手分析此程序,安装目录比较重要的文件就是下面四个:
image-20260917181755042

其中第一个可以直接用记事本打开,就是一些简单的生日等数据,因此可以不必看了。第二个是一个数据库文件,我们打开看一看内容

image-20260917182138206

可以看到也没有和注册相关的内容。这个dll文件实在是太小了,可以简单看看里面代码内容,估计不是和注册相关的

接下来开始分析exe本体文件。其实通过这俩就能简单看出来,软件原理就是导入一些公式化的古籍内容,根据输入的生日自动匹配,给出对应古籍的内容,也就是说只能作为娱乐使用。

咱们使用DIE查询到软件用的语言是VBscript,因此使用Dnspy这个软件进行分析

image-20260918210110409

patch思路破解

打开软件之后,在类里面找和注册相关的方法

先找到一个篇幅稍微长点的,估计是和真正注册码生成的算法相关,就先不分析了。一个软件应该会存放一个变量专门表示软件是否被注册,在使用的时候直接读取这个变量,方便又快捷。我们当务之急就是找到这个变量赋值或者校验的地方。

所幸功夫不负有心人,还是找到了这个地方的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// PaiBazi.RegData
// Token: 0x06000684 RID: 1668 RVA: 0x0006E518 File Offset: 0x0006C718
public static void CheckIfReg()
{
RegData.GetRegData();
RegData.GetHardData();
bool flag = RegData.FuncReadRegFile() & Operators.CompareString(RegData.pcnumber, ModPCAndRegcode.gstrPCNumber, true) == 0 & !File.Exists(RegData.gStrSystemDir + "\\syspbaz737.dll");
if (flag)
{
RegData.RegInfoFlag = true;
}
else
{
RegData.RegInfoFlag = false;
}
}

然后我们看到这个flag变量,那么既然我们是未注册用户,直接将此判断条件取反即可,右键编辑方法可进行修改代码。然后dnspy支持保存修改到exe里面,修改后保存即可

当然,我秉持着最小修改原则,就是怕出一些意料之外的bug等问题。

image-20260918210925847

注册机思路破解

从注册机思路去分析,我的第一个想法就是从校验函数入手,也就是刚才我们分析的这个地方。