hanicegoby 发表于 2021-12-29 19:58

小白练手破解.NET软件的艰辛过程,与坛友交流,向大佬学习。

本帖最后由 hanicegoby 于 2022-1-7 14:19 编辑

奈何没有学过计算机编程,往往谈到破解都望而却步,最近闲来无事,研究.NET的软件破解,多向坛友学习。

首先,在论坛找到Detect It Easy查壳工具查壳。如图,软件是32位的,壳是有的“protector”保护的,壳的名字是.NET Reactor。





第二,有壳就先脱壳。脱.NET软件的壳需要用的软件是:“de4dot.exe”把软件直接拖拽到脱壳软件上就自动脱壳了。








如果遇见了脱壳不成功的情况,请将脱壳软件设置成管理员权限。








三、可以破解软件了。    拿着OD教程看了好几天,不过还好,学习有进步。但是跟论坛里的大佬比,简直就是太LOW了。




研究了好几天,才发现,原来用OD是个错误的选择,应该用Dnspy软件,然后就愉快地使用上了这个软件。并且在B站看了几篇教程然后就开始钻研。






由于没有学过C#语言,所以我的破解思路就是NOP掉跳转的地方。首先,每次点注册都是显示注册失败,于是在搜索栏搜索“注册失败“”。





如图,已经停在断点上了,按照近几天看的破解教程,这里修改个真假、跳转、TEXT相等等手段就可以获得破解效果。





这就是破解这个软件的难度,这个软件有两种注册渠道,一个是加密狗,一个是注册。修改掉一切往加密狗引导的if函数,并且把跳转条件设置的脑残一些。于是就得到了自己想要的破解效果,结果只是破解了一个寂寞。只徒有其表,没有实现真正的破解。





看来想要实现真正的破解,只能制作注册机了。



说一下破解的难度和还没有攻克的问题。


1.此软件和其他教程都不一样,很多软件是出来就是登录界面,过不去登录界面就无法使用。次软件是不管你是否注册都可以用,只是极个别的功能受限,而无法完全使用软件。


2.软件有加密狗加持,很多if函数修改之后,就开始报错,无法完全清除掉系统的各种验证。


3.如果进行下一步破解,不知道该学些什么知识,现在有大学MOOC在线课程,想学计算机的任何编程课都是可以的,很方便。


小白学破解不久,不懂的东西实在是太多了,还请坛友多多帮助。



能做到这已经是我自学破解的极限了。下面的链接是我的练手用的这个软件,已经脱过壳了。希望走过路过的大佬帮我看看程序,并提供一些有价值的建议,在这里感激不尽,如果能做一个视频给我讲讲就是最好的了。





链接:https://pan.baidu.com/s/1EJ9r9R1asyDljzaVC9RX8Q
提取码:5252


复制这段内容后打开百度网盘手机App,操作更方便哦



vipcrack 发表于 2021-12-30 10:36

本帖最后由 vipcrack 于 2021-12-30 10:38 编辑

hanicegoby 发表于 2021-12-30 09:58
不行啊,修改的都是非常表象的东西。
这个注册需要逆一个算法代码。
下面这个是读取注册文件的代码,你得逆回去,从注册码,机器码逆回去得到注册文件数据。

后面的内容是注册码部分的内容,就是对用户名,机器码进行了MD5的处理。

FileStream fileStream = new FileStream(openFileDialog.FileName, FileMode.Open);
                        BinaryReader binaryReader = new BinaryReader(fileStream, Encoding.Unicode);
                        int num = 15;
                        string text = binaryReader.ReadString();
                        int[] array = new int[] { 5, 7, 19, 28, 36, 41, 57 };
                        int[] array2 = new int[]
                        {
                              23, 35, 54, 79, 151, 162, 168, 179, 193, 237,
                              251, 264, 321, 347, 362, 377, 412
                        };
                        int num2 = 0;
                        int num3 = 0;
                        int num4 = 0;
                        int num5 = 0;
                        int num6 = 32;
                        string str = "";
                        string text2 = "";
                        int num7 = 0;
                        do
                        {
                              if (num7 == 24)
                              {
                                        string text3 = Strings.Mid(text, num7 + 1, 1);
                                        num = Strings.Asc(text3) - 32;
                              }
                              else if ((num7 == num6 + array) & (num3 < num))
                              {
                                        string text3 = Strings.Mid(text, num7 + 1, 1);
                                        str += text3;
                                        num3++;
                                        num2++;
                                        if (num2 >= array.Length)
                                        {
                                                num6 = num7;
                                                num2 = 0;
                                        }
                                        if (num3 >= num)
                                        {
                                                num6 = num7;
                                        }
                              }
                              else if ((num3 >= num) & (num7 == num6 + array2) & (num5 < 16))
                              {
                                        string text3 = Strings.Mid(text, num7 + 1, 1);
                                        text2 += text3;
                                        if (text2.Length == 4)
                                        {
                                                text2 += "-";
                                        }
                                        if (text2.Length == 9)
                                        {
                                                text2 += "-";
                                        }
                                        if (text2.Length == 14)
                                        {
                                                text2 += "-";
                                        }
                                        num5++;
                                        num4++;
                              }
                              num7++;
                        }
                        while (num7 <= 760);
                        binaryReader.Close();
                        fileStream.Close();
                        this.michinecode = str;
                        this.regcode = text2;

