菜鸟破解从头学之全教程Word格式.docx

上传人:b****3 文档编号:16558985 上传时间:2022-11-24 格式:DOCX 页数:71 大小:79.28KB
下载 相关 举报
菜鸟破解从头学之全教程Word格式.docx_第1页
第1页 / 共71页
菜鸟破解从头学之全教程Word格式.docx_第2页
第2页 / 共71页
菜鸟破解从头学之全教程Word格式.docx_第3页
第3页 / 共71页
菜鸟破解从头学之全教程Word格式.docx_第4页
第4页 / 共71页
菜鸟破解从头学之全教程Word格式.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

菜鸟破解从头学之全教程Word格式.docx

《菜鸟破解从头学之全教程Word格式.docx》由会员分享,可在线阅读,更多相关《菜鸟破解从头学之全教程Word格式.docx(71页珍藏版)》请在冰豆网上搜索。

菜鸟破解从头学之全教程Word格式.docx

我只是想说给那些只是因为一时冲动才学习破解的人,请将你们当初的冲动继续维持下去,你需要明白,学习破解的目的不只在于破解软件这个词,也许后来你会变为软件分析,随着学习时间的增加,对你的编程水平,相信会有相当大的提高。

学习别人好的思想,并化为已用 

就我个人来说,学习破解可以把我的汇编的基础给打好,呵呵,俺对操作系统这玩意儿感兴趣,到时候还想写出来个玩玩儿呢,所以汇编这关必须要过....

我很笨,那些大虾的教程我大都看不明白,我能学会吗?

永远不要说你笨,你只是学的比人家晚而已,太高深的看不懂,那你就捡能看懂的看,别人能入门,你也能,不得要领只是暂时,大虾与你,也许差的就是一两年时间的问题。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

稍微有点儿计算机知识的朋友一定知道,计算机是只识别0和1的,最初那会儿,要写程序,就要用0和1来写,呵呵,Cool吧!

所以曾经有过的对程序员的崇拜,可能就源自那个时候吧 

后来,人们发现用0和1来写程序,太不爽了,不但写起来不上手,而且回过头来看的话,应该很难再看明白了,总之出于这些原因,就有了汇编语言。

汇编语言用一些助记符来代替0和1的多种组合,也就是各个指令,这样的话,从一定程度上来说,方便了许多。

但是,汇编也同样不方便,同样写起来不爽,而且后期维护同样不方便,再加上人们慢慢地需要写一些更大的程序,在这样的情况下,高级语言就被人发明了出来,就是我们今天用的Basic、pascal、C、C++等等等等,这些语言的出现,一下了使程序的开发难度大大减低了,以前用汇编要很长时间才能开发出来的程序,现在只需要很短的时间且很轻松的就可以搞定了,特别是最近几年,可视化编程的大肆普及,使程序员的神秘感一下子摔了下来,Coder这样的词现在都满天飞了。

但是汇编还是有它先天的优势的,因为其与CPU内部的指令一一对应,所以在一些特殊的场合,必须由汇编来实现,比如访问硬件的端口、写病毒….

而且生成的可执行文件效率巨高,且生成的可执行文件贼小,写小程序是很爽的,呵呵,而且用汇编写注册机,是件很轻松的事,你不用再为怎样还原为你所熟悉的语言而为难。

说了这么多,还是切入主题吧(昏倒观众若干):

既然计算机只识别0和1,那么,所有存储在计算机上的文件,也都是以二进制的形式存放的,当然也包括可执行文件了。

所以,你只要找一个十六进制编辑器比如UltraEdit什么的,就可直接打开并查看可执行文件了,呵呵,如果你能看懂的话 

你会发现,此时看到的,全是些十六进制数值(每4位二进制数可转换为一位十六进制数),这就是可执行文件的具体内容,当然,其中就包括可执行文件的代码了。

(一头老牛:

好亲切啊)(一只菜鸟:

笨牛,你给我闭嘴,我眼都花了)。

呵呵,此时,你是不是觉得看这些东西,有些那个?

这些东西看起来就像有字天书,没人能*这玩意儿来进行分析,于是乎。

就有了相应的软件,可以将这些十六进制数值转换为相应的汇编代码,这样的话,我们就可以对别人的软件进行分析了。

这就是所谓的逆向分析了。

呵呵,聪明的你现在一定在想,如果找到软件计算注册码的部分,并对其进行分析,弄懂它的计算方法,那么你不就不用通过¥的方式来进行软件注册了吗?

