吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22255|回复: 104
收起左侧

[.NET逆向] 记一款.net软件的注册分析

  [复制链接]
青春丿易逝 发表于 2018-6-17 22:09
本帖最后由 青春丿易逝 于 2018-6-18 00:22 编辑

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




第一步:使用ScanId查壳,发现有混淆,使用de4dot脱壳,然后载入dnspy
1.png
要找到注册点击事件很简单
this.tBoxSerialNo.Text就是输入的假码
[C#] 纯文本查看 复制代码
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[8];
                        if (string_2.Length > 8)
                        {
                                string_2 = string_2.Remove(8);
                        }
                        string_2.CopyTo(0, array, 0, string_2.Length);
                        char[] array2 = new char[8];
                        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;
        }


在注册事件下面又能找到机器码的生成
[C#] 纯文本查看 复制代码
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看看
[C#] 纯文本查看 复制代码
public static string smethod_0(string string_2, string string_3)/这个应该就是加密函数了
        {
                string text = Class4.string_1;
                char[] array = new char[8];
                if (string_2.Length > 8)
                {
                        string_2 = string_2.Remove(8);
                }
                string_2.CopyTo(0, array, 0, string_2.Length);
                char[] array2 = new char[8];
                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;
        }

小白不太会解释,所以下面就动态调试一下吧
2.png
smethod_8这返回的text2 + text3 + text4实际上是未加密前的机器码
3.png
4.png
string_为解密从注册表中读出的注册码(未注册时注册表中当然就没有注册码了)
随后又对注册码进行加密显示为this.tBoxSerialNo.Text
以上就是机器码和注册码的形成,一系列的加密解密过程,看似很麻烦,但是我们只需要挑重点的
[C#] 纯文本查看 复制代码
string text = Class4.smethod_1(this.string_0, this.tBoxSerialNo.Text);
                        if (text == Class3.smethod_9(Class3.smethod_8()))

我们回到注册事件,看看要满足什么条件才能注册成功
Class3.smethod_8我们通过机器码如何形成的分析中可以知道它返回的就是未加密前的机器码
[C#] 纯文本查看 复制代码
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())
5.png
对Class3.smethod_8追下去可以看出机器码的生成是与网卡有关的
简单的分析就到这了



接下来是注册机的制作
首先要明确 Class4.smethod_0是加密函数, Class4.smethod_1是解密函数
我们需要对加密后的机器码进行解密得到未加密的机器码(即Class3.smethod_8的返回值)
[C#] 纯文本查看 复制代码
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);                               /对注册码进行加密

以上就是注册机的主要思路
效果如图:
6.png




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

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

免费评分

参与人数 24吾爱币 +29 热心值 +24 收起 理由
yangyi0515 + 1 + 1 我很赞同!
Bamboo6T + 1 + 1 谢谢@Thanks!
kingpanfeng + 1 + 1 用心讨论,共获提升!
初亦泽 + 3 + 1 我很赞同!
dadao815 + 1 + 1 用心讨论,共获提升!
傻赤赤 + 1 + 1 用心讨论,共获提升!
chkds + 1 + 1 用心讨论,共获提升!
xyuetao + 1 + 1 用心讨论,共获提升!
610100 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zamliage + 1 + 1 用心讨论,共获提升!
创始人123 + 1 + 1 用心讨论,共获提升!
Ravey + 1 + 1 用心讨论,共获提升!
Probious + 1 谢谢@Thanks!
netle8 + 1 + 1 谢谢@Thanks!
在路上的人 + 1 + 1 谢谢@Thanks!
caleb110 + 1 + 1 我很赞同!
lookerJ + 1 + 1 谢谢@Thanks!
qaz003 + 1 + 1 用心讨论,共获提升!
戏言19 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
东海浪子 + 3 + 1 用心讨论,共获提升!支持楼主分享经验
luozh7682 + 1 + 1 用心讨论,共获提升!
hero888 + 1 + 1 用心讨论,共获提升!
shizp + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Monitor + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

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

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

点评

大佬,既然这么简单,不值得炫耀,期待你出几个原创啊。  发表于 2018-6-29 00:04
大佬,既然这么简单,不值得炫耀,期待你出几个原创啊。  详情 回复 发表于 2018-6-21 17:09
chenjingyes 发表于 2018-6-18 00:08
jiao100202186 发表于 2018-6-20 18:20
 楼主| 青春丿易逝 发表于 2018-6-17 22:52
lllxylh1 发表于 2018-6-17 22:41
这种很一般吧,算法都在程序里面,有什么炫耀的;
对于懂C#的没有什么难度;
1、第一步die去查 ...

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

免费评分

参与人数 3吾爱币 +2 热心值 +3 收起 理由
孤狼微博 + 1 + 1 简单的也好,复杂的也好,net的是看着你的学习继续继续
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hero888 + 1 + 1 用心讨论,共获提升!

查看全部评分

动物凶猛 发表于 2018-6-17 22:46
说句实话,不破解国产软件,还真没什么软件是可以破解的,很多论坛的没落就是因为有大佬这样的认为
lllxylh1 发表于 2018-6-17 22:54
青春丿易逝 发表于 2018-6-17 22:52
我没有炫耀吧,写在这记录一下

我错了,大佬,您继续
lllxylh1 发表于 2018-6-17 23:34
1查壳.png 2脱壳.png 3脱后.png 4注册弹框.png 5搜索关键字找到关键位置.png 6找到注册算法.png 7整个项目的源代码.png 8三个拼起来.png
 楼主| 青春丿易逝 发表于 2018-6-17 23:48

少了加密,而且如果单纯用机器码算注册码的话不需要调用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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-22 16:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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