云在天 发表于 2017-12-12 15:49

一个专利查错的逆向(网络验证)

看到悬赏区有人求类似软件,果断下载然后逆向。

【0X01】查壳


Unknown>>>>>Unknown Obfuscator,但是de4支持,所以果断拖进去脱壳。

【0X02】逆向
拖到DnSpy里,从入口点下手发现关键代码
if (configData.sn == null)//如果sn是空的就运行frmMain这个函数
                        {
                                configData.fileCreateTime = fileInfo.CreationTime.ToString();
                                Cache.licenseData = configData;
                                Application.Run(new frmMain());
                        }
我们来看这个Main函数
public void btnRegist_Click(object sender, EventArgs e)
                {
                        LicenseService licenseService = new LicenseService();
                        RegistIn registIn = new RegistIn();
                        registIn.sn = string.Concat(new string[]
                        {
                                this.txtSn1.Text,
                                "-",
                                this.txtSn2.Text,
                                "-",
                                this.txtSn3.Text,
                                "-",
                                this.txtSn4.Text
                        });
                        registIn.userInfo = this.txtClient.Text;//四个编辑框组成的sn
                        registIn.fileCreateTime = Cache.licenseData.fileCreateTime;//取创建时间
                        registIn.productApiKey = "vimiLVloKqDbOdTkIrQdAhtZkJFClP14594231815470201";
                        RegistOut registOut = licenseService.regist(registIn);//网络验证,下面是三种情况。
                        if (registOut == null)
                        {
                                MessageBox.Show("认证失败\r\n可能的原因\r\n1.序列号填写有误\r\n2.未连接互联网");
                        }
                        else if ("Y".Equals(registOut.isRegisted))
                        {
                                MessageBox.Show("该序列号已被使用");
                        }
                        else
                        {
                                MessageBox.Show("产品认证成功\r\n请重启本软件");
                                ConfigData licenseData = Cache.licenseData;
                                licenseData.sn = registIn.sn;
                                licenseData.userInfo = registIn.userInfo;
                                licenseData.right = registOut.right;
                                licenseData.lastAccessTime = DateTime.Now.ToString();
                                File.WriteAllText(Directory.GetCurrentDirectory() + "\\license", DESUtil.Encrypt(JsonUtil.objectToString(licenseData)));//加密获取的数据然后重启验证
                                Application.Exit();
                        }
                }
        }
}
这个函数直接删除引用就好,继续往下走
bool flag = true;
                                if (!fileInfo.CreationTime.ToString().Equals(configData.fileCreateTime))//这里是校验License,直接删除掉
                                {
                                        MessageBox.Show("认证文件已损坏!");
                                        flag = false;
                                        Application.Exit();
                                }
                                if (flag)
                                {
                                        LicenseService licenseService = new LicenseService();
                                        if (licenseService.onlineCheck(configData.sn))
                                        {
                                                configData.lastAccessTime = DateTime.Now.ToString();
                                                File.WriteAllText(Directory.GetCurrentDirectory() + "\\license", DESUtil.Encrypt(JsonUtil.objectToString(configData)));
                                        }
                                        else
                                        {
                                                DateTime d = DateTime.Parse(configData.lastAccessTime);
                                                int days = (DateTime.Now - d).Days;
                                                if (days > 7)
                                                {
                                                        flag = false;
                                                        MessageBox.Show("已经超过7天没有认证软件\r\n请连接互联网后重启软件");
                                                        Application.Exit();
                                                }
                                        }
                                }
                                if (flag)//这里是对比版本的所以没有必要删除掉
                                {
                                        VersionService versionService = new VersionService();
                                        VersionInfo newVersionInfo = versionService.getNewVersionInfo("vimiLVloKqDbOdTkIrQdAhtZkJFClP14594231815470201");
                                        if (newVersionInfo != null)
                                        {
                                                string text2 = File.ReadAllText(Directory.GetCurrentDirectory() + "\\version");
                                                if (!text2.Equals(newVersionInfo.versionNum))
                                                {
                                                        new frmVersion
                                                        {
                                                                oldVersion = text2,
                                                                newVersion = newVersionInfo.versionNum,
                                                                downloadUrl = newVersionInfo.fileUrl,
                                                                updateInfo = newVersionInfo.updateInfo
                                                        }.ShowDialog();
                                                }
                                        }
                                        string text3 = StringCommon.RandomString(50);
                                        File.WriteAllText(Directory.GetCurrentDirectory() + "\\hander", DESUtil.Encrypt(text3));//下面就是启动主程序Patstory了,这个程序只是个启动器性质的
                                        new Process
                                        {
                                                StartInfo =
                                                {
                                                        FileName = Directory.GetCurrentDirectory() + "\\PatStory\\PatStory.exe",
                                                        Arguments = text3
                                                }
                                        }.Start();
                                }
                        }
                }
        }
}

【0x03】调试
保存调试,提示更新,更新完成后依然成功载入主程序


用到的工具:de4ot,Dnspy

ftn83 发表于 2020-4-17 16:24

本帖最后由 ftn83 于 2020-4-17 16:30 编辑

suidu 发表于 2020-4-17 14:57
软件名字叫什么啊?想尝试下
http://patstory.net/fullspec.html
这里可以下载到,非常期待能帮忙搞定,
对做这个行业的人来说,还是比较实用的。
搞定了肯定会给您币作为补偿。

Snake.Eyes 发表于 2017-12-12 17:02

学习了                   谢谢分享

studyC 发表于 2017-12-12 16:12

第一个图一直没加载成功,思路学习了,谢谢分享!

poulwalker 发表于 2017-12-12 16:36

谢谢楼主。学习了

寒尘丶Coldust 发表于 2017-12-12 23:38

感觉C#写的好容易被逆向啊...

龙木 发表于 2017-12-13 00:45

我就看看,好像很牛逼的样子!

shanhuyi 发表于 2017-12-13 10:58

好牛逼啊

toplove 发表于 2017-12-13 18:29

学习了,谢谢分享

heqiu000 发表于 2017-12-13 19:41

谢谢楼主分享

redking1989 发表于 2017-12-13 22:56

虽然看不明白,但还是要认真学习!!!
页: [1] 2
查看完整版本: 一个专利查错的逆向(网络验证)