`

一种简单注册码加密的例子分

    博客分类:
  • VC
阅读更多

一种简单注册码加密的例子分析
作者:广东南海昭信公司 king_koo

前言:
为了保护软件开发者的权益我们经常需要对软件进行加密限制,以防止未经许可的随意拷贝。另一方面我们也可能需要在自己的共享软件中提供注册码的功能。近期笔者因为要对一软件进行加密限制,故对简单加密的方法做了一翻"研究"(找资料).下面我把我的方法写出来,希望对初学者有一定的帮助。

本文源代码一: 注册机源代码 大小:10K
本文源代码二: 解密机源代码 大小:10K

1.目标:做到一部机器只能装一个目标软件.程序拷给用户后,要求先注册,否则出现未注册消息.(注册方法见后面)

2.分析:为每部机器分配一注册号,需要读机器的硬件信息.硬件信息可采用:

a.读bios信息.用指针对bios操作,比较复杂.
b.读cpu系列号.简单api,仅2000适用.
c.读网卡id.用几个api.
d.读硬盘系列号.一个api,简单.

我采用了读硬盘系列号的方法,简单(能骗老板就行了).注册后解密匙放哪里呢?ini文件?二进制文件?不行,不小心删掉就没了.注册表?太麻烦,不够绿色.把他放在可执行文件本身最方便了.可惜可执行文件
只能读本身,不能写自身(谁知道如何写请告诉我),故需另外做一个来写,写入解密匙后,每次可执行文件运行就读自身里的解密匙,由此判断有没有注册.

3.示例代码分析

3.1 解密机部分 ( 作者用于初始化目标,生成解密匙)

新建一对话框工程,加入两edit框,并为他们添加long型变量 m_gkh,m_jms.再加入按钮"解密匙",按钮"初始化目标",按钮"测试解密".
在OnInitDialog()加入下列代码:

DWORD VolumeSerialNumber;
GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,NULL,NULL,10);
VolumeSerialNumber^=0x12345678;//本机c盘序列号简单运算
m_gkh=VolumeSerialNumber;//本机顾客号.测试用
UpdateData(0);
按钮"初始化目标"里添加代码:
(当然,这里加入的解密匙是你机的解密匙,别人拷去是没效的)
//功能:初次使用时,在你要加密的文件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();
按钮"解密匙"里添加代码:
//功能:得到解密匙.
UpdateData(1);
long aa=m_gkh^0x1999aa98;
m_jms=aa;
UpdateData(0);
按钮"测试解密"里添加代码:
//在你要加密的文件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();
3.2 注册机部分 ( 这部分供用户使用 )

新建一对话框工程,加入两edit框,并为他们添加long型变量 m_gkh,m_jms.再加入按钮"解密",
在OnInitDialog()加入下列代码:
//生成顾客号	

DWORD VolumeSerialNumber;
GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,NULL,NULL,10);
VolumeSerialNumber^=0x12345678;
m_gkh=VolumeSerialNumber;
UpdateData(0);

按钮"解密"里添加代码:(和上边按钮"测试解密"里代码一样)
//在你要加密的文件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();
3.3 被加密的程序(本例为play.exe)里添加代码:

在OnInitDialog()里加入:
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,&VolumeSerialNumber,NULL,NULL,NULL,10);
if(num!=VolumeSerialNumber)MessageBox("未注册:(");	
4.使用方法:

你把要加密的可执行文件加入3.3所诉的代码,编译后改为"play.exe",放到解密机exe同一目录下,运行解密机,按"初始化目标"按钮.这样你就可以把play.exe连同注册机exe一同送给客户了.

客户拿到后直接运行play.exe会出现未注册消息(你也可以加代码使产生其他效果).他想注册的话,要与作者联系(留下Email等),运行注册机exe,然后把生成的顾客号返回给作者.

作者认同的话,就可运行私藏的解密机exe,输入他的顾客号,按"解密匙"按钮,把解密匙返回用户.用户把"解密匙"输入注册机exe,按"解密"按钮.就完成注册了!(注:注册机与play.exe要同一目录下)

 

5.注:很多容错处理已省略或简化,应用时,请读者自行加上.

 

作者信息:
广东南海昭信公司 king_koo
EMail:king_koo@163.net

 


分享到:
评论

相关推荐

    一种简单注册码加密的例子归类.pdf

    本文主要介绍了一种简单的注册码加密方法,适用于保护软件开发者权益,防止未经授权的软件随意拷贝。该方法的核心是利用机器的硬件信息(如硬盘序列号)生成唯一的注册码,并将解密钥匙嵌入到可执行文件本身,使得每...

    一种简单注册码加密的例子

    为了保护软件开发者的权益我们经常需要对软件进行加密限制,以防止未经许可的随意拷贝

    MD5加密例子

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由计算机科学家Ronald Rivest在1991年设计。它将任意长度的数据转化为一个固定长度的128位(16字节)的摘要,通常用32个十六进制数字表示。这个过程是...

    使用RSA进行注册码验证的例子

    总的来说,通过RSA进行注册码验证是一种常见的软件授权策略,它利用了非对称加密的安全性,确保了软件的正版化,并保护了开发者的利益。在实际应用中,还会结合其他安全措施,如哈希函数、数字签名等,以增强系统...

    易语言简单注册码生成源码

    易语言是一种专为中国人设计的编程语言,它的目标是让编程变得简单、直观。这个压缩包文件中的"易语言简单注册码生成源码"是一个易语言编写的代码示例,用于教学或实践如何生成软件注册码。在软件授权管理中,注册码...

    c# ras 加密解密 代码例子

    RAS是一种常用的公钥加密算法,广泛应用于数据传输、数字签名等领域。本篇文章将深入探讨C#中如何实现RAS加密和解密,并通过一个WinForm应用实例——RasWinFormDemo来具体阐述。 首先,我们需要理解RAS的基本原理。...

    folder-lock6 注册码

    注册码是软件开发商为了验证用户是否已购买了正式版本而提供的一种授权方式。在本例中,“Folder Lock 6”的注册码包含了两部分信息:序列号(Serial Number)和注册号(Register Number)。 #### 序列号 (Serial ...

    RsaCrypto 数据库用户密码加密

    RSA是一种非对称加密算法,它使用一对密钥,一个用于加密,另一个用于解密,增强了数据的安全性。在数据库场景下,密码通常以明文存储是不安全的,因此采用加密技术对用户密码进行处理,可以防止数据泄露。 描述中...

    使用密码和salt值联合密码加密实现登录注册功能

    以下是一个简单的例子: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public String encryptPassword(String password, String salt) { try { MessageDigest ...

    GE的PLC软件注册码

    1. **授权验证**:软件注册码是软件开发商为了保护知识产权、防止非法复制与使用而采取的一种措施。通过输入正确的注册码,可以激活软件的全部功能,确保用户合法使用。 2. **功能解锁**:对于某些版本的软件,注册...

    ASP使用MD5加密Password取19字符例子

    ASP(Active Server Pages)是一种经典的服务器端脚本语言,常用于构建动态网页。在这个例子中,我们关注的是如何使用MD5加密来处理用户的密码,以提高安全性。MD5(Message-Digest Algorithm 5)是一种广泛使用的...

    pl sql 注册码8.0.txt

    在IT行业中,软件注册码通常用于验证用户是否拥有合法使用权的一种手段。下面将详细介绍与该文档相关的知识点。 ### 一、PL/SQL Developer简介 PL/SQL Developer是一款专为Oracle数据库设计的强大开发工具,它支持...

    C#加密、安全与软件注册+源码(9例)

    数字签名是利用非对称加密技术实现的一种验证机制,可以保证数据的完整性和来源的不可否认性。例如,`Ex16_01`可能是关于如何使用C#创建和验证数字签名的实例。 3. **哈希函数** 哈希函数能够将任意长度的数据...

    PHP数字自定义加密与解密

    加密是一种将原始数据(明文)转换为不可读形式(密文)的过程,以保护数据不被未经授权的人员访问。解密则是加密的逆过程,将密文恢复为原始的明文。在PHP中,常用的加密算法有MD5、SHA-1、AES等。 1. **MD5**:...

    注册新用户例子(C#源代码)

    1. **C#基础**:C#是一种面向对象的编程语言,由微软公司开发,广泛用于Windows应用、Web应用以及游戏开发等。VS2008是其配套的集成开发环境(IDE),提供代码编辑、调试和部署等一站式开发服务。 2. **用户注册...

    SQLite ODbc 支持加密

    SQLite ODBC(Open Database Connectivity)驱动程序是一种允许应用程序通过ODBC接口与SQLite数据库进行交互的工具。在IT领域,SQLite是一种轻量级、开源的嵌入式SQL数据库引擎,广泛应用于移动设备、桌面应用和...

    asp.net随机密码产生例子程序

    ASP.NET是一种广泛使用的开源Web应用程序框架,由微软开发,用于构建功能丰富的动态网站、Web应用程序和服务。在这个"asp.net随机密码产生例子程序"中,我们可以深入探讨如何在.NET环境中生成安全且随机的密码。 ...

    iphone开发用户密码界面例子

    一种常见方法是使用UserDefaults,它允许我们将简单的键值对存储在设备上。在用户登录后,可以将他们的登录状态保存在UserDefaults中,下次启动应用时,检查这个状态以决定是否直接登录。 最后,不要忘记处理可能...

    PLSQL注册码

    注册码通常指软件开发商为了保护其知识产权、防止未经授权的复制和分发而采用的一种加密方式。它包含了软件激活所需的所有必要信息,例如产品代码、序列号以及密码等。用户在安装软件后,需要输入正确的注册码才能...

Global site tag (gtag.js) - Google Analytics