当然,你也可以将此计算过程还原为任意一个你所熟悉的编程语言,那么,编译后的这个程序,就叫做注册机,它的功能就是计算某一特定软件的注册码。

(呵呵,是不是经常在软件中看到此类说明?

"

禁止制作和提供该软件的注册机及破解程序;

禁止对本软件进行反向工程,如反汇编、反编译等"

作者这样做,心情我们是可以理解的,毕竟人家花了那么多心思在自己的软件上,所以,我不希望你仅仅是因为交不起注册费的原因来学习破解。

总的说来,上边儿的介绍有点儿太理想化了,上面提到的分析方法,就是所谓的静态分析,此类分析常用的工具有W32DASM、IDA和HIEW等。

静态分析,顾名思义,就是只通过查看软件的反汇编代码来对软件进行分析。

一般如果只是想暴破软件,只进行静态分析就够了。

但要想真正的弄清注册算法,一般还是要进行动态分析的,即能过调试器来一边执行程序一边进行分析。

具体内容,我会在《破解原理》和《调试器入门》中详细说明,呵呵,毕竟现在都以经有点儿跑题了。

我废话说了这么多,其实就是想告诉你汇编的重要性,我不要求你精通,但最少你也得能看懂吧,要不,还谈什么分析?

虽然有哥们儿一点儿汇编都不懂就上路了,甚至还破掉了几个软件,但是,这样是不是惨了点儿?

难不成你想暴破软件暴破一辈子?

其实你完全不用惧怕汇编的,看上去怪吓人的,其实跟你平时背那些控件的属性方法差不多,MFC那么多你都搞的定,汇编命令才有多少?

而且,汇编不光只是在Crack软件时有用,在好多地方也都有用,且用处巨大,所以我觉得,把汇编拿下,是件义不容辞的事:

你只要相信它并不难就好了。

(以下为第二次修改时加入)

先给你讲一下CPU的组成吧:

CPU的任务就是执行存放在存储器里的指令序列。

为此,除要完成算术逻辑操作外,还需要担负CPU和存储器以及I/O之间的数据传送任务。

早期的CPU芯片只包括运算器和控制器两大部分。

到了近几年,为了使存储器速度能更好地与运算器的速度相匹配,又在芯片中引入了高速缓冲存储器(知道为什么P4比P4赛扬贵那么多吗?

)。

(当!

一个硬物飞了过来,话外音:

你讲这些做什么,我们又不要设计CPU)

你急什么嘛,由于汇编比较“低级”;

;

所以它是直接操作硬件的,你以为这是用VB呢,想什么时候用变量随手就可以拿来用,你不掌握好CPU内部的一些工作分配情况,到时怎么来看汇编代码啊。

又一声,重要还不快点儿说)

除了高速缓冲存储器之外的组成,大体上可以分为3个部分:

1.算术逻辑部件ALU(arithmeticlogicunit)用来进行算术和逻辑运算。

这部分与我们的关系不太大,我们没必要管它。

2.控制逻辑。

同样与我们的关系不大。

3.这个才是最最重要的。

工作寄存器,它在计算机中起着重要的作用,每一个寄存器相当于运算器中的一个存储单元,但它的存取速度却贼快贼快,比存储器要快很多了。

它用来存放计算过程中所需要的或所得到的各种信息,包括操作数地址、操作数及运算的中间结果等。

下面我们专门的介绍这些寄存器。

在介绍之前,有必要说点儿基础性的知识。

知道什么是32位吧,就是说寄存器是32位的,晕~~等于没说。

在CPU中,一个二进制位被看作是一位,八位就是一个字节,在内存中,就是以字节为单位来在存储信息的,每一个字节单元给以一唯一的存储器地址,称为物理地址,到时候访问相应的内存,就是通过这个地址。

八个二进制位都能表达些什么呢?

可以表达所有的ASCII码,也就是说一个内存单元可以存储一个英文字符或数字什么的,而中文要用Unicode码来表示,也就是说两个内存单元,才能装一个汉字。

十六位就是两个字节这不难理解吧,当然啦,那有了十六位,就肯定有三十二位六十四位什么的,三十二位叫做双字,六十四位就叫做四字。

今天我们所使的CPU,相信全是32位的了,除非你用的是286或更早的话。

自然而然,CPU中的寄存器,也就是32位的了,也就是说一个寄存器,可以装下32个0或1(这其中不包括段寄存器)。

