breezer 发表于 2012-4-30 16:08

吾爱破解2012CM大赛破文-LineZero

本帖最后由 Peace 于 2012-4-30 16:13 编辑

【文章标题】:吾爱破解2012CM大赛破文 - LineZero .NET Crackme 之人肉注册机
【文章作者】: breezer
【软件名称】: linezero.exe
【难       度】: 易

这个 CrackMe 是 .NET 写的,很容易看到源代码,那么我们就来看一下算法吧:
程序载入会先判断是否存在一个 52.key 文件,源代码如下:
if (File.Exists("52.key"))
    {
      FileStream stream = new FileStream("52.key", FileMode.Open, FileAccess.Read);
      StreamReader reader = new StreamReader(stream);
      string s = reader.ReadToEnd();
      byte[] bytes = Encoding.Default.GetBytes(s);                                           //52.key 取字节
      byte[] buffer2 = Encoding.Default.GetBytes("520.1234");                        //密码表 520.1314 取字节
      reader.Close();
      stream.Close();
      if ((bytes == buffer2) && (bytes == buffer2))                         //这里比较Key的内容
      {
            this.btnOk.Enabled = true;                                                                  //Keyfile 正确才激活 OK 按钮
      }
    }
可以看出,52.key 的内容需要与密码表 520.1234 对比,需要让密钥文件的第5位==密码表的第4位,第3位==密码表的第7位,这样我们手动来构造 52.key 文件如下:
1234.5
有了这个文件,OK按钮才激活。
下面我们来看OK按钮的代码,也就是计算注册码的地方:
string str = this.txtUserName.Text.Trim();
    string str2 = this.txtPass.Text.Trim();
    if (((str != "") || (str.Length >= 8)) || (str2 != ""))                                 //注册码和用户名不能为空,用户名>=8位
    {
      string s = str.Substring(1, 4);                                                                  //取用户名 2-5 位
      string str4 = str.Substring(6, 1);                                                            //取用户名第7位
      byte[] bytes = Encoding.Default.GetBytes(str4);                                     //第7位转换为字节
      byte[] buffer2 = Encoding.Default.GetBytes(s);                                       // 用户名 2-5 位转换为字节
      string str5 = "";
      for (int i = 0; i < buffer2.Length; i++)
      {
            str5 = str5 + buffer2;
      }
      if (string.Concat(new object[] { str5, s, str4, bytes }) == str2)            //可以在这里爆破,brfalse 改 brtrue
      {
            MessageBox.Show("成功了么?其实很简单。。。继续努力,加油!");
      }
    }
这里我们看到用户名必须>=8位,我们手工来构造个用户名:12345678
s = 2345 //用户名 2-5 位
str4 = 7//用户名第7位
bytes = 55 //第7位转换为字节, 7的十六进制是37,换成十进制就是 55
str5 = 50515253    //str5就是把buffer2数组中的字符串连起来,2345的十六进制是32333435,换成十进制是50515253

注册码 str2 = str5 + s + str4 + bytes = 505152532345755

来看个图片:



小咪咪 发表于 2012-4-30 16:10

SF拿了 膜拜大大net对于我太高深

小明无敌 发表于 2012-4-30 16:13

继续膜拜
怎么破解的。看不懂         

爱你 发表于 2012-4-30 16:22

继续膜拜
怎么破解的。看不懂         呵呵!

LineZero 发表于 2012-5-1 20:33

膜拜大大……{:1_931:}
希望能多多交流。

uiuizz 发表于 2013-2-23 09:46

膜拜大大…

小雨细无声 发表于 2013-3-5 19:08

要努力学习,谢谢大牛提供详细分析。

cl4993106 发表于 2013-3-5 19:09

这个要大牛来了
页: [1]
查看完整版本: 吾爱破解2012CM大赛破文-LineZero