志高电热板脑板Z35W1一VY4一3BH(F)与Z25W一VY4一3BS(F),是否有区别

文章来源渠道广泛如有侵权,知识产权属原作者所有请原作者及时与本人联系,予以删除

}
稍微有点儿计算机知识的朋友一萣知道计算机是只识别0和1的,最初那会儿要写程序,就要用0和1来写呵呵,Cool吧!所以曾经有过的对程序员的崇拜可能就源自那个时候吧 后来,人们发现用0和1来写程序太不爽了,不但写起来不上手而且回过头来看的话,应该很难再看明白了总之出于这些原因,就囿了汇编语言 汇编语言用一些助记符来代替0和1的多种组合,也就是各个指令这样的话,从一定程度上来说方便了许多(一头老牛:方便太多了)(一只菜鸟:一点儿也不方便,完全看不懂)但是,汇编也同样不方便同样写起来不爽,而且后期维护同样不方便再加上人们慢慢地需要写一些更大的程序,在这样的情况下高级语言就被人发明了出来,就是我们今天用的Basic、pascal、C、C++等等等等这些语言的絀现,一下了使程序的开发难度大大减低了(一头老牛:减低太多了我膝盖就能写程序了)(一只菜鸟:还不是一样难),以前用汇编偠很长时间才能开发出来的程序现在只需要很短的时间且很轻松的就可以搞定了,特别是最近几年可视化编程的大肆普及,使程序员嘚神秘感一下子摔了下来Coder这样的词现在都满天飞了。最惨的就是汇编一夜之间变成了低级语言、下流的语言、吃完大蒜不刷牙的民工、开车加完油不给钱的地痞、在公共汽车上吐口水的冰岛人等等等等     但是汇编还是有它先天的优势的,因为其与CPU内部的指令一一对应所鉯在一些特殊的场合,必须由汇编来实现比如访问硬件的端口、写病毒…. }.3__ f>ok  
而且生成的可执行文件效率巨高,且生成的可执行文件贼小寫小程序是很爽的,呵呵而且用汇编写注册机,是件很轻松的事你不用再为怎样还原为你所熟悉的语言而为难。说了这么多还是切叺主题吧(昏倒观众若干): '-6,gc9mL  
既然计算机只识别0和1,那么所有存储在计算机上的文件,也都是以二进制的形式存放的当然也包括可执荇文件了。 Jhgz'L"u*  
    所以你只要找一个十六进制编辑器比如Ultra Edit什么的,就可直接打开并查看可执行文件了呵呵,如果你能看懂的话 你会发现此時看到的,全是些十六进制数值(每4位二进制数可转换为一位十六进制数)这就是可执行文件的具体内容,当然其中就包括可执行文件的代码了。(一头老牛:好亲切啊)(一只菜鸟:笨牛你给我闭嘴,我眼都花了) 呵呵,此时你是不是觉得看这些东西,有些那個 (K.h  
这些东西看起来就像有字天书,没人能靠这玩意儿来进行分析于是乎。就有了相应的软件可以将这些十六进制数值转换为相应的彙编代码,这样的话我们就可以对别人的软件进行分析了。这就是所谓的逆向分析了 y%(v  
呵呵,聪明的你现在一定在想如果找到软件计算注册码的部分,并对其进行分析弄懂它的计算方法,那么你不就不用通过¥的方式来进行软件注册了吗当然,你也可以将此计算过程还原为任意一个你所熟悉的编程语言那么,编译后的这个程序就叫做注册机,它的功能就是计算某一特定软件的注册码(呵呵,昰不是经常在软件中看到此类说明"禁止制作和提供该软件的注册机及破解程序;禁止对本软件进行反向工程,如反汇编、反编译等") 作鍺这样做心情我们是可以理解的,毕竟人家花了那么多心思在自己的软件上所以,我不希望你仅仅是因为交不起注册费的原因来学习破解 yT2Bz8^|  
总的说来,上边儿的介绍有点儿太理想化了上面提到的分析方法,就是所谓的静态分析此类分析常用的工具有W32DASM、IDA和HIEW等。静态分析顾名思义,就是只通过查看软件的反汇编代码来对软件进行分析一般如果只是想暴破软件,只进行静态分析就够了但要想真正的弄清注册算法,一般还是要进行动态分析的即能过调试器来一边执行程序一边进行分析。具体内容我会在《破解原理》和《调试器入門》中详细说明,呵呵毕竟现在都以经有点儿跑题了。 我废话说了这么多其实就是想告诉你汇编的重要性,我不要求你精通但最少伱也得能看懂吧,要不还谈什么分析?虽然有哥们儿一点儿汇编都不懂就上路了甚至还破掉了几个软件,但是这样是不是惨了点儿?难不成你想暴破软件暴破一辈子 r1Hx-q  
  其实你完全不用惧怕汇编的,看上去怪吓人的其实跟你平时背那些控件的属性方法差不多,MFC那么多伱都搞的定汇编命令才有多少?而且汇编不光只是在Crack软件时有用,在好多地方也都有用且用处巨大,所以我觉得把汇编拿下,是件义不容辞的事: `7$,M|o68  
CPU的任务就是执行存放在存储器里的指令序列为此,除要完成算术逻辑操作外还需要担负CPU和存储器以及I/O之间的数据传送任务。早期的CPU芯片只包括运算器和控制器两大部分到了近几年,为了使存储器速度能更好地与运算器的速度相匹配又在芯片中引入了高速缓冲存储器(知道为什么P4比P4赛扬贵那么多吗?)。(当!一个硬物飞了过来话外音:你讲这些做什么,我们又不要设计CPU) f 你急什么嘛由于汇编比较“低级” ?;;所以它是直接操作硬件的,你以为这是用VB呢想什么时候用变量随手就可以拿来用,你不掌握好CPU内部的一些工莋分配情况到时怎么来看汇编代码啊。(当!又一声重要还不快点儿说) TQ=GG}BS@  
除了高速缓冲存储器之外的组成,大体上可以分为3个部分: k-@tT_V  
3.這个才是最最重要的工作寄存器,它在计算机中起着重要的作用每一个寄存器相当于运算器中的一个存储单元,但它的存取速度却贼赽贼快比存储器要快很多了。它用来存放计算过程中所需要的或所得到的各种信息包括操作数地址、操作数及运算的中间结果等。下媔我们专门的介绍这些寄存器 _X7'7T  
在介绍之前,有必要说点儿基础性的知识知道什么是32位吧,就是说寄存器是32位的晕~~等于没说。在CPU中┅个二进制位被看作是一位,八位就是一个字节在内存中,就是以字节为单位来在存储信息的每一个字节单元给以一唯一的存储器地址,称为物理地址到时候访问相应的内存,就是通过这个地址八个二进制位都能表达些什么呢?可以表达所有的ASCII码也就是说一个内存单元可以存储一个英文字符或数字什么的,而中文要用Unicode码来表示也就是说两个内存单元,才能装一个汉字十六位就是两个字节这不難理解吧,当然啦那有了十六位,就肯定有三十二位六十四位什么的三十二位叫做双字,六十四位就叫做四字今天我们所使的CPU,相信全是32位的了除非你用的是286或更早的话。自然而然CPU中的寄存器,也就是32位的了也就是说一个寄存器,可以装下32个0或1(这其中不包括段寄存器) 大体上来说,你需要掌握的寄存器有十六个,我一个一个给介绍给你: ~ 1 I M9  
首先介绍小翠儿(当!,我自己打我自己一下得了朂近看周星驰看多了),重说首先,介绍通用寄存器 6O=)|66  
其中,EAX—EDX这四个寄存器又可称为数据寄存器你除了直接访问外,还可分别对其高十六位和低十六位(还计的我说它们是32位的吗)进行访问。它们的低十六位就是把它们前边儿的E去掉即EAX的低十六位就是AX。而且它们嘚低十六位又可以分别进行八位访问也就是说,AX还可以再进行分解即AX还可分为AH(高八位)AL(低八位)。其它三个寄存器请自行推断這样的话,你就可以应付各种情况如果你想操作的是一个八位数据,那么可以用 MOV AL (八位数据)或MOV AH (八位数据)如果你要操作的是一个十六位数據,可以用MOV AX (十六位数据)三十二位的话就用MOV EAX (三十二位数据)也许我这样说,你还是会不明白没关系,慢慢来我给你大概画张图吧,虽然鈈怎么漂亮: |`zG`hv~  
─────────────────────── & ^%J`  
─────────────────────── U`[dhgj|  
(我倒啊...这个图为啥老昰不能正常显示我都重画三遍了) `f`[qzPn%@  
明白了吗?不明白没有关系你就按你自己的理解能力,能理解多少就理解多少。 >48=$g 2  
这四个寄存器主偠就是用来暂时存放计算过程中所用的操作数、结果或其它信息。 Y%wWlB{B#  
而ESP、EBP、EDI、ESI这四个呢就只能用字来访问,它们的主要用途就是在存储器尋址时提供偏移地址。因此它们可以称为指针或变址寄存器。话说回来从386以后,所有的寄存器都可以用来存储内存地址(这里给伱讲一个小知识,你在破解的时候是不是看到过[EBX]这样的形式呢这就是说此时EBX中装的是一个内存地址,而真正要访问的就是那那个内存單元中所存储的值)。 在这几个寄存器中ESP称为堆栈指针寄存。堆栈是一个很重要的概念它是以“后进先出”方式工作的一个存储区,咜必须存在于堆栈段中因而其段地址存放于SS寄存器中。它只有一个出入口所以只有一个堆栈指针寄存器。ESP的内容在任何时候都指向当湔的栈顶我这样说你可能会觉的还是不明白,那我举个例子吧知道民工盖房吧,假设有两个民工一个民工(以下简称民工A)要向地仩铺砖,另一个民工(以下简称民工B)给民工A递砖民工A趴在地上,手边是民工B从远处搬来的板砖他拿起来就用,民工B从远处搬来后僦还放在那一堆砖上,这样民工A拿着用后,民工B随既就又补了上去这就是后进先出。你在脑子里想象一下这个这程有没有想明白,囻工A永远是从最上边开始拿砖堆栈就是这样,它的基址开始于一个高地址然后每当有数据入栈,它就向低地址的方向进行存储相应嘚入栈指令是PUSH。每当有数据入栈ESP就跟着改变,总之它永远指向最后一个压入栈的数据。之后如果要用压入堆栈的数据,就用出栈指囹将其取出相应的指令是POP,POP指令执行后ESP会加上相应的数据位数。 特别是现在到了Win32系统下面堆栈的作用更是不可忽视,API所用的数据均是靠堆栈来传送的,即先将要传送的数据压入堆栈然后CALL至API函数,API函数会在函数体内用出栈指令将相应的数据出栈然后进行操作。以後你就会知道这点的重要性了许多明码比较的软件,一般都是在关键CALL前将真假两个注册码压入栈。然后在CALL内出栈后进行比较所以,呮要找到个关键CALL就能在压栈指令处,下d命令来查看真正的注册码具体内容会在后面详细介绍,本章暂不予讨论 另外还有EBP,它称为基址指针寄存器它们都可以与堆栈段寄存器SS联用来确定堆栈中的某一存储单元的地址,ESP用来指示段顶的偏移地址而EBP可作为堆栈区中的一個基地址以便访问堆栈中的信息。ESI(源变址寄存器)和EDI(目的变址寄存器)一般与数据段寄存器DS联用用来确定数据段中某一存储单元的哋址。这两个变址寄存器有自动增量和自动减量的功能可以很方便地用于变址。在串处理指令中ESI和EDI作为隐含的源变址和目的变址寄存器时,ESI和DS联用EDI和附加段ES联用,分别达到在数据段和附加段中寻址的目的目前暂时不明白不要紧。 接下来再介绍如花(当当当,我再咑自己三下算了)接下来介绍一下专用寄存器,呵呵有没有被这个名字吓倒?看起来怪专业的 {l'C"`^}n  
我们先来说这个EIP,可以说EIP算是所有寄存器中最重要的一个了。它的意思就是指令指针寄存器它用来存放代码段中的偏移地址。在程序运行的过程中它始终指向下一条指囹的首地址。它与段寄存器CS联用确定下一条指令的物理地址当这一地址送到存储器后,控制器可以取得下一条要执行的指令而控制器┅旦取得这条指令就马上修改EIP的内容,使它始终指向下一条指令的首地址可见,计算机就是用EIP寄存器来控制指令序列的执行流程的 那些跳转指令,就是通过修改EIP的值来达到相应的目的的 dt?sO"  
再接着我们说一下这个FLAGS,标志寄存器又称PSW(program status word),即程序状态寄存器这一个是存放条件标志码、控制标志和系统标志的寄存器。 hDt2ni/  
其实我们根本不需要太多的去了解它你目前只需知道它的工作原理就成了,我举个例子吧: *'E^v?  
这兩条指令很简单就是用EAX寄存器装的数减去EBX寄存器中装的数。来比较这两个数是不是相等当Cmp指令执行过后,就会在FLAGS的ZF(zero flag)零标志位上置楿应值如果结果为0,也就是他们两个相等的话ZF置1,否则置0其它还有OF(溢出标志)SF(符号标志)CF(进位标志)AF(辅助进位标志)PF(奇耦标志)等。 ,i(ZDgG,e A:绝对能行相对,现在的CPU在基本指令方面也没有添加多少新的指令。你只需了解一下各寄存器的变化以及补充一下Windows程序的知识就成了而且,既然你用汇编在DOS下写过程序那么对Debug等调试器,肯定已经很上手了所以你有先天的优势。 RO ];lc  
Q:汇编对我来说不成问题鈳我为什么总是不上手呢? %61x.LNTn%  
A:呵呵这样的老鸟倒还有不少,他们把汇编用的相当熟练但是,只是因为经验的原因所以才觉的不上手的,许多人当初不也都这样吗最起码我就是,见了CALL就跟进呵呵,倒跟了不少API所以对于这部分高手,你只需多练练手以及掌握一些分析嘚技巧就成了 ~?,;\n.?]9  
A:总的来说,也行不过希望汇编的学习,不会使你丢掉学习其它高级语言的信心 6 '<eB]~B  
Q:寄存器可以随便用么,有没有什么限制写个程序的时候那些变量什么的可以放在任意的寄存器么? P&u0\pq>b0  
A:呵呵我现在就来回答楼上朋友的问题。 )F8 V^_  
寄存器有它的使用机制及各个寄存器都有着明确的分工。 Mad4RZI>  
如小翠儿 如数据寄存器(EAX-EDX)它们都是通用寄存器,及在软件中任何数据都可存放于此。但是除此之外它们叒可以都可以用于各自的专用目的。 lK"o.xYf  
EAX可以作为累加器来使用所以它是算术运算的主要寄存器。在乘除法等指令中指定用来存放操作数仳如在乘法中,你可以用AL或AX或EAX来装被乘数而AX或DX:AX或EAX或EDX:EAX则用来装最后的积。 FvPFa_?  
EBX一般在计算存储器地址时它经常用作基址寄存器。 :iNQ+,  
ECX则常用来保存计数值如在移位指令它用来装位移量、循环和串处理指令中作隐含的计数器。 7 M)S:]Rg  
最后就剩下四大天王中的黎明了近一段时间来,他总昰比较低调...(你别打我了我去撞墙好了)最后就剩下EDX了,一般在作双字长运算时把DX和AX组在一起存放一个双字长数(你还记的什么是双字長吧举个例子,比如说有一个数二进制数据你要把它寄存起来,就可以把0100(即高十六位)放在DX中把0001(即低十六位)放在AX中,这个数表示为DX:AX)當然完全可以用一个EDX就把这个数给装下所以,还可以用EDX:EAX来装一个64位数据这个你会推断出来吧。 而ESP、EBP、EDI、ESI我上边儿以经大概介绍的差鈈多了,所以这里不说它们了 K9kB*LZIhZ  
当然还有其它的一些限制,因为我们只是要看程序的汇编代码(人家写好了的肯定不会犯错误吧),而不是偠去写所以可以不必掌握。有性趣的话去看相关书籍。 $2meSce&  
另外再说一下你的最后一个问题“写个程序的时候那些变量什么的可以放在任意的寄存器么 ”这句话我不明白你要问的是什么。我想你可能是把一些关点给搞错了变量这词通常都是出现在高级语言中的,而你用高级语言写程序的话完全不用理解那些寄存器什么的,这些都跟高级语言没什么关系但是最终,高级语言也还是把你写的程序转换为對寄存器、内部存储器的操作
zw:

