⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1230003.htm

📁 一种简单的软件加密方法
💻 HTM
字号:
<html><head>

<title>一种简单注册码加密的例子分析</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<link rel="stylesheet" href="1230003_files/style.css" type="text/css">
</head><body bgcolor="#ffffff" text="#000000">
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="26">
  <tbody><tr> 
    <td width="44%" height="11"><img src="1230003_files/vckbase.gif" width="133" height="14"></td>
    <td align="right" width="56%" height="11"><font size="2" face="Tahoma, Arial">VCKBASE 
      Online Help Journal No.12&nbsp;</font></td>
  </tr>
  <tr bgcolor="#cccccc"> 
    <td colspan="2" height="2"></td>
  </tr>
</tbody></table>
<span class="big">
<div align="center"><br>
  <b><font color="#009933">一种简单注册码加密的例子分析</font></b><br>
  作者:广东南海昭信公司 <a href="mailto:king_koo@163.net">king_koo</a><br>
  <br>
</div>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody><tr>
    <td><b><font color="#009900">前言:</font></b><br>
为了保护软件开发者的权益我们经常需要对软件进行加密限制,以防止未经许可的随意拷贝。另一方面我们也可能需要在自己的共享软件中提供注册码的功能。近期
笔者因为要对一软件进行加密限制,故对简单加密的方法做了一翻"研究"(找资料).下面我把我的方法写出来,希望对初学者有一定的帮助。<br>
      <br>
      <a href="http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/system_30/ZhuCeJi.zip">本文源代码一: 注册机源代码</a> 大小:10K<br>
      <a href="http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/system_30/JieMiJi.zip">本文源代码二: 解密机源代码</a> 大小:10K 
      <p><b><font color="#009900">1.目标</font></b><font color="#009900">:</font>做到一部机器只能装一个目标软件.程序拷给用户后,要求先注册,否则出现未注册消息.(注册方法见后面)</p>
      <p><b><font color="#009900">2.分析</font></b><font color="#009900">:</font>为每部机器分配一注册号,需要读机器的硬件信息.硬件信息可采用:</p>
      <p> a.读bios信息.用指针对bios操作,比较复杂.<br>
        b.读cpu系列号.简单api,仅2000适用.<br>
        c.读网卡id.用几个api.<br>
        d.读硬盘系列号.一个api,简单.</p>
      <p>我采用了读硬盘系列号的方法,简单(能骗老板就行了).注册后解密匙放哪里呢?ini文件?二进制文件?不行,不小心删掉就没了.注册表?太麻烦,不够绿色.把他放在可执行文件本身最方便了.可惜可执行文件<br>
        只能读本身,不能写自身(谁知道如何写请告诉我),故需另外做一个来写,写入解密匙后,每次可执行文件运行就读自身里的解密匙,由此判断有没有注册.</p>
      <p><b><font color="#009900">3.示例代码分析</font></b></p>
      <p> <font color="#009900">3.1 解密机部分</font> ( 作者用于初始化目标,生成解密匙)<br>
        <br>
        新建一对话框工程,加入两edit框,并为他们添加long型变量 m_gkh,m_jms.再加入按钮"解密匙",按钮"初始化目标",按钮"测试解密".<br>
        在OnInitDialog()加入下列代码:</p>
<pre>DWORD VolumeSerialNumber;
GetVolumeInformation("c:\\",NULL,12,&amp;VolumeSerialNumber,NULL,NULL,NULL,10);
VolumeSerialNumber^=0x12345678;//本机c盘序列号简单运算
m_gkh=VolumeSerialNumber;//本机顾客号.测试用
UpdateData(0);</pre>
      按钮"初始化目标"里添加代码:<br>
      (当然,这里加入的解密匙是你机的解密匙,别人拷去是没效的)<br>
<pre>//功能:初次使用时,在你要加密的文件play.exe末部加入解密匙.
DWORD num;
UpdateData(1);
num=m_jms;
num^=0x1999aa98;
if(num==m_gkh)
	MessageBox("ok");	//提示解密匙正确
CFile ff;
if(!ff.Open("play.exe",CFile::modeWrite))
	return;
CString str;
str.Format("%10d",m_jms);
MessageBox(str);
ff.SeekToEnd();
ff.Write(str,10);//添加到play.exe尾部
ff.Close();</pre>
      按钮"解密匙"里添加代码:

