您的当前位置:主页 > 电路板解密 >

电路板解密

破解加密狗和破解软件狗的方法和原理

作者:admin 上传时间:2016-10-10 19:00 浏览:

破解加密狗和破解软件狗的方法和原理
    我们下面谈了一些在学习软件解密经常遇到的过程中存在的问题,根据自己的经验简单的谈谈。这些问题对于初学者来说,它往往是必要的了解,根据我自己的学习经验,如果你遵循了很多破解教程学习,大多都会让自己迷茫困惑的,因为有很多的不是自己的就是概念不是很清楚,或者根本不知道是怎么一回事,所以我希望下面的讨论给你一些帮助:

1.断点:所谓断点是其中程序被中断的地方,用于解密字谁是熟悉的。那么,什么是中断?中断是由于特殊事件(中断事件)时,计算机暂停当前的任务(即程序),而不是执行其他任务(中断服务例程),然后返回到原来的任务继续。打个比方:你是在工作,突然打电话告诉你他从火车外地赶来的同学,你去火车站接他。然后你离开老板临时,赶往火车站去接同学,后来他定居,那么你回到公司上班,这是一个中断处理。我们解密过程就是等到程序获得注册码我们进入,并准备用时,它中断了正确的注册码进行比较,然后我们通过分析程序,找到正确的注册码。因此,我们需要的解密后的程序断点被设置,则在切入内部程序的适当时间,跟踪注册码到程序,从而达到裂纹的目的。 ??

2.领空:这是一个非常重要的概念,也是初学者往往不明白的地方。我们可以在各种软件破解文章中看到这个词的领空,如果你不知道到底哪里该程序的领空,那么你就不能进入软件破解的大门。也许你已经破解了一些软件,但那只是瞎猫只打了死老鼠(我之前,所以^ _ ^,现在他们都不好意思哦!)。所谓程序的领空,也就是程序本身的地方,也就是我们想去的地方的位置破解程序自己的代码。也许你会马上问:我正在运行程序设置的断点,为什么不中断自己的空间计划?因为每个程序写入没有固定的模式,所以我们要剪切的程序时,可以中断程序,你必须不依赖于特定的在程序集中设置断点,也就是说,我们设置的断点应该用于每个程序都会有些东西。在DOS时代,基本上所有的程序都在中断程序上工作,也就是说,几乎所有的DOS程序都会调用各种中断来完成任务。但是到WINDOWS时代,程序没有能力直接调用中断,WINDOWS系统提供了一个系统函数调用平台(API),以DOS程序为中断程序为基础,WINDOWS程序以API为基础的系统实现和处理,功能,所以WINDWOS下的软件断点设置为基于API函数,即当程序调用一个API函数中断其正常操作,然后解密。例如,在SOFTICE中设置以下断点:bpx GetDlgItemText(访问对话框文本),当我们想打破程序读取输入数据并调用GetDlgItemText时,立即SOFTICE进行拦截,因此破解程序停留在GetDlgItemText中程序区,和GetDlgItemText是在WINDWOS自己的管理系统区域,如果我们擅自改掉程序代码的这部分,那么灾难^ _ ^!因此,我们必须从系统区域返回到被破解程序自己的地方(即程序的领空),以破解程序,因为看到在SOFTICE图解面前如何程序的领空。试想一下:对于每个程序将调用程序段,我们可能从那里什么有用的东西找? (如何本身决定的程序进行加密,而不是调用系统功能实现的!)?

