yosen2001 发表于 2016-11-2 00:05:27

Duplicate File Finder Plus 算法简单分析

本帖最后由 yosen2001 于 2016-11-2 00:15 编辑

根据某举报贴,简单分析了下

举报贴地址为:
实在看不下去了,身为版主……
https://www.chinapyg.com/thread-87358-1-1.html
(出处: 飘云阁(PYG官方论坛) )

算法代码如下,就两个函数,简单得很,口算就可以算出来

第一个函数
public static bool VerifyKey(string key, ref string type)
{
      int num;
      bool flag;
      int num2;
      try
      {
                ProjectData.ClearProjectError();
                num = 2;
                string text = key.Trim();
                string text2 = string.Empty;
                if (text.Length == 19)
                {
                        if (Operators.CompareString(text.Substring(0, 4), "TDFP", false) == 0)
                        {
                              if (Operators.CompareString(text.Substring(4, 1), "-", false) == 0)
                              {
                                        text2 = SelfService.Letter2Num(text.Substring(5, 2));
                                        if (Conversions.ToInteger(text2) <= 12 && Conversions.ToInteger(text2) >= 1)
                                        {
                                                text2 = SelfService.Letter2Num(text.Substring(7, 2));
                                                if (Conversions.ToInteger(text2) <= 59 && Conversions.ToInteger(text2) >= 0)
                                                {
                                                      if (Operators.CompareString(text.Substring(9, 1), "-", false) == 0)
                                                      {
                                                                text2 = text.Substring(10, 2);
                                                                if (General.InStrings(text2, new string[]
                                                                {
                                                                        "SG",
                                                                        "PS",
                                                                        "HM",
                                                                        "TM",
                                                                        "EP"
                                                                }))
                                                                {
                                                                        text2 = SelfService.Letter2Num(text.Substring(12, 2));
                                                                        if (Conversions.ToInteger(text2) <= 31 && Conversions.ToInteger(text2) >= 1)
                                                                        {
                                                                              if (Operators.CompareString(text.Substring(14, 1), "-", false) == 0)
                                                                              {
                                                                                        text2 = SelfService.Letter2Num(text.Substring(15, 2));
                                                                                        if (Conversions.ToInteger(text2) <= 59 && Conversions.ToInteger(text2) >= 0)
                                                                                        {
                                                                                                text2 = SelfService.Letter2Num(text.Substring(17, 2));
                                                                                                if (Conversions.ToInteger(text2) <= 23 && Conversions.ToInteger(text2) >= 0)
                                                                                                {
                                                                                                      type = text.Substring(10, 2);
                                                                                                      flag = true;
                                                                                                      goto IL_1E0;
                                                                                                }
                                                                                        }
                                                                              }
                                                                        }
                                                                }
                                                      }
                                                }
                                        }
                              }
                        }
                }
                IL_197:
                flag = false;
                goto IL_1E0;
                num2 = -1;
                @switch(ICSharpCode.Decompiler.ILAst.ILLabel[], num);
                IL_1B1:
                goto IL_1D5;
      }
      object arg_1B3_0;
      endfilter(arg_1B3_0 is Exception & num != 0 & num2 == 0);
      IL_1D5:
      throw ProjectData.CreateProjectError(-2146828237);
      IL_1E0:
      bool arg_1EA_0 = flag;
      if (num2 != 0)
      {
                ProjectData.ClearProjectError();
      }
      return arg_1EA_0;
}



第二个函数

