lmze2000 发表于 2017-4-27 19:35

xxx系列注册机分析

本帖最后由 H夜 于 2019-6-6 18:23 编辑

这段时间对南方周易系列软件的逆向研究,发现它的大部分注册机制大部分相同,因为那个软件不太好找下载地址。
官网上只有排八字、起名和万年历的软件。广大的坛友又给我提供了批八字与六爻的程序,现在一并发出来。
因为有之前的按步骤操作过程截图,这次,就只在关键的部分进行分析。

注册机及软件下载在文未,需要简单粗暴看结果的,直接翻到结尾:)

一、机器码处理部分
1.1、MD5运算部分
南方系列的软件在机器码的处理部分,分为两种情况。一种是直接取机器码去掉"-"后的字符串的前10位与后5位。不进行任何处理
直接MD5计算。
见下面代码
                              text = "";
                              text = Strings.Replace(A_0, " ", "", 1, -1, CompareMethod.Binary);
                              text = Strings.Replace(text, "-", "", 1, -1, CompareMethod.Binary);
                              text = Strings.Replace(text, "-", "", 1, -1, CompareMethod.Binary);
                              text = Strings.Replace(text, ",", "", 1, -1, CompareMethod.Binary);
                              text = Strings.Replace(text, "\u3000", "", 1, -1, CompareMethod.Binary);
                              bool flag = text.Length > 10;
                              if (true)
                              {
                              }
                              int num = 2;
                              while (true)
                              {
                                        switch (num)
                                        {
                                        case 0:
                                                text = Strings.Left(text, 10) + Strings.Right(text, 5);
另一种情况是,在进行了上面的前10位与后5位拼接后,还进行了如下的处理:即每位进行移位、与或运算,(主要是在排八字软件上。)
该步骤后,在进行MD5运算。
                        string result;
                        if (flag)
                        {
                              int num2 = length - 1;
                              for (int i = 0; i <= num2; i++)
                              {
                                        int num3 = Strings.Asc(A_0.Substring(i, 1));
                                        int a_ = num3 + 7;
                                        int a_2 = num3 * 5;
                                        num += unchecked((long)y.d(num3, a_, a_2));
                                        num += unchecked((long)y.c(num3, a_, a_2));
                                        num += unchecked((long)y.b(num3, a_, a_2));
                                        num *= unchecked((long)y.a(num3, a_, a_2)) + 12L;
                                        bool flag2 = num > 100000000L;
                                        if (flag2)
                                        {
                                                num = Conversions.ToLong(Strings.Right(num.ToString(), 7));
                                        }
                              }
                              string text = num.ToString();
                              bool flag3 = text.Length >= 6;
                              if (flag3)
                              {
                                        result = Strings.Right(text, 6);
                              }
                              else
                              {
                                        result = (num + 523109L).ToString();
                              }
                        }
                        return result;
1.2、字符串运算
在经过上面的MD5运算后,该系列软件这部分的注册过程还分两种情况,分别如下:
1.2.1、对MD5运算后截取位置为11、1、15、22、7、5,每位置截取2字符长度,拼接出一个12位长度字符串,
进行12次循环,每次循环判断是字母还是数字,如果是数字,那么直接与2进行异或,与结果串进行拼接,如果
是字母,那么取ASC码+20-循环的次数再转成字符串,如果转换后的字符是字母O,那么替换成数字0,再完成
所有的计算后,将生成的拼接字符串里面的数字0替换成数字4。完成替换后,从9、5、7、11这4个位置,每位置
取2位,拼接出注册码的第1-4位与9-12位。

代码如下:
public static string b(ref string A_0)
{
      string text = Strings.Replace(text, "0", "4", 1, -1, CompareMethod.Binary);
      result = Strings.Mid(text, 9, 2) + Strings.Mid(text, 5, 2) + Strings.Mid(text, 11, 2) + Strings.Mid(text, 7, 2);
      num = 13;
      continue;
}
case 6:
      {
                text2,
                Strings.Mid(A_0, 11, 2),
                Strings.Mid(A_0, 1, 2),
                Strings.Mid(A_0, 15, 2),
                Strings.Mid(A_0, 22, 2),
                Strings.Mid(A_0, 7, 2),
                Strings.Mid(A_0, 5, 2)
      });
      }
      string text3 = Conversions.ToString(Strings.Chr(Strings.Asc(Strings.Mid(text2, num2, 1)) + 20 - num2));
      flag = (Operators.CompareString(text3, "O", false) == 0);
      num = 10;
      continue;
}
case 9:
{
      int arg_121_0 = num2;
      int num3 = 12;
      if (arg_121_0 > num3)
      {
                num = 5;
                continue;
      }
      goto IL_295;
}
case 10:

