青春丿易逝 发表于 2018-6-17 22:09

记一款.net软件的注册分析

本帖最后由 青春丿易逝 于 2018-6-18 00:22 编辑

软件名称:深蓝取模工具 2018夏季版
官网地址:http://www.cybertrons.cn/SoftwareDownload/dmt2.aspx
使用工具:ScanId、de4dot、dnspy


https://static.52pojie.cn/static/image/hrline/4.gif

第一步:使用ScanId查壳,发现有混淆,使用de4dot脱壳,然后载入dnspy

要找到注册点击事件很简单
this.tBoxSerialNo.Text就是输入的假码
public static string smethod_1(string string_2, string string_3)/进入smethod_1发现会对假码进行解密
      {
                string text = Class4.string_1;
                string result = string.Empty;
                try
                {
                        char[] array = new char;
                        if (string_2.Length > 8)
                        {
                              string_2 = string_2.Remove(8);
                        }
                        string_2.CopyTo(0, array, 0, string_2.Length);
                        char[] array2 = new char;
                        if (text.Length > 8)
                        {
                              text = text.Remove(8);
                        }
                        text.CopyTo(0, array2, 0, text.Length);
                        if (string_3 == null || string_3 == "")
                        {
                              return result;
                        }
                        SymmetricAlgorithm symmetricAlgorithm = new DESCryptoServiceProvider();
                        symmetricAlgorithm.Key = Encoding.ASCII.GetBytes(array);
                        symmetricAlgorithm.IV = Encoding.ASCII.GetBytes(array2);
                        byte[] buffer = Convert.FromBase64String(string_3);
                        MemoryStream memoryStream = new MemoryStream(buffer);
                        CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateDecryptor(), CryptoStreamMode.Read);
                        StreamReader streamReader = new StreamReader(cryptoStream);
                        result = streamReader.ReadToEnd();
                        streamReader.Dispose();
                        cryptoStream.Dispose();
                        memoryStream.Dispose();
                        symmetricAlgorithm.Clear();
                }
                catch (Exception)
                {
                        return "密钥错误,数据包解密失败.";
                }
                return result;
      }

在注册事件下面又能找到机器码的生成
private void RegisteredForm_Load(object sender, EventArgs e)
                {
                        this.tBoxMac.Text = Class4.smethod_0(this.string_1, Class3.smethod_8()); /机器码的生成
                        string string_ = Class4.smethod_1(Class4.string_0, Class6.smethod_2("Shinkpod"));
                        this.tBoxSerialNo.Text = Class4.smethod_0(this.string_0, string_);
                }
进入smethod_0看看
public static string smethod_0(string string_2, string string_3)/这个应该就是加密函数了
      {
                string text = Class4.string_1;
                char[] array = new char;
                if (string_2.Length > 8)
                {
                        string_2 = string_2.Remove(8);
                }
                string_2.CopyTo(0, array, 0, string_2.Length);
                char[] array2 = new char;
                if (text.Length > 8)
                {
                        text = text.Remove(8);
                }
                text.CopyTo(0, array2, 0, text.Length);
                if (string_3 != null && !(string_3 == ""))
                {
                        SymmetricAlgorithm symmetricAlgorithm = new DESCryptoServiceProvider();
                        symmetricAlgorithm.Key = Encoding.ASCII.GetBytes(array);
                        symmetricAlgorithm.IV = Encoding.ASCII.GetBytes(array2);
                        MemoryStream memoryStream = new MemoryStream();
                        CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateEncryptor(), CryptoStreamMode.Write);
                        StreamWriter streamWriter = new StreamWriter(cryptoStream);
                        streamWriter.Write(string_3);
                        streamWriter.Dispose();
                        cryptoStream.Dispose();
                        byte[] inArray = memoryStream.ToArray();
                        memoryStream.Dispose();
                        symmetricAlgorithm.Clear();
                        return Convert.ToBase64String(inArray);
                }
                return string.Empty;
      }
小白不太会解释,所以下面就动态调试一下吧

smethod_8这返回的text2 + text3 + text4实际上是未加密前的机器码


string_为解密从注册表中读出的注册码(未注册时注册表中当然就没有注册码了)
随后又对注册码进行加密显示为this.tBoxSerialNo.Text
以上就是机器码和注册码的形成,一系列的加密解密过程,看似很麻烦,但是我们只需要挑重点的
string text = Class4.smethod_1(this.string_0, this.tBoxSerialNo.Text);
                        if (text == Class3.smethod_9(Class3.smethod_8()))