3. API:应用程序编程接口的简写,在中国被称为应用程序编程接口,是一个大集合的系统定义的功能,它提供了访问操作系统特征的方法。该API包含由数百个执行所有与操作系统相关联的必要的操作,诸如存储器分配,输出到屏幕上,并创建视窗的应用程序调用的函数。通过调用API接口,应用程序一样与Windows用户的程序接口,通过各种API函数最后调用的底部,实现多种功能。平时API有两种基本形式:的Win16和Win32。Win16的是Windows3.1的API原来,16位版本;现在的Win32是API用于Windows95/98的32位版本/ 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函数常用
4. 关于程序中注册码的存在方式:破解过程中我们都会去找程序中将输入的注册码和正确的注册码相比较的地方,然后通过对程序的跟踪、分析找到正确的注册码。但是正确的注册码通常在程序中以两种形态存在:显式的和隐式的,对于显式存在的注册码,我们可以直接在程序所处的内存中看到它,例如你可以直接在SOFTICE的数据窗口中看到类似\"297500523\"这样存在的注册码(这里是随意写的),对于注册码显式存在的软件破解起来比较容易;但是有些软件的程序中并不会直接将我们输入的注册码和正确的注册码进行比较,比如有可能将注册码换算成整数、或是将注册码拆开,然后将每一位注册码分开在不同的地方逐一进行比较,或者是将我们输入的注册码进行某种变换,再用某个特殊的程序进行验证等等。总之,应用程序会采取各种不同的复杂运算方式来回避直接的注册码比较,对于这类程序,我们通常要下功夫去仔细跟踪、分析每个程序功能,找到加密算法,然后才能破解它,当然这需要一定的8086汇编编程功底和很大的耐心与精力。?

  5. 关于软件的破解方式:本人将破解方式分为两大类,即完全破解和暴力破解。所谓完全破解主要是针对那些需要输入注册码或密码等软件来说的,如果我们能通过对程序的跟踪找到正确的注册码,通过软件本身的注册功能正常注册了软件,这样的破解称之为完全破解;但如果有些软件本身没有提供注册功能,只是提供试用(DEMO),或是注册不能通过软件本身进行(例如需要获取另外一个专用的注册程序,通过INTERNET的注册等等),或者是软件本身的加密技术比较复杂,软件破解者的能力、精力、时间有限,不能直接得到正确的注册码,此时我们需要去修改软件本身的程序码.
6. 关于破解教程中程序代码地址问题:破解教程中都会放上一部分程序代码以帮助讲解程序的分析方法,例如下面的一段程序代码:?

  ......?

  0167:00408033 PUSH 00?

  0167:00408035 PUSH EBX?

  0167:00408036 CALL [USER32!EndDialog]?

  0167:0040803C JMP 0040812C?

  ......?

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

  7. 关于如何设置断点的问题:正确恰当的设置好断点对于快速有效的解密非常重要,好的断点设置可以使我们迅速找到关键的程序段,而不恰当的断点则会对解密造成不必要的精力消耗,甚至根本就不能拦截到程序的运行。?

  但是具体什么时候用什么断点比较合适很难说,这需要自己用经验去累积,总的说来bpx hmemcpy这个万能断点对大多数注册码方式的软件都有用,初学者不妨多试试这个断点(通常我也是用这个断点设置,懒嘛^_^,哈哈。。。)。?

  对于那些需要破解加密狗和破解软件狗的方法和原理暴力破解的非注册码方式的软件,通常我们应该拦截对话框(如bpx DialogBox)和消息框(如bpx MessageBox(A))等。不论对于哪一类软件,当我们设置的断点均没有效果时,可是试一下bpx lockmytask,这个断点的作用是拦截任何一个按键的动作,具体常用的一些断点设置请参考\"破解常用断点设置\"一文。?

  另外,在注册码的破解中通常需要输入用户名和注册码,一般说来用户名和密码都可以随意输入,但是根据我自己的经验,很多软件对于注册码都会逐位的进行处理,假如输入\"78787878\"这串数字,那么在跟踪程序的时候我们就无法知道我们当时所看到的\"78\"倒底是哪一个\"78\",所以我比较喜欢用\"12345678\"这样的注册码输入方式,这样的话就就能知道程序是在对注册码的哪一位进行运算,同样的对于那些需要输入较长序列号的软件,输入类似\"12345-67890-ABCDEF\"这样的序列号较好。?
不过有一点大家需要特别的注意:上面讲的注册码输入方式\"12345678\"是针对拦截WIN32 API函数来说的,假如有些时候直接拦截WIN32 API函数难以找到程序的突破口,而要借助于\"S\"指令在内存中寻找我们输入的用户名或注册码时,就最好不要采用\"12345678\"作为注册码,因为内存中很可能有许多的\"12345678\"字符串,这样我们没有办法知道倒底我们要破解的程序使用的是哪一个\"12345678\",所以我们应该选择一个不易和内存数据相同的注册码,比如:74747474(本人喜欢用,意思嘛:去死去死。。。哈哈哈^_^),对应的搜索指令为: S 30:0 L FFFFFFFF ‘74747474‘ 。当然,以上只是我个人的习惯而已,具体用什么样的输入形式可以根据本人的爱好、习惯来定,不必拘泥于某一固定的模式。?

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

  ****:******** MOV EAX,[********]  (或 PUSH EAX等形式)?

  ****:******** MOV EDX,[********]  (或 PUSH EDX等形式)?

  ****:******** CALL ********?

  ****:******** TEST EAX,EAX     (或 TEST AL,AL,或是没有这一句等形式)?

  ****:******** JNZ ********     (或 JZ ********等形式)?

  其中EAX和EDX指向的内存区域就是我们输入的注册码和正确的注册码,这里的寄存器EAX和EDX是随意写的,也可以是ECX,EBX,EDI,ESI等等。对于注册码隐式存在的程序,虽然不能直接看到正确的注册码,但是通常也是先将所输入的注册码地址放进某个寄存器,然后调用子程序去验证,破解时就需要进入子程序去分析注册算法。总之,看到子程序(call ********)后面跟着跳转指令(JNZ ********或JZ ********)的地方我们就应该提高警惕,多用 D EAX(或EBX、ECX、EDX、EDI、ESI...等)去看看寄存器指向的内存区域藏着什么东西。?

  破解加密狗和破解软件狗的方法和原理有一点大家要提醒大家:看见程序中使用下面这个函数是要注意,即GetDlgItenInt,这个API函数的作用是将输入的文本转化为整数,所以这类程序中是不会有显示存在的注册码的,因为注册码被转换为整数了,程序通常会用CMP ECX,EDX 这种类型的指令去验证注册码的正确性,这里ECX和EDX中存的就是所输入注册码和正确注册码的整数形式,此时可以用 ? edx 和 ? ecx 看到其十进制形式,即我们输入的形式。?

  9. 关于软件破解的反安装问题:经常我们使用某些软件时都会遇到一个问题,就是共享软件过期之后即使删掉原程序重新安装,程序依然不能用,还是一样提醒你试用期已过请注册;或者是你已经破解了某个软件,但是还想继续研究它,但是因为软件已经注册好,没有了注册选项,这时你即使彻底删掉程序再重新安装软件,结果程序运行后还是注册过的。?

  遇到这样的情况,其实原因很简单,因为程序将注册或过期信息存在了系统注册表里,所以简单的重新安装软件是无济于事的。解决的办法就是自己删掉注册表中有关的信息,但是因为注册表是WINDOWS系统工作的基础,如果不小心就很可能会损坏它而引起系统异常,所以如果你对注册表不是很熟的话,应该在修改之前备份一下注册表。?

  软件狗复制不论是修改还是备份注册表都可以使用WINDOWS下的注册表管理工具\"REGEDIT\"来进行,一种办法是在\"开始->运行\"下输入\"regedit\"启动它,也可以直接点击\"C:WINDOWSregedit.exe\"来运行。大部分的应用软件都会将自己的信息存在如下的路径中:HKEY_LOCAL_MACHINESoftware、HKEY_LOCAL_MACHINESoftwareMicrosoft、HKEY_CURRENT_USERSoftware、HKEY_CURRENT_USERSoftwareMicrosoft 或 HKEY_USERS.DEFAULTSoftware下,具体是哪个地方依据不同的程序而有所不同,只要按上面的顺序肯定能找到有关应用程序的键,然后将和用户名及注册码有关的键值删掉就搞定了。?

  10. 关于破解加密狗和破解软件狗的方法和原理:学习软件破解需要大量的练习,对于破解目标的选择,初学者不宜以大型的、著名的软件为目标,因为这些软件通常加密较为复杂,破解不易,应该选择一些比较不出名的、小型的和早些时候的共享软件来练习,因为加密相对简单的软件有利于初学者快速掌握破解思想和技能。破解加密狗和破解软件狗的方法和原理