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;
 }


 

posted @ 2012-06-28 16:30  r3call  阅读(363)  评论(0编辑  收藏  举报