本帖最后由 小生我怕怕 于 2019-6-7 00:16 编辑
之前做了个网络版的追码/加密狗的破解(http://www.52pojie.cn/thread-411667-1-1.html),这次来搞单机版的注册验证。
保护强度其实很弱,建议先自行破解试试。另外该系列的个人家用版的算法一样,只是两个值不同;密码管理器则与网络版的类似,除了没有加密狗验证。
零、免责声明
本文仅供学习交流只用,商业用途请使用正版。
本人不对使用破解版造成的坏账负责,真的。
(另外使用正版造成的坏账请联系开发商)
一、准备工作
和以前一样,直接用 de4dot 反混淆然后喂给 Reflector 就行了,这里不多说了。
二、进入程序内部
右键模块,选择「Go to Entry Point」,来到程序入口,可以看到程序首先载入登录窗口「dlgLogin」,然后载入程序主窗口「Main」。
点进去主窗口,在左边的对象找到注册按钮:
接着点进去,可以看到又是调用「dlgReg」窗口:
[C#] 纯文本查看 复制代码 private void method_57()
{
new dlgReg().ShowDialog();
}
再点 dlgReg 进入窗口看看怎么储存注册信息的,如果算法在这里的话就更好了:
[C#] 纯文本查看 复制代码 private void buttonReg_Click(object sender, EventArgs e)
{
if (!DevFunc.TextEditMsgEmpty(this.textBoxName, "请输入您的注册用户名!") && !DevFunc.TextEditMsgEmpty(this.textBoxSN, "请输入您的注册吗!"))
{
RegServer.ThisObj.SaveReg(this.textBoxName.Text.Trim(), this.textBoxSN.Text.Trim());
PublicFunc.MsgSuccess("注册信息已保存,请重新启动软件系统进行验证!");
base.DialogResult = DialogResult.OK;
DataMgr.Instance.CloseDb();
PublicFunc.ExecFile(Application.ExecutablePath, false, new string[] { Process.GetCurrentProcess().Id.ToString() });
}
}
看样子并没有在这里验证序列号的有效性,内容是通过 RegServer 这个类里面的内容储存的,那么读取是不是也在这里面?
点进去,果然有一个验证是否注册的函数「IsReg」:
简单说下这段代码的作用:
1. 用户名、序列号不为空。
2. 通过序列号取得的用户名需要与用户名相同。
由此可见,算法就在「GetNameBySN」这个方法里面了。
三、追算法
点进去一看,结果就一行代码(…):
[C#] 纯文本查看 复制代码 public string GetNameBySN(string strSN)
{
return SLEncrypt.smethod_1(strSN);
}
SLEncrypt 类的原型如下:
[Asm] 纯文本查看 复制代码 public class SLEncrypt
{
// Fields
public static string EncryptKey;
public static string EncryptVect;
// Methods
static SLEncrypt();
public SLEncrypt();
public static string smethod_0(string encryptStr);
public static string smethod_1(string encryptedValue);
public static string smethod_2(string encryptStr, string key, string IV);
public static string smethod_3(string encryptedValue, string key, string IV);
}
然后就是搞懂每个函数的作用了。
smethod_0:加密字符串,使用预设的密钥。
smethod_1:解密字符串,使用预设的密钥。
smethod_2:加密字符串,使用参数传递的密钥。
smethod_3:解密字符串,使用参数传递的密钥。
这么看的话,只要我们调用「SLEncrypt.smethod_0」就能取得正确的注册码了。
四、写辅助程序
引入反混淆后的主程序,然后一句话生成注册码:
[C#] 纯文本查看 复制代码 Console.WriteLine(CashFlowManager.SysManage.SLEncrypt.smethod_0("Jixun // LCG"));
生成后给程序一看,咦,怎么还是显示未注册?
其实,程序在「RegServer」这个类初始化的时候悄悄的把密钥给改掉了(…)。具体可以通过分析类成员看到:
[C#] 纯文本查看 复制代码 SLEncrypt.EncryptKey = "2008-10-10";
SLEncrypt.EncryptVect = "xysoft2008";
然后改掉我们的算号代码,再喂给程序试试,果然可以了:
[C#] 纯文本查看 复制代码 Console.WriteLine(CashFlowManager.SysManage.SLEncrypt.smethod_2("Jixun // LCG", "2008-10-10", "xysoft2008"));
五、用户名单验证
这个软件有客户验证,因此单纯的算号并没有什么卵用。
虽然不知道为什么测试的时候并没有触发暗桩 (内置的是黑名单?),但是保险起见还是干掉这个验证 (CashFlowManager.SysManage.CrackHandler 内的 Check、CheckFile 以及 GetDll,顺便干掉联网下载链接库):
然后保存即可:
用户名:Jixun // LCG
序列号:mXxbzXoMMPXZ6GSOvbx3RHTj0Mw9YA==
星宇财务单机版注册机.rar
(4.2 KB, 下载次数: 2073)
去除验证后的文件:http://pan.baidu.com/s/1eQk6SQA#9999
提取码:9999 |