下面谈到了一些在学习解密过程中经常碰到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,假如您直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:
1. 断点:所谓断点就是程式被中断的地方,这个词对于解密者来说是再熟悉但是了。那么什么又是中断呢?中断就是由于有特别事件(中断事件)发生,电脑暂停当前的任务(即程式),转而去执行另外的任务(中断服务程式),然后再返回原先的任务继续执行。打个比方:您正在上班,突然有同学打电话告诉您他从外地坐火车过来,要您去火车站接他。然后您就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后您又返回公司继续上班,这就是个中断过程。我们解密的过程就是等到程式去获取我们输入的注册码并准备和正确的注册码相比较的时候将他中断下来,然后我们通过分析程式,找到正确的注册码。所以我们需要为被解密的程式配置断点,在适当的时候切入程式内部,追踪到程式的注册码,从而达到crack的目的。
2. 领空:这是个很重要的概念,但是也初学者是常常不明白的地方。我们在各种各样的破解文章里都能看到领空这个词,假如您搞不清楚到底程式的领空在哪里,那么您就不可能进入破解的大门。或许您也曾破解过某些软件,但那只是瞎猫碰到死老鼠而已(以前我就是这样的^_^,现在说起来都不好意思喔!)。所谓程式的领空,说白了就是程式自己的地方,也就是我们要破解的程式自己程式码所处的位置。也许您马上会问:我是在程式运行的时候配置的断点,为什么中断后不是在程式自己的空间呢?因为每个程式的编写都没有固定的模式,所以我们要在想要切入程式的时候中断程式,就必须不依赖具体的程式配置断点,也就是我们配置的断点应该是每个程式都会用到的东西。在DOS时代,基本上任何的程式都是工作在中断程式之上的,即几乎任何的DOS程式都会去调用各种中断来完成任务。但是到了WINDOWS时代,程式没有权力直接调用中断,WINDOWS系统提供了一个系统功能调用平台(API),就向DOS程式以中断程式为基础相同,WINDOWS程式以API为基础来实现和系统打交道,从而各种功能,所以WINDWOS下的软件破解其断点配置是以API函数为基础的,即当程式调用某个API函数时中断其正常运行,然后进行解密。例如在SOFTICE中配置下面的断点:bpx GetDlgItemText(获取对话框文本),当我们要破解的程式要读取输入的数据而调用GetDlgItemText时,立即被SOFTICE拦截到,从而被破解的程式停留在GetDlgItemText的程式区,而GetDlgItemText是处于WINDWOS自己管理的系统区域,假如我们擅自改掉这部分的程式代码,那就大祸临头了^_^!所以我们要从系统区域返回到被破解程式自己的地方(即程式的领空),才能对程式进行破解,至于怎样看程式的领空请看前面的SOFTICE图解。试想一下:对于每个程式都会调用的程式段,我们可能从那里找到什么有用的东西吗?(怎么样去加密是程式自己决定的,而不是调用系统功能实现的!)
3. API:即Application Programming Interface的简写,中文叫应用程式编程接口,是个系统定义函数的大集合,他提供了访问操作系统特征的方法。 API包含了几百个应用程式调用的函数,这些函数执行任何必须的和操作系统相关的操作,如内存分配、向屏幕输出和创建窗口等,用户的程式通过调用API接口同WINDOWS打交道,无论什么样的应用程式,其底层最终都是通过调用各种API函数来实现各种功能的。通常API有两中基本形式:Win16和Win32。 Win16是原来的、API的16位版本,用于Windows 3.1;Win32是现在的、API的32位版本,用于Windows 95/98/NT/ME/2000。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:windowssystemkernel32.dll等命令行将这些动态链接库导入softice中的原因。因为不这样做的话,我们就无法拦截到系统Win32 API函数调用了。 4. 关于程式中注册码的存在方式:破解过程中我们都会去找程式中将输入的注册码和正确的注册码相比较的地方,然后通过对程式的跟踪、分析找到正确的注册码。但是正确的注册码通常在程式中以两种形态存在:显式的和隐式的,对于显式存在的注册码,我们能够直接在程式所处的内存中看到他,例如您能够直接在SOFTICE的数据窗口中看到类似"297500523"这样存在的注册码(这里是随意写的),对于注册码显式存在的软件破解起来比较容易;但是有些软件的程式中并不会直接将我们输入的注册码和正确的注册码进行比较,比如有可能将注册码换算成整数、或是将注册码拆开,然后将每一位注册码分开在不同的地方逐一进行比较,或是将我们输入的注册码进行某种变换,再用某个特别的程式进行验证等等。总之,应用程式会采取各种不同的复杂运算方式来回避直接的注册码比较,对于这类程式,我们通常要下功夫去仔细跟踪、分析每个程式功能,找到加密算法,然后才能破解他,当然这需要一定的8086汇编编程功底和很大的耐心和精力。
5. 关于软件的破解方式:本人将破解方式分为两大类,即完全破解和暴力破解。所谓完全破解主要是针对那些需要输入注册码或密码等软件来说的,假如我们能通过对程式的跟踪找到正确的注册码,通过软件本身的注册功能正常注册了软件,这样的破解称之为完全破解;但假如有些软件本身没有提供注册功能,只是提供试用(DEMO),或是注册不能通过软件本身进行(例如需要获取另外一个专用的注册程式,通过INTERNET的注册等等),或是软件本身的加密技术比较复杂,软件破解者的能力、精力、时间有限,不能直接得到正确的注册码,此时我们需要去修改软件本身的程式码,即人为改淙砑脑诵蟹较颍庋钠平獬浦┝ζ平狻?
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