大体上来说,你需要掌握的寄存器,有十六个,我一个一个给介绍给你:

首先,介绍小翠儿(当!

,我自己打我自己一下得了,最近看周星驰看多了),重说,首先,介绍通用寄存器。

一共八个,分别是EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI。

其中,EAX—EDX这四个寄存器又可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位(还计的我说它们是32位的吗?

)进行访问。

它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。

而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。

其它三个寄存器请自行推断。

这样的话,你就可以应付各种情况,如果你想操作的是一个八位数据,那么可以用MOVAL(八位数据)或MOVAH(八位数据),如果你要操作的是一个十六位数据,可以用MOVAX(十六位数据)三十二位的话,就用MOVEAX(三十二位数据)也许我这样说,你还是会不明白,没关系,慢慢来,我给你大概画张图吧,虽然不怎么漂亮:

───────────────────────

│ 

高十六位 

EAX 

AH 

AX 

AL 

(我倒啊...这个图为啥老是不能正常显示?

我都重画三遍了)

明白了吗?

不明白没有关系,你就按你自己的理解能力,能理解多少,就理解多少。

这四个寄存器,主要就是用来暂时存放计算过程中所用的操作数、结果或其它信息。

而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联用,分别达到在数据段和附加段中寻址的目的。

目前暂时不明白不要紧。

接下来,再介绍如花(当当当,我再打自己三下算了)接下来,介绍一下专用寄存器,呵呵,有没有被这个名字吓倒?

看起来怪专业的。

所谓的专用寄存器,有两个,一个是EIP,一个是FLAGS。

我们先来说这个EIP,可以说,EIP算是所有寄存器中最重要的一个了。

它的意思就是指令指针寄存器,它用来存放代码段中的偏移地址。

在程序运行的过程中,它始终指向下一条指令的首地址。

它与段寄存器CS联用确定下一条指令的物理地址。

当这一地址送到存储器后,控制器可以取得下一条要执行的指令,而控制器一旦取得这条指令就马上修改EIP的内容,使它始终指向下一条指令的首地址。

可见,计算机就是用EIP寄存器来控制指令序列的执行流程的。

那些跳转指令,就是通过修改EIP的值来达到相应的目的的。

再接着我们说一下这个FLAGS,标志寄存器,又称PSW(programstatusword),即程序状态寄存器。

这一个是存放条件标志码、控制标志和系统标志的寄存器。

其实我们根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我举个例子吧:

CmpEAX,EBX 

;

用EAX与EBX相减

JNZ00470395 

不相等的话,就跳到这里;

这两条指令很简单,就是用EAX寄存器装的数减去EBX寄存器中装的数。

来比较这两个数是不是相等,当Cmp指令执行过后,就会在FLAGS的ZF(zeroflag)零标志位上置相应值,如果结果为0,也就是他们两个相等的话,ZF置1,否则置0。

其它还有OF(溢出标志)SF(符号标志)CF(进位标志)AF(辅助进位标志)PF(奇偶标志)等。

这些你目前没必要了解那么清楚,会用相应的转移指令就行了。

最后要介绍的就是段寄存器了(刚才是谁说的樱红?

反正不是我)

这部分寄存器一共六个,分别是CS代码段,DS数据段,ES附加段,SS堆栈段,FS以及GS这两个还是附加段。

其实现在到了Win32环境下,段寄存器以经不如DOS时代那样重要了。

所以,我们知道就行了。

啰嗦了这么多,相信你对CPU以经有了个大概的了解了吧。

什么?

还是什么也不明白?

呵呵,那也不要灰心,请相信这是我的错,是我没有讲清楚而已,你可以去参考一些书籍。

我始终觉的,你案头有一本讲汇编的书是非常非常有必要的,我这边儿是清华版的《80x86汇编语言程序设计》沈美明主编,46元。

我们接下来就再讲一讲一些常用的汇编指令吧。