我们回到注册事件,看看要满足什么条件才能注册成功
Class3.smethod_8我们通过机器码如何形成的分析中可以知道它返回的就是未加密前的机器码
public static string smethod_9(string string_8)
      {
                string text = string_8.Substring(0, 8);
                string text2 = string_8.Substring(8, 8);
                string text3 = string_8.Substring(16, 8);
                uint num = Convert.ToUInt32(text, 16) + 573920429u;
                uint num2 = Convert.ToUInt32(text2, 16) + 2783279276u;
                uint num3 = Convert.ToUInt32(text3, 16) + 3706659863u;
                text = Convert.ToString((long)((ulong)num), 16).ToUpper().PadLeft(8, 'A');
                text2 = Convert.ToString((long)((ulong)num2), 16).ToUpper().PadLeft(8, 'B');
                text3 = Convert.ToString((long)((ulong)num3), 16).ToUpper().PadLeft(8, 'C');
                return text + text2 + text3;
      }
因此注册成功的条件为:解密后的注册码应==Class3.smethod_9(Class3.smethod_8())

对Class3.smethod_8追下去可以看出机器码的生成是与网卡有关的
简单的分析就到这了

https://static.52pojie.cn/static/image/hrline/4.gif

接下来是注册机的制作
首先要明确 Class4.smethod_0是加密函数, Class4.smethod_1是解密函数;
我们需要对加密后的机器码进行解密得到未加密的机器码(即Class3.smethod_8的返回值)
string text = smethod_1("kdet@1&j", textBox1.Text);                                 /调用smethod_1对机器码进行解密
                string text2 = smethod_9(text);                                                 /调用smethod_9生成未加密的注册码
                textBox2.Text = smethod_0("3~2t@1!7", text2);                               /对注册码进行加密
以上就是注册机的主要思路
效果如图:



https://static.52pojie.cn/static/image/hrline/4.gif

后记:第一次遇到这种有点麻烦的注册,对机器码和注册码都需要进行加密和解密,可能是作者为了防止直接的明码显示吧
一直都有大佬跟我说国产的注册机要慎发,所以这次只讨论该软件的算法,不提供注册机
欢迎大家探讨学习,以上分析如果有疑问的可在回复中指出

声明一下:小白在论坛内也是学习探讨,如果觉得这个分析没有什么质量的大佬可以飘过 最多我以后不再写这些简单的东西了{:301_1005:}

lllxylh1 发表于 2018-6-17 22:41

这种很一般吧,算法都在程序里面,有什么炫耀的;
对于懂C#的没有什么难度;{:1_899:}
1、第一步die去查壳;
2、有没有用的de4dot.exe跑一圈;
3、直接dnspy搞代码;
4、VS直接根据 程序中的注册算法,搞注册机;

chenjingyes 发表于 2018-6-18 00:08

分析得挺详细啊   哈哈哈

jiao100202186 发表于 2018-6-20 18:20

识别图片转文字工具2.8 18/06/19更新-办公必

青春丿易逝 发表于 2018-6-17 22:52

lllxylh1 发表于 2018-6-17 22:41
这种很一般吧,算法都在程序里面,有什么炫耀的;
对于懂C#的没有什么难度;
1、第一步die去查 ...

我没有炫耀吧,写在这记录一下

动物凶猛 发表于 2018-6-17 22:46

说句实话,不破解国产软件,还真没什么软件是可以破解的,很多论坛的没落就是因为有大佬这样的认为

lllxylh1 发表于 2018-6-17 22:54

青春丿易逝 发表于 2018-6-17 22:52
我没有炫耀吧,写在这记录一下

我错了,大佬,您继续;www

lllxylh1 发表于 2018-6-17 23:34

青春丿易逝 发表于 2018-6-17 23:48

lllxylh1 发表于 2018-6-17 23:34


少了加密,而且如果单纯用机器码算注册码的话不需要调用smethod_8

lllxylh1 发表于 2018-6-17 23:54

青春丿易逝 发表于 2018-6-17 23:48
少了加密,而且如果单纯用机器码算注册码的话不需要调用smethod_8

软件的源代码都有了,想怎么玩就看自己了

lllxylh1 发表于 2018-6-17 23:56

青春丿易逝 发表于 2018-6-17 23:48
少了加密,而且如果单纯用机器码算注册码的话不需要调用smethod_8

还有就是,大佬,我看您大部分都是玩的de4可以处理的,外加Dnspy,能不能分享点其他的;例如MaxToCode、HVM
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 记一款.net软件的注册分析