本帖最后由 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[4] == buffer2[3]) && (bytes[2] == buffer2[6])) //这里比较Key的内容
{
this.btnOk.Enabled = true; //Keyfile 正确才激活 OK 按钮
}
}
可以看出,52.key 的内容需要与密码表 520.1234 对比,需要让密钥文件的第5位==密码表的第4位,第3位==密码表的第7位,这样我们手动来构造 52.key 文件如下:
有了这个文件,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[i];
}
if (string.Concat(new object[] { str5, s, str4, bytes[0] }) == str2) //可以在这里爆破,brfalse 改 brtrue
{
MessageBox.Show("成功了么?其实很简单。。。继续努力,加油!");
}
}
这里我们看到用户名必须>=8位,我们手工来构造个用户名:12345678
s = 2345 //用户名 2-5 位
str4 = 7 //用户名第7位
bytes[0] = 55 //第7位转换为字节, 7的十六进制是37,换成十进制就是 55
str5 = 50515253 //str5就是把buffer2数组中的字符串连起来,2345的十六进制是32333435,换成十进制是50515253
注册码 str2 = str5 + s + str4 + bytes[0] = 505152532345755
来看个图片:
|