搜档网
当前位置:搜档网 › 十招让你学会破解软件

十招让你学会破解软件

十招让你学会破解软件.txt37 真诚是美酒,年份越久越醇香浓烈;真诚是焰火,在高处绽放才愈显美丽;真诚是鲜花,送之于人,手有余香。十招让你学会破解软件

根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:

1.断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方:你正在上班,突然有同学打电话告诉你他从外地坐火车过来,要你去火车站接他。然后你就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后你又返回公司继续上班,这就是一个中断过程。我们解密的过程就是等到程序去获取我们输入的注册码并准备和正确的注册码相比较的时候将它中断下来,然后我们通过分析程序,找到正确的注册码。所以我们需要为被解密的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到crack 的目的。

2.领空:这是个非常重要的概念,但是也初学者是常常不明白的地方。我们在各种各样

的破解文章里都能看到领空这个词,如果你搞不清楚到底程序的领空在哪里,那么你就不可能进入破解的大门。或许你也曾破解过某些软件,但那只是瞎猫碰到死老鼠而已。所谓程序的领空,说白了就是程序自己的地方,也就是我们要破解的程序自己程序码所处的位置。也许你马上会问:我是在程序运行的时候设置的断点,为什么中断后不是在程序自己的空间呢?因为每个程序的编写都没有固定的模式,所以我们要在想要切入程序的时候中断程序,就必须不依赖具体的程序设置断点,也就是我们设置的断点应该是每个程序都会用到的东西。在

DOS时代,基本上所有的程序都是工作在中断程序之上的,即几乎所有的DOS程序都会去调

用各种中断来完成任务。但是到了WINDOW时代,程序没有权力直接调用中断,WINDOW系

统提供了一个系统功能调用平台(API),就向DOS程序以中断程序为基础一样,WINDOW程

序以API为基础来实现和系统打交道,从而各种功能,所以WINDWC下的软件破解其断点设

置是以API 函数为基础的,即当程序调用某个API 函数时中断其正常运行,然后进行解密。例如在SOFTICE 中设置下面的断点:bpx GetDlgItemText (获取对话框文本) ,当我们要破解的程序要读取输入的数据而调用GetDIgItemText时,立即被SOFTICE兰截到,从而被破解

的程序停留在GetDIgItemText的程序区,而GetDIgItemText是处于WINDWO自己管理的系统区域,如果我们擅自改掉这部分的程序代码,那就大祸临头了!所以我们要从系统区域返回到被破解程序自己的地方(即程序的领空) ,才能对程序进行破解, 至于怎样看程序的领空请看前面的SOFTICE图解。试想一下:对于每个程序都会调用的程序段,我们可能从那里找到什么有用的东西吗?(怎么样去加密是程序自己决定的,而不是调用系统功能实现的!)

3.API :即AppIication Programming Interface 的简写,中文叫应用程序编程接口,

是一个系统定义函数的大集合, 它提供了访问操作系统特征的方法。API 包含了几百个应用程序调用的函数,这些函数执行所有必须的与操作系统相关的操作,如内存分配、向屏幕输出和创建窗口等,用户的程序通过调用API接口同WINDOW打交道,无论什么样的应用程序,

其底层最终都是通过调用各种API 函数来实现各种功能的。通常API 有两中基本形式:Win16 和Win32。Win16是原来的、API的16位版本,用于Windows 3.1 ;Win32是现在的、API的32 位版本,用于Windows 95/98/NT/ME/2000。Win32 包括了Win 16,是Win 16 的超集,大多数函数的名字、用法都是相同的。16位的API函数和32位的API函数的区别在于最后的一

个字母,例如我们设置这样的断点:bpx GetDIgItemText 、bpx GetDIgItemTextA 和bpx GetDIgItemTextW , 其中GetDIgItemText 是16 位API 函数, GetDIgItemTextA 和GetDIgItemTextW 是32 位API 函数, 而GetDIgItemTextA 表示函数使用单字节,

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 函数调用了。 4. 关于程序中注册码的存在方式: 破解过程中我们都会去找程序中将输入的注册码和正

