飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8771|回复: 18

[原创] 【.NET】CodeKeeper .NET v2.6破解分析

[复制链接]
  • TA的每日心情
    奋斗
    2015-10-29 08:08
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2009-2-23 22:47:39 | 显示全部楼层 |阅读模式
    【文章标题】: CodeKeeper .NET v2.6破解分析
    【文章作者】: creantan
    【作者邮箱】: creantan@126.com
    【作者主页】: www.crack-me.com
    【下载地址】: 自己搜索下载
    【编写语言】: Microsoft Visual C# / Basic .NET
    【使用工具】: Reflector,SNRemove,CFF,IDA,Simple Assembly Explorer,Hex Workshop
    【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
    --------------------------------------------------------------------------------
    【详细过程】
    简单的一个.NET的程序。。。适合对.Net破解不熟悉的菜菜。。。
    PEID查壳显示:Microsoft Visual C# / Basic .NET
      Basic .NET的。。
      试着运行下标题上显示试用时间。。。功能上没有限制。。
      开始动手:
      Reflector 载入:
      看看有什么敏感信息:
      发现RegisterForm:
      很明显被混淆过了。。。
       1.JPG
      在里面找到关键部分:

    1.   private void (object, EventArgs)
    2.   {
    3.       if (Environment.OSVersion.Version.Minor == 1)
    4.       {
    5.           Encryption.CryptoProvider defaultProvider = Encryption.CryptoProvider.RC2;
    6.           Encryption encryption = new Encryption("zse3432WERtgyh87opDDertyuMKioiirq24D5bnA", defaultProvider);
    7.           if (!this..ValidateKey(this..Text))
    8.           {
    9.               MessageBox.Show("The key you enter is INVALID!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    10.           }
    11.           else
    12.           {
    13.               MessageBox.Show("Thank you for the registration!", "Registration complete", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    14.               try
    15.               {
    16.                   RegistryKey key2 = Registry.CurrentUser.OpenSubKey(@"Software\Dasain.com\CodeKeeper.NET", true);
    17.                   string str = encryption.Encrypt(this..Text, "zse3432WERtgyh87opDDertyuMKioiirq24D5bnA");
    18.                   key2.SetValue("Registration", str);
    19.                   key2.Close();
    20.               }
    21.               catch
    22.               {
    23.               }
    24.           }
    25.       }
    26.       else if (this..ValidateKey(this..Text))//ValidateKey通过方法判断用户输入的序列号是否有效!!!!
    27.       {
    28.           MessageBox.Show("Thank you for the registration!", "CodeKeeper .NET", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    29.           try
    30.           {
    31.               RegistryKey key4 = Registry.CurrentUser.OpenSubKey(@"Software\Dasain.com\CodeKeeper.NET", true);
    32.               string text = this..Text;
    33.               key4.SetValue("Registration", text);
    34.               key4.Close();
    35.           }
    36.           catch
    37.           {
    38.           }
    39.       }
    40.       else
    41.       {
    42.           MessageBox.Show("The key you enter is INVALID!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    43.       }
    44.   }
    45.   
    46.   
    47.   
    复制代码
    双击下来到ValidateKey方法,发现在Dasain.Key.dll中。。。

    1.   public bool ValidateKey(string key)
    2.   {
    3.       char[] chArray = new char[0x18];
    4.       int num2 = 0;
    5.       for (int i = 0; (i < key.Length) && (num2 < 0x18); i++)
    6.       {
    7.           char ch = key[i];
    8.           if ((((ch >= '0') && (ch <= '9')) || ((ch >= 'a') && (ch <= 'z'))) || ((ch >= 'A') && (ch <= 'Z')))
    9.           {
    10.               chArray[num2++] = key[i];
    11.           }
    12.       }
    13.       for (int j = 0; j < chArray.Length; j++)
    14.       {
    15.           if ((chArray[j] >= 'a') && (chArray[j] <= 'z'))
    16.           {
    17.               chArray[j] = (char) ((chArray[j] + 'A') - 0x61);
    18.           }
    19.       }
    20.       for (int k = 0; k < chArray.Length; k++)
    21.       {
    22.           if (chArray[k] == 'I')
    23.           {
    24.               chArray[k] = '1';
    25.           }
    26.           if (chArray[k] == 'L')
    27.           {
    28.               chArray[k] = '1';
    29.           }
    30.           if (chArray[k] == 'O')
    31.           {
    32.               chArray[k] = '0';
    33.           }
    34.           if (chArray[k] == 'S')
    35.           {
    36.               chArray[k] = '5';
    37.           }
    38.       }
    39.       for (int m = 0; m < chArray.Length; m++)
    40.       {
    41.           char[] chArray2;
    42.           int num6;
    43.           if ((chArray[m] >= '0') && (chArray[m] <= '9'))
    44.           {
    45.               (chArray2 = chArray)[num6 = m] = (char) (chArray2[num6] - '0');
    46.           }
    47.           if ((chArray[m] >= 'A') && (chArray[m] <= 'H'))
    48.           {
    49.               (chArray2 = chArray)[num6 = m] = (char) (chArray2[num6] - '7');
    50.           }
    51.           if ((chArray[m] >= 'J') && (chArray[m] <= 'K'))
    52.           {
    53.               (chArray2 = chArray)[num6 = m] = (char) (chArray2[num6] - '8');
    54.           }
    55.           if ((chArray[m] >= 'M') && (chArray[m] <= 'N'))
    56.           {
    57.               (chArray2 = chArray)[num6 = m] = (char) (chArray2[num6] - '9');
    58.           }
    59.           if ((chArray[m] >= 'P') && (chArray[m] <= 'R'))
    60.           {
    61.               (chArray2 = chArray)[num6 = m] = (char) (chArray2[num6] - ':');
    62.           }
    63.           if ((chArray[m] >= 'T') && (chArray[m] <= 'Z'))
    64.           {
    65.               (chArray2 = chArray)[num6 = m] = (char) (chArray2[num6] - ';');
    66.           }
    67.       }
    68.       long num7 = 0L;
    69.       long num8 = 0L;
    70.       long num9 = 1L;
    71.       for (int n = 0; n < 12; n++)
    72.       {
    73.           num7 += chArray[n] * num9;
    74.           num9 *= 0x20L;
    75.       }
    76.       num9 = 1L;
    77.       for (int num11 = 12; num11 < 0x18; num11++)
    78.       {
    79.           num8 += chArray[num11] * num9;
    80.           num9 *= 0x20L;
    81.       }
    82.       num7 = (num7 ^ 0x89b01d3da4d55a9L) ^ this.;
    83.       num8 = (num8 ^ 0x8bc9f8bd58b03d5L) ^ this.;
    84.       long num12 = num7 & 0x3fffffffL;
    85.       long num13 = (num7 & 0xfffffffc0000000L) >> 30;
    86.       long num14 = num8 & 0x3fffffffL;
    87.       long num15 = (num8 & 0xfffffffc0000000L) >> 30;
    88.       return (((num12 == num13) && (num12 == num14)) && (num12 == num15));
    89.   }
    90.   有兴趣的朋友试试做个注册机吧~~!!
    91.   
    复制代码
    再看下程序哪里还用到了这个方法:
      有两处:
    2.JPG
      
      现在开始来修改程序,只要ValidateKey方法返回的总是1就可以了:
      就用个工具去改吧。。。
      Simple Assembly Explorer打开程序
      双击dasain.key.dll

    1.   386             L_0288:        bne.un.s        389 -> ldc.i4.0
    2.   387             L_028a:        ldc.i4.1       
    3.   388             L_028b:        ret       
    4.   389             L_028c:        ldc.i4.0        //右击EDIT改为ldc.i4.1保存退出
    5.   390             L_028d:        ret                               
    6.   
    复制代码
    4.JPG
      试运行下。。发现强名称检验失败:
    5.JPG
       讲下强名称的去除方法:
      手动来:
      IDA载入dasain.key.dll到开始位置如下图:
       6.jpg
      这里就是强名称了。。。
      用Hex Workshop打开搜索一下。。
       7.JPG
      用工具Strong Name Remove就更简单了就不说了。。
      修改完后运行还是提示强名称检验失败。。。汗汗。。。dasain.key.dll强名称已经去除了。。。那肯定就是主程序的事咯。
      同样的方法去除CodeKeeper.NET.exe的强名称。。
      之后用CFF打开:
       8.JPG
      这次就用工具试下吧:
    9.JPG   
      好了。。。再来运行下。。哈哈。。可以了。。。
       10.JPG
      
    --------------------------------------------------------------------------------
    【版权声明】: 本文原创于creantan, 转载请注明作者并保持文章的完整, 谢谢!

                                                           2009年02月23日 22:39:58
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-2-23 23:25:59 | 显示全部楼层
    学习~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-2-23 23:41:08 | 显示全部楼层
    Il和源码之间的关系还是不太明白~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-2-24 13:22:42 | 显示全部楼层
    il到底是什么呢?~怎么和源码对上的呢?~
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-4-10 17:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-2-24 13:47:19 | 显示全部楼层
    真**~~~~~~~~~~~~~~~~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 838 天

    [LV.10]以坛为家III

    发表于 2010-1-26 14:27:15 | 显示全部楼层
    好文章,学习了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-2-16 12:39:44 | 显示全部楼层
    /:good 不错不错,学习了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-3-10 13:48:31 | 显示全部楼层
    学习了,谢谢。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-3-18 22:55:22 | 显示全部楼层
    高手中的高手。
    PYG19周年生日快乐!
  • TA的每日心情

    2016-10-21 18:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-3-24 18:20:40 | 显示全部楼层
    不错不错,学习
    net的文章不多,适合菜鸟的更少
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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