爱飞的猫 发表于 2015-9-18 00:12

xx财务记账软件正式版 -- 追码/注册机

本帖最后由 小生我怕怕 于 2019-6-7 00:16 编辑

之前做了个网络版的追码/加密狗的破解(http://www.52pojie.cn/thread-411667-1-1.html),这次来搞单机版的注册验证。

保护强度其实很弱,建议先自行破解试试。另外该系列的个人家用版的算法一样,只是两个值不同;密码管理器则与网络版的类似,除了没有加密狗验证。

零、免责声明
本文仅供学习交流只用,商业用途请使用正版。

本人不对使用破解版造成的坏账负责,真的。

(另外使用正版造成的坏账请联系开发商)

一、准备工作
和以前一样,直接用 de4dot 反混淆然后喂给 Reflector 就行了,这里不多说了。

二、进入程序内部
右键模块,选择「Go to Entry Point」,来到程序入口,可以看到程序首先载入登录窗口「dlgLogin」,然后载入程序主窗口「Main」。


点进去主窗口,在左边的对象找到注册按钮:


接着点进去,可以看到又是调用「dlgReg」窗口:
private void method_57()
{
    new dlgReg().ShowDialog();
}

再点 dlgReg 进入窗口看看怎么储存注册信息的,如果算法在这里的话就更好了:
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」这个方法里面了。

三、追算法
点进去一看,结果就一行代码(…):
public string GetNameBySN(string strSN)
{
    return SLEncrypt.smethod_1(strSN);
}

SLEncrypt 类的原型如下:
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」就能取得正确的注册码了。


四、写辅助程序
引入反混淆后的主程序,然后一句话生成注册码:
Console.WriteLine(CashFlowManager.SysManage.SLEncrypt.smethod_0("Jixun // LCG"));

生成后给程序一看,咦,怎么还是显示未注册?

其实,程序在「RegServer」这个类初始化的时候悄悄的把密钥给改掉了(…)。具体可以通过分析类成员看到:


    SLEncrypt.EncryptKey = "2008-10-10";
    SLEncrypt.EncryptVect = "xysoft2008";

然后改掉我们的算号代码,再喂给程序试试,果然可以了:
Console.WriteLine(CashFlowManager.SysManage.SLEncrypt.smethod_2("Jixun // LCG", "2008-10-10", "xysoft2008"));



五、用户名单验证
这个软件有客户验证,因此单纯的算号并没有什么卵用。

虽然不知道为什么测试的时候并没有触发暗桩 (内置的是黑名单?),但是保险起见还是干掉这个验证 (CashFlowManager.SysManage.CrackHandler 内的 Check、CheckFile 以及 GetDll,顺便干掉联网下载链接库):


然后保存即可:


用户名:Jixun // LCG
序列号:mXxbzXoMMPXZ6GSOvbx3RHTj0Mw9YA==


去除验证后的文件:http://pan.baidu.com/s/1eQk6SQA#9999
提取码:9999

爱飞的猫 发表于 2015-10-28 16:45

准女婿 发表于 2015-10-23 18:34
想问一下,“四、写辅助程序
引入反混淆后的主程序,然后一句话生成注册码:”这步是怎么操作的?

http://www.52pojie.cn/thread-411667-1-1.html

搜索關鍵字「附、引入应用程序作为模块调用」,然後粘貼代碼就可以了。

也可以直接把這個類的代碼拷貝過去,就不需要添加引用了。

sgh2zlx 发表于 2016-2-1 09:31

jixun66 发表于 2016-1-22 21:37
.. 请使用正版软件,我去把免责声明加上。

我发现出现这个情况不是软件的问题,是明细查询时没选择“全部”,系统默认只查询进30天的,改为“全部”就行了,我也在用,没问题的。还有请大牛能不能录个视频什么的,我等菜鸟实在弄不太懂教程后半部分的操作。

Shock 发表于 2015-9-18 03:54

   分析的 不错 支持楼猪 NET玩的炉火纯青啊{:301_986:}

soulovess 发表于 2015-9-18 05:58

支持楼主发帖,楼主讲的很详细,还是喜欢楼主发的“加密狗”帖子。。

wolf191 发表于 2015-9-18 06:31

支持楼主发帖,楼主讲的很详细

88酷行天下 发表于 2015-9-18 06:59

谢谢分享。。。。。。。。。。。。

东苑 发表于 2015-9-18 07:24

这个很多能用得着。

蚯蚓翔龙 发表于 2015-9-18 07:28

估计又是火钳了

爱自由 发表于 2015-9-18 08:14

支持一下了,感谢分享

sgh2zlx 发表于 2015-9-18 08:28

这么牛!只有往死里顶了{:1_918:}

a5680497 发表于 2015-9-18 08:33


感谢分享这个先收藏,暂时用不到
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: xx财务记账软件正式版 -- 追码/注册机