吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1978|回复: 21
收起左侧

[.NET逆向] 记一次对3D打印切片软件的逆向

  [复制链接]
Drzad 发表于 2024-6-29 18:33
本帖最后由 Drzad 于 2024-7-1 16:41 编辑

前情提要:
  高中时期使用的紫熙3D打印机,当时公司正在发展期,能够联系公司进行授权。目前公司倒闭了,又刚好碰上学校电脑重装,结果发现从其他电脑移植过去的许可证代码无效,没办法导出分层后的文件了,于是需要找到激活的方法。
  该切片软件正常导出时会提示许可证代码无效页面,如下:

0.png


逆向方法:

(1)找到上述提示框所对应的exe程序,为C盘目录下ZXPrint文件夹内的ZXFomer.exe

(2)使用Detect It Easy(爱盘内下载)分析程序。结果:该程序为.NET框架,无加壳(2015年代的软件安全性可能也不会太强)

1.png


(3)使用dnSpy(爱盘内下载)对程序进行反编译,通过代码审计找到ZX_G2P下的encodecomputer和From1_Load方法为验证许可证代码的逻辑。

2.png

4.png

3.png


代码如下:
[C#] 纯文本查看 复制代码
// textbook.ZX_G2P
// Token: 0x06000023 RID: 35 RVA: 0x000024CC File Offset: 0x000006CC
private int encodecompter(string inputstr)
{
        int num = 0;
        int[] array = new int[]
        {
                100,
                104,
                107,
                31,
                45,
                51
        };
        int num2 = 4;
        string currentDirectory = Environment.CurrentDirectory;
        if (!File.Exists(currentDirectory + "\\\\licence.dat"))
        {
                return num;
        }
        StreamReader streamReader = File.OpenText(currentDirectory + "\\\\licence.dat");
        string text = streamReader.ReadToEnd();
        streamReader.Close();
        if (text.Length < 110)
        {
                return num;
        }
        string text2 = "";
        int num3 = 0;
        foreach (char c in inputstr)
        {
                num3 += 656;
                int num4 = int.Parse(c.ToString());
                num4 = num4 * num4 * num3;
                if (num4 < 10)
                {
                        num4 += 13;
                }
                text2 += num4.ToString();
        }
        for (int j = text2.Length; j < 100; j++)
        {
                text2 += 0;
        }
        if (string.Compare(text2.Substring(0, 100), text.Substring(0, 100)) != 0)
        {
                return num;
        }
        int num5 = int.Parse(text.Substring(array[0], num2)) - 1897;
        int num6 = int.Parse(text.Substring(array[1], num2 - 1)) / 51;
        int num7 = int.Parse(text.Substring(array[2], num2)) / 290;
        DateTime now = DateTime.Now;
        DateTime t = DateTime.ParseExact(num5.ToString("d4") + num6.ToString("d2") + num7.ToString("d2"), "yyyyMMdd", CultureInfo.InvariantCulture);
        new TimeSpan(now.Ticks);
        new TimeSpan(t.Ticks);
        if (DateTime.Compare(t, now) >= 0)
        {
                string text3 = ZX_G2P.MD5Encrypt(text.Substring(77, 34));
                if (text.Length < text3.Length + 111)
                {
                        return num;
                }
                if (string.Compare(text.Substring(111, text3.Length), text3) == 0)
                {
                        this.help_txt = string.Concat(new string[]
                        {
                                this.help_txt,
                                "本软件有效期至:",
                                num5.ToString(),
                                "/",
                                num6.ToString(),
                                "/",
                                num7.ToString()
                        });
                        num++;
                }
        }
        return num;
}[/align][align=left]// textbook.ZX_G2P[align=left]// Token: 0x06000025 RID: 37 RVA: 0x00002778 File Offset: 0x00000978[/align][align=left]private void Form1_Load(object sender, EventArgs e)[/align][align=left]{[/align][align=left]        this.openfile.FlatAppearance.BorderSize = 0;[/align][align=left]        this.openfile.FlatAppearance.MouseDownBackColor = Color.Transparent;[/align][align=left]        this.openfile.FlatStyle = FlatStyle.Flat;[/align][align=left]        string inputstr = "ZX2016";[/align][align=left]        try[/align][align=left]        {[/align][align=left]                int num = 0;[/align][align=left]                string text = "";[/align][align=left]                string text2 = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"").Properties["VolumeSerialNumber"].Value.ToString();[/align][align=left]                if (text2 == "")[/align][align=left]                {[/align][align=left]                        text2 = this.GetCpuId();[/align][align=left]                }[/align][align=left]                foreach (char c in text2)[/align][align=left]                {[/align][align=left]                        num++;[/align][align=left]                        text += (int)((c - '\u001e') % '\n');[/align][align=left]                        text += ((int)c + num) % 10;[/align][align=left]                }[/align][align=left]                inputstr = text;[/align][align=left]        }[/align][align=left]        catch (Exception)[/align][align=left]        {[/align][align=left]                inputstr = "ZX20161117";[/align][align=left]        }[/align][align=left]        this.getcump_id(inputstr);[/align][align=left]        if (1 > this.encodecompter(this.cumputer_id))[/align][align=left]        {[/align][align=left]                this.tex_message.Visible = true;[/align][align=left]                this.license_state = 0;[/align][align=left]        }[/align][align=left]        else[/align][align=left]        {[/align][align=left]                this.Text = this.title;[/align][align=left]                this.license_state = 1;[/align][align=left]                this.tex_message.Visible = false;[/align][align=left]                if (Program.patharg != null && Program.patharg.Length != 0)[/align][align=left]                {[/align][align=left]                        base.WindowState = FormWindowState.Minimized;[/align][align=left]                        base.ShowInTaskbar = false;[/align][align=left]                        this.startbycmd(Program.patharg);[/align][align=left]                }[/align][align=left]        }[/align][align=left]        this.tex_message.Text = "本软件尚未成功激活,许可证代码无效(licence error);\r\n请联系紫熙发展技术支持部门,购买获取激活码;\r\n请访问www.zixichina.com 或致电:010-56147060\r\n如果您已经激活,请将激活文件放于 " + Environment.CurrentDirectory + "\r\n北京紫熙科技发展有限公司\r\nID:" + this.cumputer_id;[/align][align=left]}
// textbook.ZX_G2P
// Token: 0x06000024 RID: 36 RVA: 0x0000272C File Offset: 0x0000092C
public static string MD5Encrypt(string strText)
{
        HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider();
        string text = "";
        byte[] array = hashAlgorithm.ComputeHash(Encoding.Default.GetBytes(strText));
        for (int i = 0; i < array.Length; i++)
        {
                text += array[i].ToString();
        }
        return text;
}

(4)encodecompter方法使用一套检验方法对inputstr也就是本机硬盘码和licence.dat里的内容进行对比校验,若正确返回1,若过程中任何地方不正确则返回0。
(5)将encodecompter方法中的第一句“int num = 0;”修改为“int num = 1;”。然后删除掉倒数第5行的“num++;”。目的是使该函数一直返回1,即验证通过。
(6)将修改后的ZXFormer.exe放回软件安装目录,能够正常使用无失败弹窗。


样本下载地址:
软件安装包:https://wwf.lanzoul.com/iogp7238410j 密码:gc2z
所分析的EXE程序(ZXFormer.exe):https://wwf.lanzoul.com/i4jBM238413c 密码:e9a1

免费评分

参与人数 7威望 +1 吾爱币 +25 热心值 +7 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhuar + 1 + 1 用心讨论,共获提升!
Lishi8 + 1 + 1 用心讨论,共获提升!
frankrx41 + 1 + 1 用心讨论,共获提升!
zhczf + 1 + 1 我很赞同!
0120 + 1 + 1 我很赞同!
Issacclark1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dda159 发表于 2024-11-19 15:55
能把修改后的文件发给我吗?我太笨了,弄不明白dnspy,我的这个分层软件用不了,感谢
大家好,在此收集感谢
有效期截止到2024年12月9日15:53,麻烦在此之前点击以下链接将文件发送给我,支持发送任意格式的文件,感谢~
链接:https://pan.baidu.com/disk/main#/transfer/send?surl=AAIAAAAAABLt7A
来自:dda159
SnowRen 发表于 2024-6-30 11:55
注册机算法
[C#] 纯文本查看 复制代码
string text1 = "";
int num1 = 0;
foreach (char c in cumputer_id)
{
	num1 += 656;
	int num2 = int.Parse(c.ToString());
	num2 = num2 * num2 * num1;
	if (num2 < 10)
	{
		num2 += 13;
	}
	text1 += num2.ToString();
}
for (int j = text1.Length; j < 100; j++)
{
	text1 += 0;
}
if (text1.Length>100)
{
	text1 = text1.Substring(0, 100);
}
//有效期:年、月、日
text1 += (年+1897).ToString("D4");
text1 += (月*51).ToString("D3");
text1 += (日*290).ToString("D4");
text1+= MD5Encrypt(text1.Substring(77, 34));

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
dda159 + 1 + 1 感谢
Drzad + 1 + 1 感谢回复!

查看全部评分

baishuihao 发表于 2024-6-30 08:44
gksj 发表于 2024-6-30 00:28
本版班规第二条""2: 发布脱文、破解、算法分析文章时,请把试炼程序一并上传,便于会员们学习。
把程序分享出来也让大伙练练手,兴许注册机代码都有,呵呵~
SnowRen 发表于 2024-6-30 09:04
弄注册机,算法也很简单
mengxz2023 发表于 2024-6-30 09:12
C#程序相对好处理,但是有时候直接爆破的话,莫名其妙的不能执行,或许就是这种解释语言的弱点,感觉不是顺序执行的。
lastmu 发表于 2024-6-30 09:14
软件分享出来,就会有大神免费提供帮助,这氛围太好了。
ciker_li 发表于 2024-6-30 09:23
这个切片软件有什么特别的?
换Cura等不行吗?
Suppose 发表于 2024-6-30 11:29
这直接注册机不是更好
Yichenhanguang 发表于 2024-6-30 14:18
来学习一下楼主的高技术大作
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 19:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表