确的注册码相比较的地方,然后通过对程序的跟踪、分析找到正确的注册码。但是正确的注 册码通常在程序中以两种形态存在:显式的和隐式的,对于显式存在的注册码,我们可以直 接在程序所处的内存中看到它,例如你可以直接在 SOFTICE 的数据窗口中看到类似 "297500523" 这样存在的注册码(这里是随意写的) ,对于注册码显式存在的软件破解起来比 较容易;但是有些软件的程序中并不会直接将我们输入的注册码和正确的注册码进行比较, 比如有可能将注册码换算成整数、或是将注册码拆开,然后将每一位注册码分开在不同的地 方逐一进行比较,或者是将我们输入的注册码进行某种变换,再用某个特殊的程序进行验证 等等。总之,应用程序会采取各种不同的复杂运算方式来回避直接的注册码比较,对于这类

程序, 我们通常要下功夫去仔细跟踪、 分析每个程序功能, 找到加密算法, 然后才能破解它, 当然这需要一定的 8086 汇编编程功底和很大的耐心与精力。

5. 关于软件的破解方式: 本人将破解方式分为两大类, 即完全破解和暴力破解。 所谓完

全破解主要是针对那些需要输入注册码或密码等软件来说的,如果我们能通过对程序的跟踪 找到正确的注册码, 通过软件本身的注册功能正常注册了软件, 这样的破解称之为完全破解; 但如果有些软件本身没有提供注册功能, 只是提供试用 ( DEMO ) ,或是注册不能通过软件本身 进行(例如需要获取另外一个专用的注册程序,通过 INTERNET 勺注册等等),或者是软件本

身的加密技术比较复杂, 软件破解者的能力、 精力、 时间有限, 不能直接得到正确的注册码, 此时我们需要去修改软件本身的程序码,即人为改变软件的运行方向,这样的破解称之为暴 力破解。

6.

程序的分析方法, 0167:00408033 0167:00408035 0167:00408036 0167:0040803C

7. 关于如何设置断点的问题:正确恰当的设置好断点对于快速有效的解密非常重要, 好的断点设置可以使我们迅速找到关键的程序段,而不恰当的断点则会对解密造成不必要的 精力消耗,甚至根本就不能拦截到程序的运行。但是具体什么时候用什么断点比较合适很难 说,这需要自己用经验去累积,总的说来 bpx hmemcpy 这个万能断点对大多数注册码方式的

软件都有用,初学者不妨多试试这个断点。对于那些需要暴力破解的非注册码方式的软件, 通常我们应该拦截对话框(如 bpx DialogBox )和消息框(如 bpx MessageBox (A ) )等。不论 对于哪一类软件,当我们设置的断点均没有效果时,可是试一下

bpx lockmytask ,这个断点 的作用是拦截任何一个按键的动作,具体常用的一些断点设置请参考 " 破解常用断点设置 " 一 文。另外,在注册码的破解中通常需要输入用户名和注册码,一般说来用户名和密码都可以 随意输入,但是根据我自己的经验,很多软件对于注册码都会逐位的进行处理,假如输入 "78787878" 这串数字,那么在跟踪程序的时候我们就无法知道我们当时所看到的 "78" 倒底是 哪一个 "78" ,所以我比较喜欢用 "12345678" 这样的注册码输入方式, 这样的话就就能知道程 序是在对注

关于破解教程中程序代码地址问题: 破解教程中都会放上一部分程序代码以帮助讲解 例如下面的一段程序代码:

PUSH 00

PUSH EBX

CALL [USER32!EndDialog]

JMP 0040812C

册码的哪一位进行运算,同样的对于那些需要输入较长序列号的软件,输入类似

其中EAX 和EDX 指向的内存区域就是我们输入的注册码和正确的注册码,这里的寄存器 EAX 和EDX 是随意写的,也可以是 ECX EBX EDI ,ESI 等等。对于注册码隐式存在的程序,

虽然不能直接看到正确的注册码,但是通常也是先将所输入的注册码地址放进某个寄存器, 然后调用子程序去验证, 破解时就需要进入子程序去分析注册算法。 总之,看到子程序 ( call ******** )后面跟着跳转指令( JNZ ******** 或 JZ ******** )的地方我们就应该提高警惕, 多用D EAX (或 EBX ECX EDX EDI 、ESI...等)去看看寄存器指向的内存区域藏着什么东 西。有一点大家要提醒大家:看见程序中使用下面这个函数是要注意,即 GetDlgItenInt ,

这个 API 函数的作用是将输入的文本转化为整数,所以这类程序中是不会有显示存在的注册 码的,因为注册码被转换为整数了,程序通常会用

