首页 > 编程知识 正文

教宝宝说话的手机软件,破解软件

时间:2023-05-06 05:07:51 阅读:124681 作者:2068

http://www.Sina.com/http://www.Sina.com /

我提到了学习解读过程中经常遇到的问题,我会根据自己的经验简单地说出来。 这些问题对初学者来说需要很好地理解。 根据我自己的学习经验,如果你直接按照很多解读教程学习,通常自己会浮现在脑海里。 有很多概念,自己不太清楚,本来就不知道发生了什么,请通过下面的讨论协助。

1 .断点:断点是指程序中断的地方,对读者来说是再熟悉不过的语言。 那么,中断是什么呢? 中断是指由于发生了特殊的事件(中断事件),计算机暂停当前任务(即程序),改为运行其他任务(中断服务程序),然后返回到原始任务继续运行例如,你正在上班。 突然同学给我打电话,说他从国外坐电车来,希望我去车站接他。 然后,给老板放个临时假,去车站接同学,让他冷静下来,然后回公司继续上班。 这就是中断的过程。 我们破译的过程是获取程序输入的注册码,准备与正确的注册码进行比较时中断,然后分析程序找到正确的注册码。 因此,必须在解密的程序中设置断点,根据需要切入程序内部,跟踪程序的注册码,以达到crack的目的。

2 .领空:这是一个非常重要的概念,但初学者不太清楚。 我们可以在各种解读文章中看到领空这个词。 如果不知道程序领空在哪里,就无法进入破解之门。 你可能也破解过软件,那只是一只胡说八道的猫撞到了死老鼠。 (以前我是^_^,现在很难说。 请参阅。 程序领空,简言之,就是程序本身的位置,也就是我们要破译的程序本身的程序代码所在的位置。 你马上就说:“我在程序运行的时候设置了断点,为什么中断后不在程序的自己空间里呢? 因为每个程序的创建都没有固定模式,所以要在尝试切入程序时中断程序,必须独立于特定程序设置断点。 也就是说,我们设置的断点必须用于所有程序。 在DOS时代,基本上所有的程序都在中断程序上运行。 这意味着大多数DOS程序都会调用各种中断来完成任务。 但是,到了WINDOWS时代,程序没有直接调用中断的权限,WINDOWS系统提供系统功能调用平台(API ),就像在DOS程序中以中断程序为基础一样, WINDOWS程序以API为基础实现与系统的交互,实现各种功能,所以WINDOWS下的软件破解其断点设置是以API函数为基础的。 也就是说,例如,在程序调用某个功能时,在SOFTICE中设置以下断点: bpx GetDlgItemText (获取对话框中的文本。 如果尝试解密的程序调用GetDlgItemText读取输入的数据,它将立即被SOFTICE阻止,并且解密的程序将停留在GetDlgItemText的程序区域。 因为是GetDlgItemText,所以我们可以从系统区域回到程序被解密的自己的位置,也就是程序领空,解密程序。 关于如何看待程序领空,请参阅前面的SOFTICE图解。 想一想:对于所有程序调用的程序段,我们能从中找到什么有用的东西吗? (如何加密由程序自己决定,而不是调用系统的功能来实现! )

3. API :即applicationprogramminginterface的缩写,中文称为APP应用编程接口,是系统定义函数的大集合,提供访问操作系统特征的方法API包含调用数百个APP应用程序的函数,这些应用程序执行所有必需的操作系统相关操作,如内存分配、屏幕输出和窗口创建。 用户的程序通过调用API接口与WINDOWS进行交互,在任何APP应用程序中,其基础最终都是通过调用各种API函数来实现各种功能。 API通常有两种基本格式: Win16和Win32。 Windows 3.1的原始API 16位版本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表示函数使用1字节,GetDlgItemTextW表示函数使用2字节。 目前,破译常用的是Win32单字节API函数,与GetDlgItemTextA相似的函数,其他两种(Win16 API和Win32双字节API函数)较为少见。 Win32 API函数包含在动态链接库(动态链接库,简称DLLs )或kernel32.d中

ll、user32.dll、gdi32.dll和comctl32.dll中,这就是为什么我们要在softice中用exp=C:windowssystemkernel32.dll等命令行将这些动态链接库导入softice中的原因。因为不这样做的话,我们就无法拦截到系统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. 关于破解练习的问题:学习破解需要大量的练习,对于破解目标的选择,初学者不宜以大型的、著名的软件为目标,因为这些软件通常加密较为复杂,破解不易,应该选择一些比较不出名的、小型的和早些时候的共享软件来练习,因为加密相对简单的软件有利于初学者快速掌握破解思想和技能。至于习题的来源则很广泛,可以从网上下载,也可以去市面上购买一些共享软件光盘。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。