软件加密技术与解密技术
1目前常用的软件加密技术
1.1序列号方式保护技术
当用户从网上下载某个应用软件和共享软件后,一般都有诸多限制,比如使用天数的限制、有效使用期的限制、使用次数限制、功能限制,等等。当过了某个软件的使用期后,必须注册才能继续使用。
注册过程一般是把用户的私人信息(一般主要指名字)告诉给开发者,开发者会根据用户的信息计算出一个序列号,用户使用序列号按照必要的步骤在软件中输入注册信息和序列号,在经过软件对其合法性验证通过后,软件就会取消本身的各种限制。这种加密实现起来比较简单,不需要额外的成本,在互联网上的软件80%都是以这种方式保护的。
软件验证序列号的合法性的过程,其实就是验证用户名和序列号之间的换算关系是否正确的过程。其验证最基本的有两种方法,一种是按用户输入的姓名来生成序列号,再同用户输入的序列号相比较,公式表示如下:序列号=F(用户名)这种方法等于在用户软件中再现了开发者生成序列号的过程,实际上并不安全,解密者只要把你的换算过程从程序中提取出来就可以编制一个通用的注册程序。
另外一种是通过序列号来验证用户名的正确性,公式表示如下:用户名=F逆(序列号)这其实是序列号计算过程的反算法,如果正向算法与反向算法不是对称算法的话,对于解密者来说,的确有些困难,但这种算法相当不好设计。
1.2“警告”窗口保护技术
Nag窗口是软件设计者用来不时提醒用户购买正式版本的窗口。软件设计者可能认为当用户受不了试用版中的这些窗口时就会考虑购买正式版本。它可能会在程序启动或退出时弹出来,或者在软件运行的某个时刻随机或定时地弹出来。
1.3时间限制保护技术
一般使用这类保护的软件都有时间上的限制,如使用期30天,当过了共享软件的使用期后,就不予运行,只有向软件作者付费注册后才能得到一个无时间限制的注册版本。
这种保护方式的程序很多,安装时,在你的系统某处做上标记,比如将系统的安装时间存放在一个文件中,每次运行是用系统的当前时间和安装时间作比较,判断用户还能否使用。
1.4 Key File保护技术
Key File(注册文件)是一种利用文件来注册软件的保护方式。Key File一般是小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件,其内容是加密或未加密的数据,其中可能有用户名、注册码等信息。文件格式则由软件作者自已定义,试用版软件没有注册文件,当用户向作者付费注册后,会收到作者寄来的注册文件,其中可能包含用户的个人信息。用户只要将这些文件放入指定的目录,就可以让软件成为正式版。该文件一般是放在软件的安装目录或系统目录中。软件每次启动时,从该文件中读取数据,然后利用某种算法进行处理,根据处理结果判断是不是正确的注册文件,如果正确则以注册版模式来运行。
1.5功能限制技术
这种程序一般是DEMO版或菜单中部分选项是灰色。有些DEMO版本的部分功能里面根本就没有,而有些程序功能全有,只要注册后才正常。使用这些DEMO程序部分被禁止的功能时,会跳出提示框,说这是DEMO版等,它们一般都是调用MessageBox[A]或DialogBox[A]等函数。另外,就是菜单中部分选项是灰色的不能用,一般它们是通过EnableMenuItem和EnableWindow两种函数实现。
1.6 CD-check技术
这类保护多用于游戏软件,程序运行时要求将原版的光盘放在光驱中,然后输入光盘附带的CD Key,或者是程序直接检查光盘上的特殊数据(指纹等),由此来判断使用的是否是正版光盘。这种方法的主要原理是利用特殊的光盘母盘上的某此特征信息是不可再现软件导刊·2007·6月号的,而且这此特征信息大多是光盘上非数据性的内容,分布在光盘复制时复制不到的地方。大规模的生产这种加密方案的光盘可以将成本降的很低。而且软件和数据在同一载体上,对用户使用很方便。
2解密技术
2.1如何去除序列号保护重要的是要找到序列号,或者修改判断序列号之后的跳转指令。比较常用的方法是跟踪程序启动时对注册码的判断,利用各种工具定位判断序列号的代码段,通过跟踪输入注册码后的判断,从而截获注册码,或者跳过注册码的判断指令。
2.2如何去除“警告”窗口保护
去除警告窗口常用的方法有3种:修改程序的资源、静态分析和动态分析。利用资源修改工具可以将可执行文件中的警告窗口的属性改成透明或者不可见,这样就变相去除了警告窗口。如果利用静态或者动态跟踪调试分析的方法,只需找到创建此窗口的代码,设置断点,拦截系统消息,跳过“警告”窗口的指令代码行即可。
2.3如何去除时间限制保护
此类防护措施最为常见,例如最典型的30天限制的一种情况,用W32DASM将其原程序反汇编后的代码为:
mov ecx,IE;//把IE(30天十进制)放入ecx
mov eax,[esp+10];//把用过的天数放到eaXcmp eax,ecx;//在此比较用过的天数和30的大小关系
j1...//跳转到相应的代码继续执行
此时只需把“mov eax,[esp+10]”改成“mov eax,
2.4如何去除Key Fil保护
用Fi1emon等文件监视工具,实时监视系统各文件的状态。当日标程序运行时,如果它去读指定文件名的Key File,Filemon就会显示Key Fill文件名。一旦获取到了Key File的文件名,就可以建立一个假的Key File到要被破解软件目录下,目标软件即可被破解。
2.5如何去除功能限制保护
此功能一般是通过调IIMessageBox[A]或DialogBox[B]等函数来实现此功能的。所以可以用W32DASM反汇编目标程序,然后在代码中查找字符串:“Function NotAvaible in Demo”或“Command NotAvaible”或“Can't save in Shareware/De-mo”等,截获这此CALL调用,即可破解目标软件DEMO版的限制功能。
2.6如何去除CD-check限制保护
此功能一般是通过调用GetLogi-calDriveStrings()或GetLogicalDrives()得到系统中安装的所有驱动器的列表,然后再用GetDriveType)检查每一个驱动器,如果是光驱则用Crea teFi1eA()或FindFirst-Fi1eA()等函数检查特定的文件存在与否,并可能进一步地检查文件的属性、大小、内容等。所以只要利用上述函数设断点找到程序启动时检查光驱的地方,修改判断指令就可以跳过光盘检查。
3关于软件保护的建议
分析了加密技术和解密技术,程序员在设计自己的软件时最好遵循这些准则,这样可以提高软件的保护强度:
(1)一般不要用一目了然的名字来命名敏感函数和文件,如keyfile、liscenee等。
(2)程序中出现明文提示尽可能普遍化或加密,以免静态调试工具搜索到。
(3)少用一些众所周知的系统函数来进行操作,如获取时间等。
(4)注册算法最好有严格的数学根据,加强不可逆性,使之无法直接破解,采用比较成熟的密码学算法。
(5)注册码最好采用一机
(6)试用版最好与正式版分开封装,即试用版没有的功能只做按钮,而不放入相应的事件代码,使得编译的程序根本没有此项功能。
(7)采用keyfile方式尽可能将keyfile结构设计得复杂点,在程序中的不同地点对keyfile中不同部分进行检查。
(8)最好序列号算法不在程序中,多采用联网注册方式,并且数据传输时要加密。
(9)采用比较成熟的密码学算法:程序员最好自己设计一个加密算法,但算法不能过于简单,最好采用比较成熟的密码学算法,这些都可以在网上找到大量加密算法的源码。
4结束语
软件加密技术日益成熟,为保护公司、个人软件的版权作出了巨大的贡献。但是,软件加密技术带来的安全只是相对的、暂时的,随着解密技术的不断发展进步,一些软件加密算法的漏洞以及软件加密过程中自身和人为的脆弱性也逐渐暴露出来。软件加密技术目前并不是十全十美的,我们绝不能认为经过加密的软件就拥有了绝对的安全。