一 常见软件保护技术

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等。

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

  1. Js高级程序设计第三版学习(十二章)

                                  Js高级程序设计第三版学习(十二章) 第十二章 DOM2和DOM3   1.样式: 访问样式属性 任何支持style特性的HTML元素都有一 ...

  2. 《软件加密与解密》第三版学习日志一

    一 动态分析技术 动态分析技术中最重要的工具是调试器,分为用户模式和内核模式两种类型.用户模式调试器是指用来调试用户模式应用程序的调试器,他们工作在Ring 3级,如OllyDbg.Visual C+ ...

  3. 加密与解密第三版光盘ISO资料

    链接: https://pan.baidu.com/s/1lgOU4JXv35f1x4utAQYiGA 提取码: ri52

  4. Java加密与解密笔记(三) 非对称加密

    非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...

  5. 汇编语言(十):软件加密与解密

    作为汇编语言的课程笔记,方便之后的复习与查阅 本篇为课程第十二次课内容 目录 基础知识 一些重要的汇编指令 静态分析 示例:利用静态分析破解 `CRACKME.EXE` 动态分析 基本 API 函数 ...

  6. Base64加密与解密的三种方法

    前言: 加密与解密一直是程序猿经常需要面对的东东,下面了解一下常见的base64的三种加密与解密的方法. public static final String str="zhangtao&q ...

  7. java虚拟机第三版学习

    java 编译执行流程 Java 源文件->编译器->字节码文件->JVM->机器码 Java 内存区域与内存溢出异常 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存 ...

  8. 软件测试方法与技术第三版课后答案完整版,软件测试方法与技术朱少民第三章答案部分答案.docx...

    软件测试方法与技术朱少民第三章答案部分答案 3.综合应用边界值和等价类划分方法设计相应的测试用例,包括尽可能多的无效等价类:输入三个参数作为边,分别满足一般三角形,等腰三角形和等边三角形.答:边边边输 ...

  9. Linux命令行与shell脚本编程大全第三版 学习笔记

    Linux自己的文件资料: /usr/share/doc (在你的Linux系统中) https://www.osyunwei.com/archives/290.html 0. 注意Linux中一切皆 ...

最新文章

  1. Linux常用命令--网终设置
  2. squid+iptables实现透明代理
  3. 开发日记-20190925 关键词 试错的一天
  4. Windows Mobile访问SQL Server CE 3.5(2)
  5. linux如何分析系统的堆栈,Linux内核分析:操作系统是如何工作的?
  6. 百度笔试题,malloc/free与new/delete的区别与联系
  7. 从入门到深入Fiddler 2 (二)
  8. c++中使用libxml2读取xml文件【转】
  9. matlab检测串口数据帧头,用matlab从串口读入数据产生图像进行分析遇到的问题,求大虾帮助!...
  10. 分享一个在线的HTML5元素在线测验 : HTML5 Element Quiz
  11. php session 自定义的设置测试
  12. express不是内部或外部命令的解决方法
  13. 异速联虚拟打印出来格式不对,如何处理
  14. git gitlan 切糕入门
  15. 《Loy解说Hystrix》
  16. php x63 157 162,浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解
  17. 实验记录 | 6/29
  18. 数字孪生系统:智慧城市数据可视化
  19. python中numpy数组形状和计算
  20. R语言C指数,如何在R软件中求一致性指数( Harrell concordance index:C-index)?

热门文章

  1. 一周一论文(翻译 总结)— [Eursys 17] RFP When RPC is Faster than Server-Bypass with RDMA
  2. python 输出字符串编码_Python print 字符串编码问题
  3. python不换行_Python print 输出时不换行
  4. NTP客户端通过脚本一键配置
  5. Mysql-安装指南
  6. C#中volatile的用法
  7. 2016/3/10 PHP (超文本预处理器) 是什么?
  8. 搭建本地LNMP开发环境(1)-VMware内安装debian
  9. Java-protected的使用范围
  10. 服务机器人---方案设计中需要评估确认的点