机器码,注册码,需要逆回去。

注册码算法:
                public static object smethod_0(string str3, string Str2)
                {
                        string text = "";
                        int num = 0;
                        checked
                        {
                              int num2 = Strings.Len(str3) - 1;
                              int num3 = num;
                              for (;;)
                              {
                                        int num4 = num3;
                                        int num5 = num2;
                                        if (num4 > num5)
                                        {
                                                break;
                                        }
                                        text += Conversion.Hex(Strings.Asc(Strings.Mid(str3, num3 + 1, 1)));
                                        num3++;
                              }
                              return string.Concat(new string[]
                              {
                                        Strings.Mid(MD5.MD5CODE(Strings.Mid(MD5.MD5CODE(text + Str2, 16), 3, 4), 16), 2, 4),
                                        "-",
                                        Strings.Mid(MD5.MD5CODE(Strings.Mid(MD5.MD5CODE(Str2 + text, 32), 1, 4), 32), 3, 4),
                                        "-",
                                        Strings.Mid(MD5.MD5CODE(Strings.Mid(MD5.MD5CODE(text + Str2, 32), 7, 4), 32), 6, 4),
                                        "-",
                                        Strings.Mid(MD5.MD5CODE(Strings.Mid(MD5.MD5CODE(Str2 + text, 16), 3, 5), 16), 6, 4)
                              });
                        }
                }

public static string MD5CODE(string strSource, short Code)
                {
                        string text = "";
                        byte[] bytes = new ASCIIEncoding().GetBytes(strSource);
                        byte[] array = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);
                        checked
                        {
                              if (Code == 16)
                              {
                                        int num = 4;
                                        do
                                        {
                                                text += Conversion.Hex(array).ToLower();
                                                num++;
                                        }
                                        while (num <= 11);
                              }
                              else if (Code == 32)
                              {
                                        int num = 0;
                                        do
                                        {
                                                text += Conversion.Hex(array).ToLower();
                                                num++;
                                        }
                                        while (num <= 15);
                              }
                              else
                              {
                                        int num2 = 0;
                                        int num3 = array.Length - 1;
                                        int num = num2;
                                        for (;;)
                                        {
                                                int num4 = num;
                                                int num5 = num3;
                                                if (num4 > num5)
                                                {
                                                      break;
                                                }
                                                text += Conversion.Hex(array).ToLower();
                                                num++;
                                        }
                              }
                              return text;
                        }
                }

cdj68765 发表于 2021-12-29 21:07

hanicegoby 发表于 2021-12-29 21:02
刚打开看了一下,上面和下面还有很多MD5的效验值,全都修改吗?

只需要改这一处就行了
这个程序,有两个验证版本,一个是插加密狗的情况下,用的是上面那个方法的MD5。
如果没有插加密狗就使用单纯输入账号密码的情况下MD5,这里只需要改我说的这个就行了,别的不用动

hanicegoby 发表于 2023-8-11 14:39

Mrlu60 发表于 2023-7-23 15:31
我也是到这一步就卡注了

找个新的软件,重新破解,然后发个帖,会有大佬为你提供帮助的。

cdj68765 发表于 2021-12-29 20:51


理解函数过程,只需要让这个方法返回空的字符串就行了,记得操作完保存模块,这个你应该懂的

longskr 发表于 2021-12-31 12:22

hanicegoby 发表于 2021-12-29 20:57

cdj68765 发表于 2021-12-29 20:51
理解函数过程,只需要让这个方法返回空的字符串就行了,记得操作完保存模块,这个你应该懂的

感谢指导,:lol:victory:
说实话,才学第三天,现在刚着手系统学习C语言。慢慢学吧,有兴趣学的就快。

hanicegoby 发表于 2021-12-29 21:02

cdj68765 发表于 2021-12-29 20:51
理解函数过程,只需要让这个方法返回空的字符串就行了,记得操作完保存模块,这个你应该懂的

刚打开看了一下,上面和下面还有很多MD5的效验值,全都修改吗?

hanicegoby 发表于 2021-12-29 21:06

cdj68765 发表于 2021-12-29 20:51
理解函数过程,只需要让这个方法返回空的字符串就行了,记得操作完保存模块,这个你应该懂的

懂了,原来就差高手的画龙点睛啊。{:1_893:}

B888 发表于 2021-12-29 21:33

我想说:有没有修复电脑得NET 那么多不知道怎么搞

seeworld5 发表于 2021-12-29 21:48

学习了了

包子学渗透 发表于 2021-12-29 22:08

谢谢 学习了

咔c君 发表于 2021-12-29 22:58

不错学习了
页: [1] 2 3 4 5 6 7
查看完整版本: 小白练手破解.NET软件的艰辛过程,与坛友交流,向大佬学习。