private static string Letter2Num(string letters)
      {
                int num2;
                string text2;
                int num3;
                try
                {
                        IL_00:
                        int num = 1;
                        if (LikeOperator.LikeString(Declarer.startPath, "*Debug", CompareMethod.Binary))
                        {
                              goto IL_1E;
                        }
                        IL_15:
                        ProjectData.ClearProjectError();
                        num2 = -2;
                        IL_1E:
                        num = 4;
                        string text = string.Empty;
                        IL_27:
                        num = 5;
                        char[] array = letters.ToCharArray();
                        IL_31:
                        num = 6;
                        char[] array2 = array;
                        int i = 0;
                        checked
                        {
                              while (i < array2.Length)
                              {
                                        char c = array2;
                                        IL_45:
                                        num = 7;
                                        switch (c)
                                        {
                                        case 'A':
                                                IL_10F:
                                                num = 23;
                                                text += "5";
                                                IL_11F:
                                                break;
                                        case 'B':
                                        case 'E':
                                        case 'F':
                                        case 'G':
                                        case 'H':
                                        case 'I':
                                        case 'J':
                                        case 'K':
                                        case 'O':
                                        case 'P':
                                        case 'Q':
                                        case 'R':
                                        case 'S':
                                        case 'T':
                                        case 'U':
                                        case 'V':
                                                goto IL_17B;
                                        case 'C':
                                                IL_145:
                                                num = 32;
                                                text += "4";
                                                IL_155:
                                                break;
                                        case 'D':
                                                IL_133:
                                                num = 29;
                                                text += "0";
                                                IL_143:
                                                break;
                                        case 'L':
                                                IL_D3:
                                                num = 14;
                                                text += "9";
                                                IL_E3:
                                                break;
                                        case 'M':
                                                IL_169:
                                                num = 38;
                                                text += "7";
                                                IL_179:
                                                break;
                                        case 'N':
                                                IL_121:
                                                num = 26;
                                                text += "3";
                                                IL_131:
                                                break;
                                        case 'W':
                                                IL_FD:
                                                num = 20;
                                                text += "2";
                                                IL_10D:
                                                break;
                                        case 'X':
                                                IL_BE:
                                                num = 11;
                                                text += "1";
                                                IL_CE:
                                                break;
                                        case 'Y':
                                                IL_157:
                                                num = 35;
                                                text += "6";
                                                IL_167:
                                                break;
                                        case 'Z':
                                                IL_E8:
                                                num = 17;
                                                text += "8";
                                                IL_F8:
                                                break;
                                        default:
                                                goto IL_17B;
                                        }
                                        IL_18B:
                                        i++;
                                        IL_191:
                                        num = 43;
                                        continue;
                                        IL_17B:
                                        num = 41;
                                        text += "ERROR!";
                                        goto IL_18B;
                              }
                              IL_1A0:
                              num = 44;
                              text2 = text;
                              IL_1AB:
                              goto IL_2C1;
                              IL_1B0:;
                        }
                        int arg_1B7_0 = num3 + 1;
                        num3 = 0;
                        @switch(ICSharpCode.Decompiler.ILAst.ILLabel[], arg_1B7_0);
                        IL_274:
                        goto IL_2B6;
                        num3 = num;
                        @switch(ICSharpCode.Decompiler.ILAst.ILLabel[], (num2 > -2) ? num2 : 1);
                        IL_292:
                        goto IL_2B6;
                }
                object arg_294_0;
                endfilter(arg_294_0 is Exception & num2 != 0 & num3 == 0);
                IL_2B6:
                throw ProjectData.CreateProjectError(-2146828237);
                IL_2C1:
                string arg_2CB_0 = text2;
                if (num3 != 0)
                {
                        ProjectData.ClearProjectError();
                }
                return arg_2CB_0;
      }

算法总结如下:

注册码长度为19

第0-3位 TDFP

第 4 位 "-"

第5-6位 解密后必须为 1<= X <=12

第7-8位 解密后必须为 0<= X <=59

第 9 位 "-"

第10-11位 "SG", "PS","HM","TM","EP"
"SG",为 "单机许可证 1 PC"
"PS",为 "个人许可证 3 PCs"
"HM",为 "家庭许可证 10 PCs"
"TM",为 "团队许可证 100 PCs"
"EP",为 "企业许可证 不限 PC 数"

第12-13位 解密后必须为 1<= X <=31

第 14 位 "-"

第15-16位 解密后必须为 0<= X <=59

第17-18位 解密后必须为 0<= X <=23

解密互换
0 <==> D
1 <==> X
2 <==> W
3 <==> N
4 <==> C
5 <==> A
6 <==> Y
7 <==> M
8 <==> Z
9 <==> L



口算一组企业版注册码,我们都用最大的
TDFP-1259-EP31-5923 由此得到一组注册码为 :TDFP-XWAL-EPNX-ALWN

然后输入两次组织名字【飘云阁安全论坛(WWW.ChiNaPYG.CoM)】即可


测试效果如图







至于有没有网验,自行测试,这里不作探讨




雲裏霧裏 发表于 2016-11-2 00:07:30

夜神一出手就知有沒有,真牛,學習了!!

月无影 发表于 2016-11-2 07:50:53

感谢分享,学习了。   

orz 发表于 2016-11-2 09:03:19

这软件以前用过。感谢大牛分享。

Dxer 发表于 2016-11-2 11:41:42

这个是查找重复文件啊。牛

try258 发表于 2016-11-2 12:39:33

真牛,學習,感谢分享,

qq939595 发表于 2016-11-2 20:48:40

很好的解析教程,感谢大神分享!

aremat 发表于 2016-11-5 16:32:11

Thank you for teaching
Duplicate File Finder Plus 6.0 Build 032
Keygen - https://www.upload.ee/files/6318738/dupefile.rar.html

芸芸 发表于 2016-12-1 13:04:48

谢谢分享教程
页: [1]
查看完整版本: Duplicate File Finder Plus 算法简单分析