<pre>//功能:得到解密匙.
UpdateData(1);
long aa=m_gkh^0x1999aa98;
m_jms=aa;
UpdateData(0);</pre>
      按钮"测试解密"里添加代码:<br>
      
<pre>//在你要加密的文件play.exe末部改写解密匙.
DWORD num;
UpdateData(1);
num=m_jms;
num^=0x1999aa98;
if(num==m_gkh)
	MessageBox("ok");	//提示解密匙正确
CFile ff;
if(!ff.Open("play.exe",CFile::modeWrite))
	return;
CString str;
str.Format("%10d",m_jms);
MessageBox(str);
ff.Seek(-10,CFile::end);//改写解密匙
ff.Write(str,10);
ff.Close();</pre>
      <font color="#009900">3.2 注册机部分</font> ( 这部分供用户使用 )<br>
      <br>
      新建一对话框工程,加入两edit框,并为他们添加long型变量 m_gkh,m_jms.再加入按钮"解密",<br>
      在OnInitDialog()加入下列代码:
<pre>//生成顾客号	

DWORD VolumeSerialNumber;
GetVolumeInformation("c:\\",NULL,12,&amp;VolumeSerialNumber,NULL,NULL,NULL,10);
VolumeSerialNumber^=0x12345678;
m_gkh=VolumeSerialNumber;
UpdateData(0);</pre><br>
      按钮"解密"里添加代码:(和上边按钮"测试解密"里代码一样)<br>
<pre>//在你要加密的文件play.exe末部改写解密匙.
long num;
UpdateData(1);
num=m_jms;
num^=0x1999aa98;
if(num==m_gkh)
	MessageBox("ok");	//提示解密匙正确
CFile ff;
if(!ff.Open("play.exe",CFile::modeWrite))
	return;
CString str;
str.Format("%10d",m_jms);
MessageBox(str);
ff.Seek(-10,CFile::end);
ff.Write(str,10);//改写解密匙
ff.Close();</pre>
      <font color="#009900">3.3 被加密的程序(本例为play.exe)里添加代码</font>:<br>
      <br>
      在OnInitDialog()里加入:
<pre>CFile ff;
if(!ff.Open("play.exe",CFile::modeRead|CFile::shareDenyNone))
	return 1;
ff.Seek(-10,CFile::end);
char lp[10];
ff.Read(lp,10);//读解密匙
ff.Close();
DWORD num=atol(lp);
num^=0x1999aa98;
num^=0x12345678;//解密演算,还原为c盘序列号
DWORD VolumeSerialNumber;
GetVolumeInformation("c:\\",NULL,12,&amp;VolumeSerialNumber,NULL,NULL,NULL,10);
if(num!=VolumeSerialNumber)MessageBox("未注册:(");	
</pre>
      <b><font color="#009900">4.使用方法:</font></b><br>
      <br>
      你把要加密的可执行文件加入3.3所诉的代码,编译后改为"play.exe",放到解密机exe同一目录下,运行解密机,按"初始化目标"按钮.这样你就可以把play.exe连同注册机exe一同送给客户了.<br>
      <br>
      客户拿到后直接运行play.exe会出现未注册消息(你也可以加代码使产生其他效果).他想注册的话,要与作者联系(留下Email等),运行注册机exe,然后把生成的顾客号返回给作者. 
      <p>作者认同的话,就可运行私藏的解密机exe,输入他的顾客号,按"解密匙"按钮,把解密匙返回用户.用户把"解密匙"输入注册机exe,按"解密"按钮.就完成注册了!(注:注册机与play.exe要同一目录下)</p>
      <p> </p>
      <p><font color="#009900"><b>5.注:</b></font>很多容错处理已省略或简化,应用时,请读者自行加上.</p>
      <p></p>
      <p>作者信息:<br>
        广东南海昭信公司 king_koo<br>
        EMail:king_koo@163.net</p>
      <p></p>
    </td>
  </tr>
</tbody></table></span>
<br>
<hr color="#cccccc" size="1" noshade="noshade">
<div align="center"><font size="2" face="Tahoma, Arial">&#169;1997-2001 VCKBASE.COM 
  All Rights Reserved.</font></div>
<iframe src="1230003_files/docbbs.htm" style="height: 400px; visibility: inherit; width: 100%; z-index: 2;" scrolling="auto" frameborder="0"></iframe></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -