CoolChm 注册机的编写
【最近想试试CoolChm,可惜貌似没有破解版的,但是看到有关于注册算法的分析,就保留一个看看,随带看看能不能写出注册机。。。】
=========================我自己写的代码=======================
以下代码在虚拟机中测试成功,但实机没有成功,我就不管了,反正我也只是在虚拟机中用CoolChm,如果谁有兴趣,自己写一个。
void CCoolChmDlg::OnButtonGetkey() { //获取机器码 char m_Volume[256];//卷标名 char m_FileSysName[256]; DWORD m_SerialNum;//序列号 DWORD m_FileNameLength; DWORD m_FileSysFlag; ::GetVolumeInformation("c:\\", m_Volume, 256, &m_SerialNum, &m_FileNameLength, &m_FileSysFlag, m_FileSysName, 256); CString Serial; Serial.Format("%d",m_SerialNum^ 0x97648123); SetDlgItemText(IDC_EDIT_KEY,Serial); }
=========================我自己写的代码=======================
下面是别的地方COPY过来的。
==========================================================================
原理:将你电脑的C盘卷标和十六进制数97648123(此数是一位解密高手得出)进行异或运算,结果转化成十进制数,此数即是注册码!!
步骤1:得C盘卷标:依次点击 “开始--所有程序--附件--命令提示符”,输入dir c:(注意dir和c间有一个空格)第二行中有类似xxxx-xxxx的即是,在记事本里抄下它。
步骤2:转化二进制:按下表将卷标和97648123都转化成二进制数。
0001,1 0010,2 0011,3 0100,4 0101,5 0110,6 0111,7
1000,8 1001,9 1010,a 1011,b 1100,c 1101,d 1110,e 1111,f
步骤3:异或运算:将两个二进制数的相同数位比较,相同的(同为1或0)得1,不同的得零。
步骤4:转化十进制:依次点击 “开始--所有程序--附件--计算器”,再计算器中点“查看”选取“科学型”,选取“二进制”,输入刚才你得到的二进制数,然后选取十进制,此时的数字就是密码!!@_@
例如:C盘卷标为9812db24则二进制数为1001 1000 0001 0010 1101 1011 0010 0100,
97648123二进制数为1001 0111 0110 0100 1000 0001 0010 0011照下面写:
1001 1000 0001 0010 1101 1011 0010 0100
1001 0111 0110 0100 1000 0001 0010 0011
则
0000 1111 0111 0110 0101 1010 0000 0111
密码为259414535
步骤1:输入dir c:(注意dir和c间有一个空格)第二行中有类似XXXX-XXXX的即是,记入记事本步骤2:异或运算,打开计算器,再计算器中点“查看”选取“科学型”,选取“十六进制”,输入记事本里的XXXXXXXX,然后点XOR,输入97648123,按“=”此时的数字为十六进制数,再点"十进制”得数字就是密码
下面还有别人写的C#的代码。
private void button1_Click(object sender, EventArgs e)
{
try
{
//获取C盘序列号
ManagementObject m_objDisk = new ManagementObject("win32_logicaldisk.deviceid='c:'");
string strSN = (string)m_objDisk.GetPropertyValue("VolumeSerialNumber");
//label2.Text = strSN;
//异或的代码
char[] YHCode = "97648123".ToCharArray();
string YHCodeResult = string.Empty;
foreach (char c in YHCode)
{
string s1 = Convert.ToString(Convert.ToInt32(c.ToString()), 2);
switch (s1.Trim().Length)
{
case 1:
s1 = "000" + s1;
break;
case 2:
s1 = "00" + s1;
break;
case 3:
s1 = "0" + s1;
break;
}
YHCodeResult += s1;
}
string Code16 = YHCodeResult;
//机器C盘的序列号
string MCCode = string.Empty;
char[] MachineCode = strSN.ToCharArray();
foreach (char c in MachineCode)
{
string s1 = Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2);
switch (s1.Trim().Length)
{
case 1:
s1 = "000" + s1;
break;
case 2:
s1 = "00" + s1;
break;
case 3:
s1 = "0" + s1;
break;
}
MCCode += s1;
}
textBox1.Text = Convert.ToUInt32(ReturnXorValue(Code16, MCCode), 2).ToString();
}
catch(Exception ex)
{
MessageBox.Show("程序出错:" + ex.Message, "提示信息", MessageBoxButtons.OK);
}
}
string ReturnXorValue(string str1, string str2)
{
string ret = string.Empty;
string tempstr=string.Empty;
byte[] b1 = System.Text.Encoding.Default.GetBytes(str1);
byte[] b2 = System.Text.Encoding.Default.GetBytes(str2);
if (b1.Length != b2.Length) throw new ArgumentException("获取参数出错");
else
{
for (int i = 0; i < b1.Length; i++)
{
tempstr = (b1[i] ^ b2[i]).ToString();
ret += tempstr;
}
}
return ret;
}