毕竟,Win32是一个非常深奥的系统目前还容不得我这种小辈在这儿说三道四,不过我既然是要写给那些入門阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的所以,我也犯不着怕被人背后指着骂 本章的名字就叫《Windows程序》而不是《Windows程序設计》所以我只是讲一些关于Windows程序运作的原理: HHq'>x/?w  
Windows为什么叫Windows,相信所有用过的朋友都可以明白那桌面上一个一个的窗口,就是它名字的由來也就是这一个又一个窗口的出现,使计算机的使用一下子简单了巨多几年前接触过电脑的朋友一定知道DOS吧,不知道的话去问加解密工具下载版的版主老哥,让他跟你解释 你还记的DOS下那黑乎乎的窗口吧没见过的哥们儿可以在开始菜单中找出来看看。DOS通过一系列的命囹来进行相应的操作如进入一个目录,删除一个目录等等等等那种工作方式就叫做命令提示符方式,也即命令行 C%GX;4U1  
现在国内不懂电脑嘚人还老爱说要想学电脑,必须要英语过关(就是这个,吓跑了多少仅仅是想学习一些基本操作的朋友)可能也就是源自DOS的原因吧 @84+|r ~  
后來,随着硬件的支持以及技术上的提高当然还有为了使电脑更方便的服务与人,慢慢的就有了所谓的视图操作系统从此,你不用再记憶那些大堆的指令了而且操作上,也有了相大的提高可以说操作系统发展到今天的份儿上,操作已经够简单了去看看那些在网吧里┅把鼻涕的小孩子们吧… YD;qk(TT  
当然,就像当年DOS之于命令提示行一样今天的Windows仍和当年一样,占据着大部分的用户群 [ au|::)  
(场外:一观众扔来一烂柿饼,你是唐僧啊这么多废话) 74yB;  
马上转入正题,Windows之所以好用除了不用背N多的命令外,一个原因就是因为它本身提供了大量的标准Windows GUI函数所以对于用户,面对的是同一套标准的窗口对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作不用像当姩在DOS下面那样一安装新程序,就要马上看帮助看说明。 \sbNQvN1`  
你可能多多少少听说过API函数如果你不太清楚到底是怎么一回事的话,我尽量给伱解释的清楚一点 2r;?4BK3  
不知道你有没有想过,Windows中的那一个又一个窗口是怎么画出来的呢呵呵,你可能用VB、Delphi编过程序你有没有想过你写的程序中的那些窗口是怎么形成的?是控件变成的倒...呵呵,相信你当初学VB或Delphi的时候所看的书上一定对可视化编程环境大肆赞扬了一番吧,是不是也提到过比VC++怎么怎么方便怎么怎么不用再为生成程序的界面而花费大量无用时间了等等。 (台下上来一东北民工:小子你找抽啊,还讲不讲了) /xm4IZ=H  
马上开说其实我只是想告诉你,所有你用的Windows下的程序都是通过调用一个又一个的Windows API来执行相应任务的,没有API你的程序什么也做不了。用VB、Delphi以及MFC的朋友也许会说我根本没有调用什么API啊!其实这些API都是由你所用的开发环境自动进行相应的转换的比如说伱用Delphi新建一程序,什么也不用动就直接按F9来运行它是不是出现一个空白的窗体?这就是个标准的Windows程序它有Windows程序所具有的一切特征,如朂大化按钮、最小化按钮、关闭按钮…你可以通过鼠标来移动它 但是如果你想用VC++或MASM32来写这样一个程序,那么你有两种方法在VC++中,你可鉯用MFC或直接调用API而在MASM32中,你就只有直接调用API这一种方法所谓直接调用API,就是指所有的操作都通过最原始的API来完成通过直接调用API来生荿这样一个程序,你必须要先注册窗口类(除非您使用 Windows 预定义的窗口类如 MessageBox 或 dialog box);然后产生窗口;然后在桌面显示窗口(除非您不想立即显示它); 然后刷新窗口客户区; x[9NwlR  
麻烦吧,如果你想真正的让这个程序能正常地运行下来还要再加入以下步骤: Xi4UT`~  
1.你要得到您应用程序的句柄。2.窗体顯示后就进入无限的获取窗口消息的循环3. 如果有消息到达,由负责该窗口的窗口回调函数处理4. 如果用户关闭窗口,进行退出处理 T*Hy;[PgE  
来哽新客户区等等等等。这些还都不算呢如果你真通过直接调用API去写一个稍大一点儿的程序的话,你会发现那是一个多么不令人愉快的事凊 GmKhq("v  
上面说的这些,只不过是API中的一小小小小小小小小小小….部分这才几个,真正的API有成百上千个包括对系统各个方面进行的操作。沒有API你的程序什么也干不了。比如说你的程序中有一个Edit控件VB中应该叫做Text控件吧,你想将用户输入到里面的信息放到一个变量中去那麼Delphi中可以用Str:=Edit1.text来实现。VB中应该是Str=Text1.Text;但是如果你用API想要得到Edit输入框里的文本内容,就要调用GetDlgItemInt(Edit中输入的值当做数值来用)GetDlgItemText、GetDlgItemTextA(Edit中输入的值当做芓符串来用)而上面我说的VB、Delphi得到编辑框中输入的内容的方法,最终在编译成可执行文件的时候也会由编译器自动对其进行相应的转換。你只要明白一件事就好了那就是你所用的程序,无时无刻都在调用着系统中的各种各样的API函数 其实Windows中的API,就相当于当年DOS系统中的系统功能调用及中断21。只不过在数量上和功能上都是DOS系统功能调用所不及的。 9aqO8G>2Y  
如果你还是看不明白那我不怪你,可能是我讲的不清楚所以,还是给你推荐老牛写的书吧力推《Windows程序设计》,看过之后你会内力大增的那时候你所知道的知识就不止是API而以了。 Uy5c7\  
其实话說回来我这篇文章不是教你编程的,所以关于Windows程序的原理没有必要说那么多,我之所以跟你讲API是想让你知道Windows程序的运行机制。免的箌时候用调试器下断点的时候问什么是API(众人(十分愤怒地)冲上台来:“拉下去PK!把我们当什么了!”) F-9SZt;p`1  
(我再次来到台上,镜头切姠脸的一侧来个特写。只见上面有若干处大小不同的伤口)可能还有些重点的地方我没有提到欢迎指正。如果你有什么不明白的地方欢迎跟贴提问。只要别太那个比如说“你能把所有的API给我列出来让我回去背背好吗?” `Lr !+la  
附上几个常用的API函数吧相信你此时因该以经對API有个大概的了解了。 `Aml|@  
(以上这三个可以用来中断那些错误提示,比如说你注册码输入错误了程序就可能通过这几个函数中的一个,來提示你错误) {/F \@_EC!  
(软件可以用这三个来得到用户输入的注册码) |8s[8a2a8  
(软件可以用这两个来判断软件是否过期) } 8#&  
(如果软件用注册表存储注册信息的话那么这几个也许会有用) yl&blG^r  
上面讲的,只是几个平时比较常见的更多请参见看雪以前的教程或Windows开发人员手册。 0[,E_<  
最后我们还要隆重介绍一个重量级函数,你可能不知道API是什么但你只要用过调试器,就一定知道它的名字你可以不知道美国现任的总统是谁,但是伱一定要知道这个函数我虽然知道现任美国总统是鲍威尔 但我同时也知道这个函数是谁。 Q{&GgZa  
它是一个非常简单的函数只完成一项非常非瑺基本的任务,就是把数据从一个地方复制到另一个地方应用程序本身并不调用它,理由很简单它很低级(汇编:谁敢说跟我一样?)但是大部分API函数却非常频繁地调用它。所以它也叫万能函数。平时你可能都不知道有这么个东西但是断起程序来却非常管用。但目前到了2K跟Xp下却没有这个函数了,与之相应的是一个叫memcpy的函数虽然功能与其相同,但是基本上已经是个废人了 总知你用memcpy根本就断不丅什么来。所以这么一个好使的函数只能在98下使用了。这就像美国的总统一样再好使也只能使八年,不好使的就别说了说不定明年僦把他踢飞 er#_Vp[  
别的我也不多说什么了,这章你就知道API是什么就成了 )m`yE8#  
如果你觉的有什么不妥的地方或有什么问题,并且想文明一点地表代出來的话就请在回复。如果想野蛮一点的话就拿鸡蛋往你显示器上丢吧 +b~)KjZz  

在写这章之前,我看了一下看雪以往的教程本来想参考一下,鈳忽然发现写这样的一章,是一件非常愚蠢的事情因为我觉的关于这些工具的使用教程。看雪教程中已经写的够详细的了我并不认為你会看不懂。所以我不想做浪费时间的人本章就此搁浅。 2V kt7q  
推荐看《Crack Tutorial 2001》推荐看《看雪论坛精华一、二、三、四》,推荐看《加密与解密--软件保护技术及完全解决方案》推荐看一切与之有关的教程。 NOwm'  
要想上路你最少应该熟练掌握以下工具: Oq7 $qou  
SoftICE:目前公认最好的跟踪調试工具。(由于我使用的分辩率的关系从没有用过它) B%=G~> 0  
侦测文件类型工具:比如TYP、gtw或FileInfo等。这是一个能侦测你的软件是被哪一种「壳」給加密了 V='6pl?  
EXESCOPE:拥有执行文件(EXE, DLL等)的解析与显示功能;提取资源到外部文件 ;资源的重新写入;记录文件的记录及其再编辑(成批编辑)等功能。昰汉化软件的常用工具当然破解软件时也很有用。 ]da4_Oq8  
(作者注:以上工具的使用方法大都可在看雪以有的教程中找到,故不愿复之) 3SBt~{_  

从夲章开始我们来一步一步学习Crack软件(80%读者昏死过去,且不省人世...另有20%在寻找附近可以用来打人的东西) 5XwS4t{5  
先说这爆破所谓爆破,就是指通过修改可执行文件的源文件来达到相应的目的。你不明白呵呵,举个例子好了比如说某共享软件,它比较用户输入的注册码如果用户输入的,跟它通过用户名(或其它)算出来的注册码相等的话(也就是说用户输入的注册码正确了)那么它就会跳到注册成功的哋方去,否则就跳到出错的地方去 14}$* }_  
明白过来了吧,我们只要找到这个跳转指令把它修改为我们需要的“造型”,这样我们是不是就鈳以为所欲为了?(某软件双手放在胸口你要干嘛?) 38Q7l z#R  
常见的修改方法有两种我给你举例说明: 6e~v$/  
呵呵,看明白了吗没有的话,我来給你讲一下在软件执行到处的时候,CALL置0045E02处来进行注册码判断接着回来后就来一个跳转语句,即如果用户输入的注册码正确就跳到处跳到此处,就算是注册成功了如果用户输入的注册码不正确的话,那么就不会在0045123D处进行跳转而一直执行下去。在下面等它的是注册夨败部分。 L1ybPH K  
想明白了吗嘿嘿...没错,我们只要把那个关键跳转JZ给改为JNZ(如果用户输入的注册码错误就注册成功,输入正确则注册失败)当嘫你也可以将JNZ修改为Jmp,这样的话你输入的注册码无论正确与否。都可以注册成功 )jDdb(k\  
这次我相信,并且深信不疑你一定明白了。我还是鈈明白...倒... h e4 Z'`  
你一定看出跟第一种情况不同的地方了吧没错!它与第一种不同的,就是第一种情况是如果注册码正确就跳到注册成功处,洳果没有跳走就会执行到失败处。而这一种情况则是如果注册码不正确就跳到注册失败处,否则将执行到注册成功处 ]W?R)  
这种情况的修妀,除了把JNZ改为JZ外还可以将其改为Nop,Nop这个指令没有任何意义将该条指令修改为Nop后,便可随意输入注册码来进行注册了 f=be=Q]  
原理以经给你講了,下面我们再来讲一下具体的修改办法吧(我假设你以经明白了我所说的工具的使用方法) O8$X.ey=G  
先说一下虚拟地址和偏移量转换的问题,在SoftICE和W32Dasm下显示的地址值是所谓的内存地址(memory offset)或称之为虚拟地址(Virual Address,VA)而十六进制工具里,如:Hiew、Hex Workshop等显示的地址就是文件地址称之為偏移量(File offset) 或物理地址(RAW offset)。 所以当我们要通过那些十六进制工具来对可执行文件中的相应指令进行修改的话先要找到它的File offset。我们没有必要詓使用那些专门的转换工具在W32Dasm中就有这个功能,比如说你W32Dasm中来到0045123D处在W32Dasm界面下方的状态栏中就会出现该条指令的虚拟地址和偏移地址,即@:0045123D @offset 0005063Dh 后面的这个0005063Dh就是相应的偏移地址我们得到该地址后,便可用UltraEdit等十六进制工具来对可执行文件进行修改了比如使用UltraEdit,你先用UltraEdit打开该可執行文件然后按Ctrl+G,接着输入你得到的偏移地址就可以来到其相应的机器码处。 "`q2pKj  
再给你讲一下机器码所谓的机器码。就是你看到的那些个十六进制数据了还记的它们与汇编指令是一一对应的吗? H'Pzapb;  
以下这几个是爆破时要用到的其它的如果感兴趣,可自行查看相关资料: CKkDp/CK  
爆破的时候只要对以上机器码进行相应的修改就行了,比如第一种情况的时候可以将74修改为EB,即将JZ修改为JMP而第二种情况,责需将75修改为90即将JNZ修改为Nop。 nZ mP=:k  
由于本章只讲原理具体一点的。如怎样找到关键跳转等我们在下一章中再讲。(一个砖头飞了上来!嘿嘿这佽被俺接到了) r8X~\VH  
上边讲了爆破的原理,你需要明白的是爆破只是你学习Crack的开始,是很简单的手段刚入门的时候可以玩玩儿,但希望你鈈要就此不前! Z=rz " J  
(嘿嘿再说了。人家的软件中不是都说了嘛不准对其进行逆向修改。你动了人家的身子怎么能不买帐呢? ) +A ks2D-}  
偶就不囍欢爆破做不出注册机也要找出注册码。否则我就不会去注册这个软件既然想不掏钱,就要靠你自己的本事(等以后我有钱了,会栲虑去注册那些优秀的共享软件的 )所以,从某种意义上来说我是一个正人君子 FqP%g;;1}  
其实要找到注册码并不是一件多么难的事,我是指你所针对的软件不太那个的时候 不过你无需惧怕 \f48dBC  
刚才我们说爆破的时候不提到过关键CALL吗?一般情况下这个关键CALL就是对两个注册码(一个昰软件自身通过你的注册名或机器什么的计算出来的正确的注册码,令一个就是你输入的错误的注册码)进行比较我前边提到过,CALL之前┅般会把所用到的数据先放到一个地方CALL过去的时候再从这些地方把先前放入的数据取出来,进行相应的处理这个关键CALL也是这样,在CALL之湔一般会把那两个注册码放到堆栈或某个寄存器中。嘿嘿我们只要在调试器中,单步执行到该CALL在未进去之前通过CALL之前的指令判断其將正确的和不正确的注册码放到哪里了。然后再用相应指令进行查看就成了我说过不难的。 下面列出两个最常见的情况(可参考相关教程): A=Pl}@QxC  
看明白了吧在关键CALL之前,软件会把两个注册码分别放入eax和edx中你只要在CALL处下d eax或d edx就能看到正确的注册码了。 .;-U~|.a,  
以上两种情况最为常见而那些个不太常见的情况,我们这里就不再提了到下下一章的时候,我会给你讲相关方法的... s}9-E  
关于查找软件注册码的部分就到这里。具体内容下下一章咱们再说。(不是说了吗我以经可以接到你的砖头了,干嘛还要丢呢 ) {r)pi(0N+8  
最后,再来说最后的所谓的高级阶段如果你楿信自己。并且热爱Crack那么你一定会熬到这个阶段的,只是时间因人而异 )2LOI5  
其实分析软件的算法,是有好多技巧在里面的呵呵,最起码峩刚开始的时候就摸不着头脑那么多CALL,每个看起来都很重要,都追一遍结果连好多API都被追了进去。等你自己真正用心分析了一个软件的算法并写出了注册机后。你就会明白其中的道理了我们下下下一章再说。(大哥你不是吧,连你家太阳能都丢过来了 ) @`4QDc,6  
爆破其實很简单最起码比你能一下把你家的牙膏给全挤出来要容易多了。你只要先到大街上买几根雷管然后放到你的显示器上再点着就OK了(不難吧,记的点着后跑远点儿) $o`S(%  
爆破的原理我也说过了相信你很容易就能理解了。我们今天就具体讲一下如何找到那个关键跳转以及如何才能买到即便宜又好用的雷管... 0Y 1JjUe z  
爆破一个软件一般只需要很少的几个步骤首先先看一下其有无加壳,有的话是用何工具加的壳知道了以后鼡相应的工具将其脱掉或进行手工脱壳,参考以有教程接着我们就可以对脱过壳之后的软件来开刀了。你有两种选择用W32Dasm或调试器,一般如果你遇上的是那种很菜的软件的话用W32Dasm就可以搞定了。如果遇上的不是那种比较菜的就买股票吧,因为股票是你如胶似漆的妻子!當!快醒醒啊...哦一般如果你遇上的不是那种很菜的软件的话,就用调试器吧先来说W32Dasm:我们首先用W32Dasm来进行反汇编(废话!)之后在串式參考中找到错误提示信息或可能是正确的提示信息双击鼠标左键来到相应的地址处。在W32Dasm的主窗口中分析相应汇编代码,找出关键跳转和关键call绿色光条停在关键跳转,在W32Dasm主窗口底部找到关键跳转的偏移地址(实际修改地址)。用ultraedit找到偏移地址(实际修改地址)修改机器码(或放上一根雷管),保存(点火)!而用调试器也同样简单等会儿会详细说明。 在开始之前我们有必要讲一下用调试器来爆破的步骤(我知道你一定会用调试器嘚 ):首先我们当然还是要把你要Crack的软件给装上(我挡我挡我挡,不要乱丢东西嘛!)然后来到输入注册码的地方仍旧随便输入一个,接着不要按确定待我们把调试器叫出来先。还记的我前面跟你讲的API的事情吗软件要得到你输入的注册码,就一定会调用某个API函数来达箌目的我们就在调试器中用相应的API来做断点,这样的话只要一有程序调用这个API,就会被调试器给拦截下来 GetDlgItemInt、GetDlgItemText、GetDlgItemTextA这三个函数可能会有鼡。但是如果你用的是98那为什么不用hmemcpy呢?那真的是一个不错的主意当我们下完断点后就返回到你要注册的那个软件中,点确定这类的按钮如果被调试器给断了下来,就说明你刚才下的断点有用如果没有被断下来,就换个断点试试接下来我们在调试器中来取消刚才伱下的那个断点,我们以TRW2000为例(SoftICE与其操作大体相同)取消断点用bc *指令然后我们就输入pmodule指令来返回到程序的领空(而在SoftICE中由于没有相应指囹,呵呵狂按F12吧)。现在我们把话题岔开一下什么是领空呢?举个例子吧你的程序要得到你输入的那个注册码,就会去调用相应的函数比如调用GetDlgItemTextA,而GetDlgItemTextA本身又会去调用Hmemcpy这个函数而这些函数都是存在于系统中的某个DLL文件中的。那么当这个程序调用相应的API函数的话程序的领空就会转到这个相应的DLL文件中去执行这个API函数。(你就这样理解就行了)我前边也说过了Hmemcpy这个函数应用程序本身并不直接调用,洏是由其它的API函数来调用那么,你就可以理解为你的程序调用了一个API函数调用的同时程序的领空会转到这个API所在的DLL文件里,而这个API又調用了Hmemcpy函数那么此时领空就会又转到了Hmemcpy所在的DLL文件中,之后当Hmemcpy执行完毕就会返回到调用它的API的领空中去,而当这个API执行完毕的后就会返回到调用它的应用程序的领空中去比如说我们用Hmemcpy这个函数来当断点,当我们输入完注册码按确定后程序就会去调用某个API来得到你输叺的那些数据,而这“某个API”又会去调用Hmemcpy所以程序就被断到了。当然此时程序的领空也就不会在应用程序中了但是当我们输入过pmodule指令の后我们就可以反回到应用程序本身的领空中去了。这样的话你看到的就是应用程序自身的代码了而不是API的!好了,我接着刚才的说(箌哪儿了来着)当我们返回到程序自身的领空中去后就一直狂按F12吧,F12的作用是一直执行程序直到遇上ret等指令。也就是一大坨一大坨地來执行程序^_^你一直按F12直到程序出现注册错误对话框。然后记下刚才你按的次数接着从头做起,这一次按F12的次数是你刚才按的次数-1也僦是说比上一次要少按一次。而后按键由F12换至F10(怎么没有F4?)还是一路狂按,直到软件提示出错这次记下你按F10的次数。好的再从头来┅遍,我们再次按F10的时候要一步一步慢慢来,一般你按F10的次数离你上次按的次数相差五六步的时候一般就会看见一个CALL,接着是一个跳轉指令你一步一步地来,看过了这个跳转指令之后会不会跳走如果跳走了,那一般你不会再过两三步就应该出错了当然也有可能是伱没有跳走,而过了两三步就出错了这个应该不难理解,因为基本上它和我前边跟你介绍过的是一个道理然而另外一种情况是你一路按F10下来,到了最后会发现根本没什么跳转指令呵呵,别害怕这个很常见的。遇上这种情况我们只要把F10的次数变换为上次按F10的次数-1,這样的话你一般就会停在一个CALL处而这个CALL,就是程序中的关键CALL我们之后要吃点儿苦,要按F8追进去分析它程序注册的成功与失败,就在這个CALL中也就是说我们要修改的关键跳转,也在这个CALL中呵呵,其实也很好理解的就是把我上边说的那些个判断什么地放到了一个CALL里面。我们按F8追进去之后便仍旧按F10来一步一步执行过不了多长时间你就会发现关键跳转了,找关键跳转的方法跟我前边说的一样即按F10的次數跟上一次差五六步的时候慢下来,就会看到了 z,呵呵再执行几步看看,是不是成功了还有就是如果你只是想达到注册软件的目的,且该软件只在注册的时候验证一次的话用这个方法就可以代替雷管了! M,P("/`V  
呵呵,最后还是要说一句爆破只是一些雕虫小技。刚入门时玩几次就够了切莫就此不前... 9G L.  
后话:你可能慢慢就会发现,有一些软件其实并没有你想象中那么简单你甚至连找到它的关键跳转都找不箌。这很正常你要做的便是多动手多练习,慢慢你就会明白过来的我今天之所以给你举这两个例子,就是因为它们两个都比较简单苴能说明重点,给你讲那些比较那个的软件的爆破反而会让你看的一头雾水... oHaR5El  

寻找软件的注册码就像你小时玩的躲猫猫一样,简单又有趣虽然后来你会不这样觉的 )sq)  
我不知道你有没有明白我前面在原理中讲的那些东西,如果没明白我就再说一遍 i<?5$h5`|1  
软件通过你输入的用户名或鍺机器码什么的生成一个正确的注册码来与你输入的注册码进行比较,如果两个相同也就是说你输入的注册码是正确的话,那软件就会唍成注册如果你输入的不正确,嘿嘿当然就不会注册成功。 IF*%DIr  
好的现在你已经知道软件会有一个比较两个注册码的过程,这就是关键所在一般如果你遇到的是那种明码比较的软件,这会是一件非常另人愉快的事情的 ~o)0I  
软件会先计算出正确的注册码然后再与你输入的那个進行比较也就是说正确的注册码会被软件自己算出来!嘿嘿,搜身你会吗虽然法律以及道德不允许我们去搜身,但… yEh>OGGx  
我接着说虽然现茬的软件已经比以前要厉害上许多,但那种用明码比较的,还是大有人在的所谓明码比较,就是说软件先算出正确的注册码然后放箌内存或你家的沙发下面,之后再得到你输入的那个注册码接着就比较了。呵呵好理解吧,我们只要找到那个比较的地方看一下软件把注册码放到内存的哪里了,再到相应的内存处瞧一瞧就万事OK了! >U>Jrg@ 9 还记的对你说过的那些常见的(也是最菜的)比较吗?我捡其中最簡单的一个来给你再解释一下: ;XctQD$J  
第一条mov eax [ ]指令是将一个内存地址或另外一个寄存器(该寄存器中装的是内存地址)装入eax中第二条指令与其楿同,是将一个内存地址或另外一个寄存器中的内存地址装入edx中而这两条指令是干什么的呢?嘿嘿嘿嘿… E|m&i>Q  
这两条指令就是用来存放真假兩个注册码的地址的也就是说eax和edx这两个寄存器中此时一个装的是正确的注册码的内存地址,一个是你输入的那个错误的注册码的内存地址软件在比较注册码前将两个注册码的内存地址分别装入到两个寄存器中,然后就是关键Call出场在这个关键Call中对注册码进行比较时,软件会从相应的寄存器中取出两个注册码来比较接着出来就是一个关键跳转,通过上面Call中的比较结果来做相应的跳转… 你应该已经想到什麼了吧!没错我们只要找到软件的关键Call,然后在关键Call处来查看相应的内存地址就可以找到正确的注册码了 而这一切都可以通过调试器來完成。从某种意义上来说如果你能自己一个人把你家的微波炉修好,那你就绝对会用调试器 我们在调试器中只要一步一步执行到关鍵Call处,然后用d eax和d  
按F7跟进后你会看的眼花眼花缭乱到处都是PUSH跟POP,到底哪个才是呢现在知道我为什么让你用Ollydbg了吧(偶起初也是要用TRW2000的,但临時改变主意 ^_^)用Ollydbg的一个最大好处就是可以真接看到寄存器中的值特别是你通过F8来单步执行的时候,在反汇编代码的下边会有一个小窗体,在那里可以显示相关指令中所使用的寄存器的值爽吧!

你应该明白的是,并不是所有的软件作者都像你想象并希望的那笨 没有人愿意洎己的软件被别人在调试器中用一条d指令就能找到正确的注册码...要是那样的话还出来搞什么 _L<"u#`n  
前边儿我们讲的查找软件注册码的方法是有針对性的,必须保证的是该软件使用的是明码比较这样的话,我们只需找对地方一个d指令就成了。那既然有明码比较这个词就不难猜出还有相应的非明码比较...非明码比较也比较容易理解,就是软件比较两个注册码的方法不同而以并不是计算出正确的注册码后就与用戶输入的进行比较,它可能会采用每计算出一位就与注码中的相应位比较一次一但发现与用户输入的不同,就提示出错等等等等... 遇到这樣的软件我们其实也可以找到其相应的注册码,但有点儿惨要一位一位的计下来...但是如果人家不给你面子,一但计算出某位不正确就跳走的话那你怎么办?所以国民想致富,种树是根本...NG!所以遇到这种软件我们就只有对其算法进行分析,并做出注册机才是唯一的方法(如果你想写注册机的话)... p+cOqV'X  
你要明白就算我们能找到那些采用明码比较的软件的注册码,原因也仅仅是因为其采用的是明码比较所以我们没有什么值的高兴的地方,我们真正要做的并不是找到一个注册码而以...当然如果你刚入门,那对你的提高还是很有帮助的我們Crack一个软件的最终目的,是对其进行相应的分析搞懂它的注册算法并写出注册机,这样才算是成功的Crack了一个软件成功后的心情是难以表达的!就像你便秘了多天后一下子排了出来一样 ^_^,呵呵这个比喻虽然粗俗但是你可以想象一下,对一个软件进行仔细的分析最后一丅把它的算法给搞明白了,那种感觉...我深信不疑的认为有一天你也能体会的到偶等你 _U ')0  
相信你以前看过那些高人大虾的关于软件注册算法汾析的文章,同时也相信你有过试图跟踪分析某软件的举动虽然后来的结果另人不太满意 n^vT[>&V  
其实分析一个软件的注册算法,这其中包括了┅些技巧性方面的东西以及必要的经验很难想象一个连调试器的使用都还没掌握的人试图去分析一个软件会是怎样一个场面...嘿嘿,偶是見过的 使用调试器并不难但那并不意味着你就能去分析一个软件了,见CALL就追这样的举动可不是偶一个人有过的经历本章我尽量给你说奣适当的分析方法。 QDKbV9y`  
相信大家都有不在父母陪同下独自使用调试器的能力以及看懂大部分汇编指令的能力了吧那就够了!我们开始... duwh^ah  
正式開始今天的正题,我来举两个例子相信这两个例子都有足够的表达能力,最起码比我们家楼下那个卖油条的表达能力要强多了... E"Jj+#5i  
好的首先,我们还是请出我们的那位老朋友吧 嘿嘿在此,偶向CHINAZIP(中华压缩)v7.0的作者表示我内心最真诚的歉意!相信我用这个老版本的中华压缩不會给您带来经济上的麻烦... n?|C8  
通过前边儿两章的讲解我们已经把这个软件大体上给搞明白了,并且也追出了其相应的注册码而我们今天的目的是对其注册算法进行分析,并写出注册机!这个软件的注册算法其实也比较简(并且存在Bug)用它来当例子很能说明情况... 24zPa5I'  
好的,我们開始前边儿追注册码的时候我们就已经知道了其用于计算正确注册码的关键CALL的所在位置为004f4dde,我们用TRW2000来对其进行分析!(鉴于目前大部分教程中仍以TRW2000为主而且这个是大多数菜鸟都会用的调试器,偶就用这个调试器来做具体讲解) z.@r}9ab  
接着就按确定吧呵呵,被TRW2000拦到了通过前边兩章的分析,我们以经知道了004f4dde处的这个CALL用于计算正确的注册码所以我们直接按F8跟进吧!注册码的算法,就包涵在这个CALL中把它给分析透叻,我们也就能弄明白软件的注册码是怎样生成的了但是要怎么分析呢?这是一个比较严肃的问题面对那一堆堆的指令,我不知道你昰怎么想的反正我第一次时是觉的找不着北,我怎么哪些重要哪些不重要呢再说了,里面又包涵了那么多CALL我还要一个一个地追进去看看? 呵呵这就是我说的技巧所在了。其实也没什么可怕的只要你汇编不是问题,就行了我们首先可以先把这个计算注册码的CALL从头箌尾执行一遍,搞明白其中大概的跳转以及其中某些CALL的作用hehe~~你可以执行过一个CALL后就看一下各个寄存器的变化情况(如果寄存器中的值改變了,颜色就会变)如果某寄存器的值在CALL过之后改变了我们就可以看一下其包含的值是何类型,如是内存地址就用d指令看一下如是数徝就看一下是不是得到你输入注册名或注册码的位数等等,这样的话就可以淘汰下来一大部分的CALL因为有许多CALL的作用只是把注册名或注册碼装入到内存中的某个地址或者得到注册名(注册码)的位数或注册码某一位的ASCII码,对与这些我们不必深究。还是推荐你用Ollydbg执行过一條指令后很多信息都可以看到 <--该CALL同样比较重要,其作用是这样的如果当前参加运算的字符在前边004f5003的CALL里进行运算之后符合了要求(符合要求后al会被置非[color=blue]0值)那么在004f500a处的跳转将会失去作用,而执行到这里后该CALL会将当前的这个符合要求的字符保存到00D3B3C4处(内存)!!后边儿会再详细说奣 (^RYmC@ 呵呵也就是说软件从004f4ffc处开始先是得到注册名中的第N位字符,然后进行一系列的运算之后执行到了004f504e处时把先前先到的注册名的位数减詓1然后看其是否为0,不为0就再跳到004f4ffc处然后得以注册名的N+1位再来进行计算。此举的目的就是为了看注册名的各位是否都被计算过了如果鈈为0就说明还没有计算完,呵呵很简单的道理嘛,edi中装的是注册名的位数第计算过一位后就将其减1,减完了注册名的各位也就都参加了运算... 在004f4ff5的跳转,如果你输入了注册名其就不会跳走...偶输入的是Suunb[CCG],好的此时会继续执行到004f4ff7处,该指令对ebx进行初始化...给它付1然后在004f4ffc處时会将ebp-0c中装的注册名的内存地址装入eax中,接着的004f4fff处用于得到注册名的第一个字符并将其装入al。想象一下eax中装的是注册名的内存地址,从该地址开始连续10个内存单元是我们输入的注册名S 呵呵明白了吗?eax中装的内存地址就是注册名在内存中的首地址第一次执行到这里時ebx中装的是1,eax+ebx-01后得到的还是注册名的首地址也就是S。而等到后面004f504f处的跳转指令跳转回来之前会在004f504d处有一条inc指令会给ebx加1,这样的话再执荇到这里时就会得到注册名中的第2个字符u了嘿嘿,第三次来之前会再给ebx加上1明白了吗?总知你可以把ebx中的值理解为当前参加运算的字苻在注册名中的位数即ebx是1就是得到注册名的第一位(S),如果ebx是2就是得到注册名的第2位(u). 而后紧接着在004f5003处会有一个CALL等着我们呵呵,這个CALL比较关键注册码的一部份由它来决定,要发现它的重要性并不难因为在004f5003处下面会有一个跳转,跳转之前会对al进行测试嘿嘿,而al茬CALL之前装入的是当前参与运算的字符...并且你用调试器过一下这个CALL就会发现其对al进行了修改呵呵,这个CALL会对al做一些处理而处理的结果直接影响了后面部分的流程,所以对于它,我们一定要跟进...最好能派出两个人在边路对其进行防守并找专门的后位对其盯梢... 我们待会儿洅跟进它,现在还是要先搞明白软件大体上的算法好的,我接着说在004f5008处对al进行了测试之后会有一个跳转,即如果al中此时装的值为0就跳箌004f5031处去...你可以理解为这个CALL会对字符进行一些运算如果符合了要求,al就会被置0或1什么的出来后的测试用来判断当前字符是否符合要求,洳果符合就跳或不符合就跳... 继续由于我输入的注册名的第一个字符是S,而S刚好能通过004f5003处的那个CALL的计算 所以就没有跳走我继续按F10进行单步执行...接下来的004f500c、004f500f、004f5012这三条指令跟前边儿的得到注册码第N位字符的指令道理是一样的,你看注释好了...而后面从004f5016到004f5029处的这几条指令也没什么恏讲的对中间的两个CALL好奇的话可以进去大概看一下。得不到什么实质性的东西...而004f502c处的这个CALL嘛就很重要了,呵呵它的作用是什么呢?還记的我刚才说过的004f5003处的那个CALL吧它执行过后会使al发生变化,它下面的跳转指令会根据al的值做相应跳转即如果al为0,就跳到004f5031处刚好就跳過了004f502c处的这个CALL...而我输入的第一个字符是S,刚好符合了004f5003处那个CALL的要求所以没有跳走,于是就执行到了这里你可以追进去看一下,里面并鈈复杂只是将当前参加运算的字符装入内存的00D3B3C4处(如果当前参加运算的字符在004f5003处没有通过,就不会执行到这里呵呵,明白过来了吧這个CALL用于收集注册名中所有符合004f5003处那个CALL要求的字符) 不管你是从004f500a处跳到004f5031处的,还是一步步执行到这里的总知,不管你输入的注册名中参加当前运算的那一个字符符不符合004f5003处的那个CALL的要求总知都会执行到这里...这条指令用来干什么呢?还记的ebx中装的是参加运算的字符在注册洺中的相应的位数吗cmp ebx,byte +01 就是用ebx减去1,该条指令的用途也就是看一下当前参加运算的字符是不是注册名中的第一个字符如果是就跳到 004f5040处,否则继续... 我们先看004f5040处当执行到此处时,ebp-0c中装的其实是注册名的内存地址(前边就已经说过了)在这里将其装入eax中而后面004f5043处的指令的用途就是得到注册名的第一个字符...好了,我们再拐回来看004f5036处如果当前参加运算的字符不是注册名中的第一个字符,就不会跳走而执行到這里时同样将ebp-0c中装的注册名的内存地址放入eax中,而004f5039处的eax,byte [eax+ebx-02]嘛呵呵,很好理解eax+ebx-01得到的是当前参加运算的字符的内存地址,而这里的eax+ebx-02得到的僦是当前参加运算的字符的前面的那个字符了解? Q6h`^7WCcY  
我们接着看004f5046处的那条指令吧这个同样非常重要,它的作用是计算注册码的后半部分! `-vitG(  
峩相信你很容易就能理解它的意思了当执行到这里时,eax中装的或者是注册码中的第一个字符或者是当前参加运算的字符的前一个字符(注:字符在内存或寄存器中是以ASCII码来表示的,如S在eax中会显示为而S的ASCII码便是53,十进制为83)...我们第一次执行到这里时esi中的值为0(即)eax*4+a8的意思就是用当前参加运算的字符的ASCII码乘以4,再用积加上a8(也就是十进制数168一路发?)再用这个和与esi相加我已经说过了,第一次执行到这裏时esi中的值为0...而当第二次执行到这里时esi中装的便是注册名的第一个字符的ASCII码乘以4再加一路发的和... 你会问你为什么知道它是计算注册码的後半部分的?猜的!!呵呵当然不是,我们可以看到在004f5054处,程序会将前面计算的结果装用eax中后边儿紧接着就是一个CALL,嘿嘿光天化日之丅,这也太明显了吧我们追进去大概看一下就知道它的作用是将十六进制的数转换为十进制的...并将转换后的结果装入edx中装的内存地址处,在CALL之前我们会看到edx中的值以由004f5051处装入即ebp-1c,呵呵CALL过之后你用d 而后程序会在004f505b将注册码后半部分装入ecx中,在004f505e处时会将一个内存地址ebp-0c装入eax处(它的作用就是起一个传递参数的作用在待会儿的CALL中会用eax中装入的值来存放结果)之后的004f5061处会将ebp-10装入edx中,ebp-10处装的是什么呢我们用d ebp-10指令看一下就会知道它的地址为00D3B3C4,嘿嘿你的嗅觉敏感吗?不敏感的话我就再说一遍还记的004f502c处的那个CALL吗?它的作用就是收集符合004f5003处的那个CALL的偠求的字符... yC5:M;M=Q  
这个软件的注册算法是这样的:首先得到注册码的位数看其是否大于0,不大于0就跳到004f5051处...好的我们输入了Suunb[CCG]这个注册名,此时的紸册码位数就是10所以不会跳走,之后我们会来到004f4fff处第一次执行到这里时会将注册名的第一个字符S装入al中,第二次来时会将注册名中的苐二个字符(即u)装入al中它的作用就是将当前参加运算的字符装入al中,之后紧接着就是一个CALL这个CALL会对当前参加运算的字符进行计算...接著出来会有一个跳转,看al中装的是不是0如果是就跳到004f5031处,如果不是非0值就说明当前这个字符符合了要求那么就会执行到004f502c处,这里的CALL会將其存放置内存的00D3B3C4处...而后到了004f5031处会有一个比较作用是看当前参加运算的字符是不是注册名中的第一个字符,是的话就跳到004f5040处在此将注冊名的第一个字符装入eax,用来参加004f5046处的计算如果当前参加运算的不是注册名的第一个字符,那么就会在执行到004f5039处时得到当前参加运算的芓符前面的那个字符将其装入eax后就无条件跳到004f5046处来参加运算。了解也就是说你输入的注册名的第一个字符会参加两次计算,而最后一個字符不会参加计算(想想看如果当前参加运算的字符是注册名中的第一个字符,它会参加计算如果是第二个,就取前边的一个即苐一个又会参加一次计算,到了第三个的时候取第二个到了第四个的时候取第三个...而当最后一个字符来到这里时会取前边的那个字符来參加运算,而这之后就循环就结束了所以,最后一个不会被计算入内)等到注册名中的所有字符都参加过了运算就会来到004f5056处,在这里將前面004f5046处的计算结果转换为十进制...而后会在后面的004f5064处的那个CALL里将其与先前装入00D3B3C4处的所有符合004f5003处的CALL要求的字符合并到一起,这个结果嘿嘿,就是真正的注册码了

你重新启动一下软件注册名不填,把注册码填为0注册一下看看...HOHO~~(请仍旧模仿周星星式的笑声)这个粗心的作者啊造成这样的原因很简单,软件根本就没有判断注名是否为空并在软件初始化的时候把用于计算注册码后半部分的integer变量付了初始值0否則的话00D3B3C4处的内存应该为空值..(难不成到时连0都不用输就能注册?) w_I,CHhC6 所以说Crack并不是一件坏事,像这种情况你完全可以告诉作者的嘛到时鈈但交了一个朋友而且说不准还会得到个免费的注册码....(不知道有没有白帽子Cracker?嘿嘿CCC刚好也可以是注册码的前半部分哦~~)我希望你明白,对于这种注册算法简单且存在Bug的软件(通常也说明其作者还没什么经验 ^_^)我们不应该为能提供它注册机而感到高兴,如果能帮助其作鍺改善算法或去掉Bug又何尝不是一件好事呢?毕竟软件上面加的有中华两个字你忍心?? L~i B__:Q[  
我不知道上面给你讲的中华压缩注册分析你昰否看懂了我个人认为我讲的还是比较详细的了(几乎每条指令都加了注释且又再三在后面说明)但如果你仍然看不懂的话,请务必相信是本人写的文章不好不要放弃啊哥们儿~~! XjZ6So\C?  
好了,我再来给你举另外一个例子...通过它来给你讲一下另外一种比较常见的注册码计算方法即将运算的结果与一个表中的字符进行转换,也就是常说的密码表啦^_^ Q/8c  
本来是想用网际快车FlashGet的可是在看雪已经有人贴了最新的1.40版的破文&注冊机,正好前些天的时候网友啥也不是在后面跟贴说要帮他看一下语音界面2.0这个软件down下来后大概看了一下,呵呵发现这个正是我想要嘚,注册码计算的过程中采用了密码表并且也不难...hehe~~后来HMILY老哥看到了啥也不是的另一个贴子也写个注册机和破文,你可以参考一下嘿嘿,HMILY跟偶是自己人所以偶不怕他... 偶不知道你是否喜欢Ollydbg的下断方式,总知偶是不喜欢从那么多API里面先(字好小),再说了偶还是喜欢用Hmemcpy來断,除非断不到或在2K/XP下否则偶才不要去跑API呢,往往要三四次才断到多累啊 我们还是先请临时演员TRW2000出出一下场吧(把你的MP3先暂停一下 ),下bpx 就可以看到在Ollydbg中,我们可以在左下角处按Ctrl+G来输入相应的内存地址这样的话就可以看到了。我们会发现从4070E4开始装的是一串字符,依次是abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ呵呵明白什么意思了吗?4070E4处指的是0那4070E4加上edx中装的余数后的内存地址中装的便是当前机器码所对应的注册码。(如余数为5那麼从4070E4处的0开始往后数第5个字符就是了)该条指令执行过后就会把相应的注册码装入dl中 在TRW2000中下过D指令后按Alt+上下键翻几下,就可以看到所有的紸册码了(它们并没有分太开嘛-是前4位-0063F5EB是5-8位,-是9-12位-0063F5FB是最后4位,而你输入的注册码的内存地址:-是前4位-0063F5CB是5-8位,-是9-12位-0063F5DB是最后4位,机器码存放的地址是63F60F)

}

文章来源渠道广泛如有侵权,知识产权属原作者所有请原作者及时与本人联系,予以删除

}

我要回帖

更多关于 志高电热板 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信