(由于考虑到目前以经有了相应的帖子,所以,我只是从汇编指令中,挑出一些最常用,需要掌握的,更多内容,还请参见书本。

CMPA,B比较A与B其中A与B可以是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址。

这个指令太长见了,许多明码比较的软件,就用这个指令。

MOVA,B把B的值送给A其中,A与B可是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址。

Xora,a异或操作,主要是用来将a清空

LEA装入地址,例如LEADX,string将字符的地址装入DX寄存器

PUSH压栈

POP出栈

ADD加法指令格式:

ADDDST,SRC执行的操作:

(DST)<

-(SRC)+(DST)

SUB减法指令格式:

SUBDST,SRC执行的操作:

-(DST)-(SRC)

MUL无符号乘法指令格式:

MULSRC 

执行的操作:

字节操作(AX)<

-(AL)*(SRC);

字操作(DX,AX)<

-(AX)*(SRC);

双字操作:

(EDX,EAX)<

-(EAX)*(SRC)

DIV无符号除法指令格式:

DIVSRC 

执行的操作:

字节操作:

16们被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。

表示为:

(AL)<

-(AX)/(SRC)的商,(AH)<

-(AX)/(SRC)的余数。

字操作:

32位被除数在DX,AX中。

其中DX为高位字,16位除数为源操作数,结果的16位商在AX中,16位余数在DX中。

(AX)<

-(DX,AX)/(SRC)的商,(DX)<

-(DX,AX)/(SRC)的余数。

双字操作:

64位的被除数在EDX,EAX中。

其中EDX为高位双字;

32位除数为源操作数,结果的32位商在EAX中,32位余数在EDX中。

表示为:

(EAX)<

-(EDX,EAX)/(SRC)的商,(EDX)<

-(EDX,EAX)/(SRC)的余数。

NOP无作用,可以用来抹去相应的语句,这样的话,嘿嘿嘿…

CALL调用子程序,你可以把它当作高级语言中的过程来理解。

控制转移指令:

JE或JZ若相等则跳

JNE或JNZ若不相等则跳

JMP无条件跳

JB若小于则跳

JA若大于则跳

JG若大于则跳

JGE若大于等于则跳

JL若小于则跳

JLE若小于等于则跳

总的来说,以上几个,都是比较常见的,需要掌握,但需要掌握的绝不止这几个,其它的指令希望你能在私下里再了解一下,可以找相应的教程来看。

刚才忘了,现在再把数制转换也给贴上:

首先说二进制转换为十进制的问题:

各位二进制数码乘以与其对应的权之和即为该二进制相对应的十进制数。

例如:

10100=2的4次方+2的2次方,也就是十进制数20。

11000=2的4次方+2的3次方,也就是十进制数24。

接着说一下十进制数转换为二进制数的方法:

这样的方法到底有多少,我也不清楚,我只讲最简单的一个-除法:

把要转换的十进制数的整数部分不断除以2,并记下余数,直到商为0为止。

例:

N=34D(说明一下,你可能在某些数字的后边看到过加有一个字母,这个字母便是用来表示数制的,十进制数用D,二进制数用B,八进制数用O,十六进制数用H)

34/2=17 

(a0=0)

17/2=8 

(a1=1)

8/2=4 

(a2=0)

4/2=2 

(a3=0)

2/2=1 

(a4=0)

1/2=0 

(a5=1)

所以N=34D=100010B。

对于被转换的十进制数的小数部分则应不断乘以2,并记下其整数部分,直到结果的小数部分为0为止。

十六进制数与二进制数、十进制数之间的转换:

总的来说,十六进制数与二进数之间的转换,应该算是很简单的了,你只需把与之相对应的数值进行转换就成了。

十六进制数的基数是16,共有16个数码,它们是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。

其中A表示十进制中的10,其余类推。

它们与二进制和十进制数的关系如下:

0H=0D=0000B,1H=1D=0001B,2H=2D=0010B,3H=3D=0011B,4H=4D=0100B,5H=5D=0101B,6H=6D=0110B,7H=7D=0111B,8H=8D=1000B,9H=9D=1001B,AH=10D=1010B,BH=11D=1011B,CH=12D=1100B,DH=13D=1101B,EH=14D=1110B,FH=15D=1111B

所以,二进制与十六进制之间要进行转换的话,只要把它们由低到高每四位组成一级,直接用十六进制来表示就可以了:

1000 

1010 

0011 

0101

5

十六进制转二进制则用只需将每一位用四位二进制数来表示就成了:

0

1011 

0001 

0000

最后是十六进制数与十进制数之间的互相转换

十六进制数转十进制数

各位十六进制数与其对应权值的乘积之和即为与此十六进制数相对应的十进制数。

N=BF3CH

=11*16的3次方+15*16的2次方+3*16的1次方+12*16的0次方

=11*4096+15*256+3*16+12*1

=48956D

十进制转十六进制

我还是只讲最简单的除法:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1