《软件加密与解密》第三版学习日志二

一 常见软件保护技术


1.序列保护方式
注册过程一般是用户把自己的私人信息,如用户名、邮件地址、及其特征码等,告诉软件公司,软件公司根据用户的信息利用预先写好的一个计算注册程序,称为注册机keygen,算出一个序列号后发给用户,用户得到序列号后,按照注册需要的步骤在软件中输入注册信息和注册码,其注册信息的合法性由软件验证通过后,软件就会取消各种限制,如时间限制、功能限制等而成为完全正式版本。

软件验证序列号的过程,其实就是验证用户名和序列号之间的数学映射关系,这个映射关系是由软件设计者制定,所以各个软件生成序列号算法是不同的。
2.警告Nag窗口
nag的本义是烦人的意思。Nag窗口是软件设计者用来不时提醒用户购买正式版本的窗口。去掉警告窗口常用的3种方法:修改程序的资源、静态分析和动态分析。若要完全去除警告窗口,只需找到创建此窗口的代码。
3.时间限制
时间限制有两类:一类是每次运行多少时间;另一类是每次运行时间不限,但是有个时间段限制,如试用期;
4.菜单功能限制
受限制的软件,其菜单或窗口中部分选项是灰色,无法使用。
5.KeyFile保护
KeyFile是一种利用文件来注册软件的保护方式。KeyFile一般是一个小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件。其内容是一些加密过或未加密的数据,其中可能有用户名、注册码等信息,文件格式则由软件作者自己定义。用户只要将该文件放入指定的目录,就可以让软件成为正式版。该文件一般放在软件的安装目录中或系统目录下,软件每次启动时,从该文件中读取数据,然后利用某种算法进行处理,根据处理的结果判断是否为正确的注册文件。
6.网络验证
网络验证是目前流行的一种保护技术,其优点是可以将一些关键数据放到服务器上,软件运行时,必须从服务器取得这些数据才能正确运行。拆解的思路是拦截服务器返回的数据包,分析程序是如何处理数据包的。
7.CD-Check
  一些采用光盘形式发行的应用软件或游戏在使用时需要检查光盘是否插在光驱中,如果没有则拒绝运行。这是为了防止用户将软件或游戏的一份正版拷贝安装在多台机器上并同时使用。
 
