creantan 发表于 2009-2-24 08:01

【.NET】XXXXKeeper .NET v2.6破解分析

本帖最后由 云在天 于 2019-6-7 13:18 编辑

【文章标题】: 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】
在里面找到关键部分:
private void (object, EventArgs)
{
      if (Environment.OSVersion.Version.Minor == 1)
      {
          Encryption.CryptoProvider defaultProvider = Encryption.CryptoProvider.RC2;
          Encryption encryption = new Encryption("zse3432WERtgyh87opDDertyuMKioiirq24D5bnA", defaultProvider);
          if (!this..ValidateKey(this..Text))
          {
            MessageBox.Show("The key you enter is INVALID!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
          }
          else
          {
            MessageBox.Show("Thank you for the registration!", "Registration complete", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            try
            {
                  RegistryKey key2 = Registry.CurrentUser.OpenSubKey(@"Software\Dasain.com\CodeKeeper.NET", true);
                  string str = encryption.Encrypt(this..Text, "zse3432WERtgyh87opDDertyuMKioiirq24D5bnA");
                  key2.SetValue("Registration", str);
                  key2.Close();
            }
            catch
            {
            }
          }
      }
      else if (this..ValidateKey(this..Text))//ValidateKey通过方法判断用户输入的序列号是否有效!!!!
      {
          MessageBox.Show("Thank you for the registration!", "CodeKeeper .NET", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
          try
          {
            RegistryKey key4 = Registry.CurrentUser.OpenSubKey(@"Software\Dasain.com\CodeKeeper.NET", true);
            string text = this..Text;
            key4.SetValue("Registration", text);
            key4.Close();
          }
          catch
          {
          }
      }
      else
      {
          MessageBox.Show("The key you enter is INVALID!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
      }
}


双击下来到ValidateKey方法,发现在Dasain.Key.dll中。。。
public bool ValidateKey(string key)
{
      char[] chArray = new char;
      int num2 = 0;
      for (int i = 0; (i < key.Length) && (num2 < 0x18); i++)
      {
          char ch = key;
          if ((((ch >= '0') && (ch <= '9')) || ((ch >= 'a') && (ch <= 'z'))) || ((ch >= 'A') && (ch <= 'Z')))
          {
            chArray = key;
          }
      }
      for (int j = 0; j < chArray.Length; j++)
      {
          if ((chArray >= 'a') && (chArray <= 'z'))
          {
            chArray = (char) ((chArray + 'A') - 0x61);
          }
      }
      for (int k = 0; k < chArray.Length; k++)
      {
          if (chArray == 'I')
          {
            chArray = '1';
          }
          if (chArray == 'L')
          {
            chArray = '1';
          }
          if (chArray == 'O')
          {
            chArray = '0';
          }
          if (chArray == 'S')
          {
            chArray = '5';
          }
      }
      for (int m = 0; m < chArray.Length; m++)
      {
          char[] chArray2;
          int num6;
          if ((chArray >= '0') && (chArray <= '9'))
          {
            (chArray2 = chArray) = (char) (chArray2 - '0');
          }
          if ((chArray >= 'A') && (chArray <= 'H'))
          {
            (chArray2 = chArray) = (char) (chArray2 - '7');
          }
          if ((chArray >= 'J') && (chArray <= 'K'))
          {
            (chArray2 = chArray) = (char) (chArray2 - '8');
          }
          if ((chArray >= 'M') && (chArray <= 'N'))
          {
            (chArray2 = chArray) = (char) (chArray2 - '9');
          }
          if ((chArray >= 'P') && (chArray <= 'R'))
          {
            (chArray2 = chArray) = (char) (chArray2 - ':');
          }
          if ((chArray >= 'T') && (chArray <= 'Z'))
          {
            (chArray2 = chArray) = (char) (chArray2 - ';');
          }
      }
      long num7 = 0L;
      long num8 = 0L;
      long num9 = 1L;
      for (int n = 0; n < 12; n++)
      {
          num7 += chArray * num9;
          num9 *= 0x20L;
      }
      num9 = 1L;
      for (int num11 = 12; num11 < 0x18; num11++)
      {
          num8 += chArray * num9;
          num9 *= 0x20L;
      }
      num7 = (num7 ^ 0x89b01d3da4d55a9L) ^ this.;
      num8 = (num8 ^ 0x8bc9f8bd58b03d5L) ^ this.;
      long num12 = num7 & 0x3fffffffL;
      long num13 = (num7 & 0xfffffffc0000000L) >> 30;
      long num14 = num8 & 0x3fffffffL;
      long num15 = (num8 & 0xfffffffc0000000L) >> 30;
      return (((num12 == num13) && (num12 == num14)) && (num12 == num15));//返回一个布尔值。。爆破点。。。
}
有兴趣的朋友试试做个注册机吧~~!!
再看下程序哪里还用到了这个方法:
有两处:


现在开始来修改程序,只要ValidateKey方法返回的总是1就可以了:
就用个工具开改吧。。。
Simple Assembly Explorer打开程序

双击dasain.key.dll
386             L_0288:      bne.un.s      389 -> ldc.i4.0
387             L_028a:      ldc.i4.1      
388             L_028b:      ret      
389             L_028c:      ldc.i4.0      //右击EDIT改为ldc.i4.1保存退出
390             L_028d:      ret                              

试运行下。。发现强名称检验失败:

讲下强名称的去除方法:
手动来:
IDA载入dasain.key.dll到开始位置如下图:

这里就是强名称了。。。
用Hex Workshop打开搜索一下。。

用工具Strong Name Remove就更简单了就不说了。。
修改完后运行还是提示强名称检验失败。。。汗汗。。。dasain.key.dll强名称已经去除了。。。哪肯定就是主程序的事咯。
同样的方法去除CodeKeeper.NET.exe的强名称。。
之后用CFF打开:

这次就用工具试下吧:

好了。。。再来运行下。。哈哈。。可以了。。。


--------------------------------------------------------------------------------
【版权声明】: 本文原创于creantan, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年02月23日 22:39:58

Hmily 发表于 2009-2-26 16:22

NET.的文章很少,加精鼓励,欢迎多多发表!

lyliucn 发表于 2009-2-27 19:26

原帖由 Hmily 于 2009-2-26 16:22 发表 http://www.52pojie.cn/images/common/back.gif
NET.的文章很少,加精鼓励,欢迎多多发表!

确实是这样,net程序都不知道从哪里下手。

卿涩 发表于 2009-2-28 00:14

最近在学习,NET 虽然有很多地方不理解 不过先顶下

老万 发表于 2009-3-1 18:31

.net程序破解很少,值得学习。

a2006 发表于 2009-6-25 03:40

NET的资料太少了,根本无从下手.

A-new 发表于 2009-6-25 08:51

这么经典的为啥没人顶呢,下次楼主整个。net脱壳的撒

daydream 发表于 2009-8-20 09:58

好东西,楼主厉害{:299_838:}

dj007 发表于 2009-8-22 14:51

太强了,就这种编程语音OD相当难调试..这款工具不错...要多多学习下才行..

王者之剑 发表于 2009-10-12 01:28

加了混的就是麻烦,有时完全是猜的
页: [1] 2 3
查看完整版本: 【.NET】XXXXKeeper .NET v2.6破解分析