CMPECX,EDX 这种类型的指令去验证注册 码的正确性,这里 ECX 和EDX 中存的就是所输入注册码和正确注册码的整数形式,此时可以 用 ? edx 和 ? ecx 看到其十进制形式,即我们输入的形式。

9. 关于软件的反安装问题: 经常我们使用某些软件时都会遇到一个问题, 就是共享软件 过期之后即使删掉原程序重新安装,程序依然不能用,还是一样提醒你试用期已过请注册; 或者是你已经破解了某个软件,但是还想继续研究它,但是因为软件已经注册好,没有了注 册选项,这时你即使彻底删掉程序再重新安装软件,结果程序运行后还是注册过的。遇到这 样的情况,其实原因很简单,因为程序将注册或过期信息存在了系统注册表里,所以简单的 重新安装软件是无济于事的。解决的办法就是自己删掉注册表中有关的信息,但是因为注册 表是WINDOW 系统工作的基础,如果不小心就很可能会损坏它而引起系统异常,所以如果你 对注册表不是很熟的话,应该在修改之前备份一下注册表。不论是修改还是备份注册表都可 以使用 WINDOW 下的注册表管理工具"REGEDIT"来进行,一种办法是在”开始-> 运行”下输入 "regedit" 启动它, 也可以直接点击 "C:\WINDOWS\regedit.exe" 来运行。 大部分的应用软件都 会 将 自 己 的 信 息 存 在 如 下 的 路 径 中 : HKEY_LOCAL_MACHINE\Software 、 HKEY_LOCAL_MACHINE\Software\ Microsoft 、

HKEY_CURRENT_USER\Software 、 HKEY_CURRENT_USER\Software\ Microsoft 或

HKEY_USERS\.DEFAULT\Software 下,具体是 哪个地方依据不同的程序而有所不同,只要按上面的顺序肯定能找到有关应用程序的键,然

后将和用户名及注册码有关的键值删掉就搞定了。

"12345-67890-ABCDEF" 这样的序列号较好。不过有一点大家需要特别的注意:上面讲的注册 码输入方式 "12345678" 是针对拦截 WIN32API 函数来说的, 假如有些时候直接拦截 WIN32API 函数难以找到程序的突破口,而要借助于 "S" 指令在内存中寻找我们输入的用户名或注册码 时,就最好不要采用 "12345678" 作为注册码, 因为内存中很可能有许多的 "12345678" 字符串, 这样我们没有办法知道倒底我们要破解的程序使用的是哪一个 "12345678" ,所以我们应该选 择一个不易和内存数据相同的注册码,比如:

74747474 ,对应的搜索指令为: S 30:0 L

FFFFFFFF '74747474' 。当然,以上只是我个人的习惯而已,具体用什么样的输入形式可以 根据本人的爱好、习惯来定,不必拘泥于某一固定的模式。

8. 关于如何跟踪程序的问题: 初学者在开始学习解密的时候往往不知道怎么样去跟踪程 序,怎么样找到注册码比较的地方,当面对长长的一堆程序代码时显得不知所措。通常软件 的程序内部都会利用一个子程序(即 CALL ******** )去验证我们输入的注册码正确与否, 对于注册码显式存在的程序,一般都会将所输入的注册码和正确的注册码放进寄存器,然后 调用验证子程序进行判断, 将结果返回, 这样的程序经常具有如下的形式: MOV EAX,[********] MOV EDX,[********] CALL ******** TEST EAX,EAX JNZ

******** 应用程序根据子程序返回的结果决定是否注册成功,

**** **** **** an

an

********

********

******** 或 PUSH EAX 等形式) 或 PUSH EDX 等形式) 或 TEST AL,AL ,或是没有这一句等形式) 或

JZ ******** 等形式)

10. 关于破解练习的问题:学习破解需要大量的练习,对于破解目标的选择,初学者不宜以大型的、著名的软件为目标,因为这些软件通常加密较为复杂,破解不易,应该选择一些比较不出名的、小型的和早些时候的共享软件来练习,因为加密相对简单的软件有利于初学者快速掌握破解思想和技能。至于习题的来源则很广泛,可以从网上下载,也可以去市面上购买一些共享软件光盘。

在这里程序中的代码地址如0167:00408033 ,其代码段的值(即0167 )有可能根据不同的电脑会有区别,不一定一模一样,但偏移值应该是固定的(即00408033 不变),所以如果看到破解文章里的程序代码的地址值和自己的电脑里不一样,不要以为搞错地方了,只要你的程序代码正确就不会有问题。

相关主题