黑客攻防从入门到精通(加密与解密篇)
上QQ阅读APP看书,第一时间看更新

1.3 加密技术中的相关概念

学习加密技术的过程中涉及一些常用概念,用户只有理解这些概念的内涵才能进一步学习。下面就详细介绍一下在加密过程中经常涉及的几个概念。

1.断点

所谓断点是指程序被中断执行的地方。程序产生中断就是由于有特殊事件发生,计算机暂停当前的程序运行,转而去执行别的程序,当执行完毕后再返回执行被中断的程序。

解密的过程就是当程序去获取输入的注册码,并准备和正确的注册码相比较时将其中断,通过分析找到正确的注册码。这就需要为被解密的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,达到破解的目的。

2.领空

所谓程序的领空,其实就是程序自己的地方,也就是要破解程序的程序码所处的位置。在DOS时代,基本上所有的程序都是工作在中断程序之上的,即几乎所有的DOS程序都会去调用各种中断来完成任务。

但到了Windows时代,程序没有权力直接调用中断,Windows系统提供了一个系统功能调用平台(API),就像DOS程序以中断程序为基础一样,Windows程序以API为基础来和系统打交道,从而实现各种功能,所以Windows下的软件破解其断点设置是以API函数为基础的,即当程序调用某个API函数时中断其正常运行,然后进行解密。

API(Application Programming Interface,应用程序编程接口)是一个系统定义函数的大集合,它提供了访问操作系统特征的方法。

API包含了几百个应用程序调用的函数,这些函数执行所有与操作系统相关的操作,如内存分配、向屏幕输出和创建窗口等,用户的程序通过调用API接口同Windows打交道,无论什么样的应用程序,其底层最终都是通过调用各种API函数来实现各种功能的。

通常情况下,API有两种基本形式:Win16和Win32。

Win16是原来的API的16位版本,用于Windows 3.1;Win32是现在的API的32位版本,用于Windows 9X/NT/ME/2000/XP/2003/7/8/10。Win32包括了Win16,是Win16的超集,大多数函数的名字、用法都是相同的。

16位的API函数和32位的API函数的区别在于最后的一个字母,例如,设置这样的断点Bpx GetDlgItemText、Bpx GetDlgItemTextA和Bpx GetDlgItemTextW,其中GetDlgItemText是16位API函数,GetDlgItemTextA和GetDlgItemTextW是32位API函数,而GetDlgItemTextA表示函数使用单字节,GetDlgItemTextW表示函数使用双字节。

现在破解中常用到的是Win32单字节API函数,就是和GetDlgItemTextA类似的函数,其他的两种(Win16 API和Win32双字节API函数)则比较少见。

Win32 API函数包含在动态链接库(Dynamic Link Libraries,DLLs)中,即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中,这就是要在SoftICE中用exp=C:\Windows\system\kernel32.dll等命令行将这些动态链接库导入SoftICE中的原因。因为不这样做,就无法拦截到系统Win32 API函数调用了。

3.程序中注册码的存在方式

破解过程中都会去找程序中将输入的注册码和正确的注册码相比较的地方,然后通过对程序的跟踪、分析找到正确的注册码。但正确的注册码通常在程序中以两种形态存在:显式的和隐式的。

对于显式存在的注册码,可以直接在程序所处的内存中看到它,例如,可以直接在SoftICE的数据窗口中看到类似“297500523”这样存在的注册码(这里是随意写的),对于注册码显式存在的软件破解起来比较容易。

但有些软件的程序中并不直接将输入的注册码和正确的注册码进行比较,如有可能将注册码换算成整数或将注册码拆开,然后将每一位注册码分开在不同的地方逐一进行比较,或将输入的注册码进行某种变换,再用某个特殊的程序进行验证等。

总之,应用程序会采取各种不同的复杂运算方式来回避直接的注册码比较,对于这类程序,通常要下功夫去仔细跟踪、分析每个程序功能,找到加密算法,然后才能破解它。当然,这需要一定的8086汇编编程功底和很大的耐心与精力。