flag = Versioned.IsNumeric(Strings.Mid(text2, num2, 1));

                }
      }

1.2.2
第2种情况,
总体流程是一样的,惟一不同的就是截取的位置变化了一下,MD5计算完之后,是从6、8、14、12、17、9的
位置来进行读取拼接,然后计算的时候,数字是与数字5进行异或计算,然后字符部分是把字母O替换成了数字8,
最后抽取注册码的位置变成了,7、5、11、9这4个位置。
代码如下:


                              string text = "";
                              string text2 = "";
                              text = string.Concat(new string[]
                              {
                                        text,
                                        Strings.Mid(A_0, 6, 2),
                                        Strings.Mid(A_0, 8, 2),
                                        Strings.Mid(A_0, 14, 2),
                                        Strings.Mid(A_0, 12, 2),
                                        Strings.Mid(A_0, 17, 2),
                                        Strings.Mid(A_0, 9, 2)
                              });
                              int num = 1;
                              do
                              {
                                        bool flag2 = Versioned.IsNumeric(Strings.Mid(text, num, 1));
                                        if (flag2)
                                        {
                                                text2 += Conversions.ToString(Conversions.ToInteger(Strings.Mid(text, num, 1)) ^ 5);
                                        }
                                        else
                                        {
                                                string text3 = Conversions.ToString(Strings.Chr(Strings.Asc(Strings.Mid(text, num, 1)) + 20 - num));
                                                bool flag3 = Operators.CompareString(text3, "O", true) == 0;
                                                if (flag3)
                                                {
                                                      text2 += "0";
                                                }
                                                else
                                                {
                                                      text2 += text3;
                                                }
                                        }
                                        num++;
                              }
                              while (num <= 12);
                              text2 = Strings.Replace(text2, "0", "8", 1, -1, CompareMethod.Text);
                              result = Strings.Mid(text2, 7, 2) + Strings.Mid(text2, 5, 2) + Strings.Mid(text2, 11, 2) + Strings.Mid(text2, 9, 2);
                        }
                        return result;


二、授权日期计算部分
授权日期这部分计算,没有变化,略过。详见我上一篇帖子。
南方排八字专业程序 V7.30 .net破解追码注册教程及爆破版

三、注册机及部分周易程序下载地址
由于官网和坛友提供的周易程序,可能存在版本不一致的情况,在注册的时候,从程序列表里面,
多选几个来计算注册码,基本上能覆盖到所有情况。


周易系列下载地址:链接: http://pan.baidu.com/s/1mi2Ymow 密码: 8nce
注册机下载地址:




计算注册码的时候,如果发现有注册码不对的,就换一个软件名称来计算一下,应该会
计算出2种不同的注册码,一定会有一个是正确的。




















hdwlx 发表于 2017-4-29 20:06

lmze2000 发表于 2017-4-28 16:19
你用的是不是xp环境,,
我刚才试了一下,在虚拟机的xp环境下,报不是有效32位程序,你换个win7在看看

的确是XP系统,可能楼主的是64位程序,因为图标都是空白的那种。

YoungBai 发表于 2017-4-30 15:53

潇洒浪子 发表于 2017-4-27 20:37
注册机下载后还是提示 出现问题"不是有效的win32应用程序“我的系统是xp

应该是你电脑上安装的.net版本低了.估计要.net 4.0及以上才行.

pyj521 发表于 2017-4-27 19:39

感谢分享收藏以后慢慢玩!

lovemft 发表于 2017-4-27 19:51

谢谢楼主分享 看到了

任雨洒 发表于 2017-4-27 19:54

感谢分享

wanghai123 发表于 2017-4-27 19:55

壊丶壊 发表于 2017-4-27 20:10

{:17_1058:}楼主辛苦了

3yu3 发表于 2017-4-27 20:15

2年前也研究过,就是原版程序 太不好找。啥时候程序齐全了再研究一下。

xmtt2008 发表于 2017-4-27 20:27


感谢分享

潇洒浪子 发表于 2017-4-27 20:37

注册机下载后还是提示 出现问题"不是有效的win32应用程序“我的系统是xp

胖子哦 发表于 2017-4-27 20:47

路过看看
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: xxx系列注册机分析