二保密算法


  1.单向散列算法
    单向散列算法也称Hash(哈希)算法,是一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(该过程不可逆)。Hash函数可用于数字签名、消息的完整性检测、消息起源的认证检测等。常见的散列算法由MD5、SHA、RIPE-MD、HAVAL、N-Hash等。
    在软件的加密保护中,Hash函数是经常用到的加密算法。但是,由于Hash函数为不可逆算法,所以软件只能使用Hash函数作为一个假面的中间步骤。例如,对用户名做一个Hash变换,将这个结果再进行一个可逆的加密变换(如对称密码),变换结果为注册码。从解密角度来说,一般不必了解Hash函数的具体内容(变种算法除外),只要能识别出是何种Hash函数就可以了,然后直接套用相关算法源码实现。
    软件保护人员在使用散列算法进行保护时,建议选择SHA-256/384/512,或者使用Whirlpool。如果在解密时碰到Hash算法,一般只要根据每种Hash算法的特征搞清楚是哪一种Hash算法以及该算法是否变形,继而通过该Hash的源代码即可作出注册机。
  2.对称加密算法
    对称加密算法的加密密钥和解密密钥是完全相同的。其安全性依赖于以下两个因素:第一,加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践是不可能的,可以抵抗现有的各种密码分析方法的攻击;第二,加密安全性依赖于密钥的秘密性,而不是算法的保密性。若要采用对称算法检验注册码,正确的使用方法是把用户输入的注册码(或者注册码的一部分,注册的散列值)作为加密算法或者解密算法的密钥。这样,解密者要找到一个正确的注册码,只能采用穷举法。

       为了增大穷举的难度,自然要求注册码由一定的位置。如果在检查注册码时,把用户输入的注册码作为算法的输入或者输出,则无论使用加密算法还是解密算法检查注册码,解密者都可利用调试器在内存中找到所用的密钥,从而可以将算法求逆,写出注册机来。常见的对称分组加密算法由DES(Data Encryption Standard)、IDEA(International DataEncryption Algorithm)、AES(Advanced Encryption Standard)、BlosFish、Twofish、流密码RC4等。如果软件中使用了对称加密算法,那么一般来说,只要知道了算法的类型及密钥,那么就可以做出注册机来。可以用如下方法识别软件中所使用的对称加密算法。
    1)使用PEiD的Kcrypto ANALyzer(Kanal)插件进行识别,一般的对称加密算法都可以识别出来,但也有例外(如IEDA)。需要注意的是,不能依赖于工具。使用工具只是一种辅助,还需要进一步的跟踪以确定到底是何种算法。
    2)通过每种加密算法的独特的加解密处理过程,如是否为Feistel网络,加密轮数,密钥长度,子密钥生成过程,S-box的值等一系列信息区分和确定软件中所使用的算法。
    3)为了进一步确定是否为某种对称加密算法,以及此种算法采用何种工作模式(ECB\CBC\CFB\CTR等) 往往还需要自己写一个此种算法的加解密程序来和软件中的算法进行对比检验。
  3.公开密钥加密算法
    公钥算法加密和解密使用不同的密钥,加密所使用的叫做公钥,而解密所使用的叫做私钥,故而公钥加密算法又称为非对称加密算法(Asymmetric Key Cryptography)。任何人可以都可以使用密钥分配者所分发的公钥对信息进行加密,而只有私钥者的所有者才可以解密。公开密钥的设计是基于NP完全问题。如果软件作者在生成注册码时采用界面算法(私钥),而在软件中检查注册码时使用加密算法(公钥),即使解密者能够用调试器在自己的机器上对软件进行跟踪分析从而找到公钥,他也不一定能够计算出私钥,自然也就无法得到争取的注册码,更无法写出注册机来。
    常见算法有:RSA算法、ELGamal公钥算法、DSA数字签名算法。
  4.其他算法
    除以上算法,平时还接触的由CRC32算法、Base64编码等算法。
    1)CRC全称Cyclic Redundancy Checksum或者Cyclic Redundancy Check,是对数据的校验值,中文名师循环冗余校验码,常用于检验数据的完整性。最常见的CRC是CRC32,即数据校验值为32位;
    2)Base64编码是将二进制数据编码为可显示的字母和数字,用于传送图形、声音和传真 等非文本数据。常用于MIME电子邮件格式中。其使用含有65个自己的ASCII字符集(第65个字符为=,用于对字符串的特殊处理过程),并用6个进制位表示一个可显示字符。
   5.常见的加密库接口及其识别
     程序员在自己的程序中实现加密算法时,往往需要借助于一些加密算法库来实现。逆向分析时必须 能识别出常见的加密算法库,识别加密算法库,最直接也是最精确的方法,便是掌握算法库的使用方法,另外,也可以使用IDA的Flair工具制作出算法库的signature。
    1)Miracl大数运算库
     Miracl全称为Multiprecision Integer and Rational Arithmetic C/C++ Library,即多精度整数和有理数算术运算C/C++库。它是一个大数库,实现了设计使用大数的加密技术的 最基本的函数。支持RSA公钥系统、Diffie-Hellman密钥交换、DSA数字签名系统及基于GF(p)和GF(2M)的椭圆曲线加密系统。Miracl提供了C和C++两种接口,而且使用起来方便,且 是开源的。
     官方网站是
www.shamus.ie,下载后,参考readme.txt将其安装。
    2)FGInt
     FGInt为Fast Gigantic Integers,是用于Delphi的一种常见公钥加密系统的库。官方网站
www.submanifold.be
    3)其他加密算法库
     freeLIP、Crypto++、LibTomCrypt、GMP、OpenSSL、DCP和DEC、Mcirosoft Crypto API、NTL等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值