破解完全入门篇.docx
- 文档编号:30494286
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:27
- 大小:37.89KB
破解完全入门篇.docx
《破解完全入门篇.docx》由会员分享,可在线阅读,更多相关《破解完全入门篇.docx(27页珍藏版)》请在冰豆网上搜索。
破解完全入门篇
破解完全入门篇
第一章--前言
好多哥们儿说看教程跟老大的书都看不太明白,所以,我尽量把话说到最容易理解的份上,本文写给那些刚入门和尚未入门的朋友们...
目录
no.1------------------前言(说明一下)
no.2------------------汇编语言
no.3------------------Windows程序
no.4------------------调试器及相关工具入门
no.5------------------破解原理
no.6------------------初级破解实践,强暴一个软件
no.7------------------中级破解实践,找到注册码及写内存注册机
no.8------------------高级破解实践,分析软件算法,编写注册机
由于现在网吧,临时写来,所以,今天只写个前言吧,呵呵...
本章只作一些说明,现在也说了这么多了,没别的了,卖个广告,推荐几本书吧。
首先,力荐看雪老大《加密与解密--软件保护技术及完全解决方案》,绝对物超所值,要的抢先了...(汗~~俺都没看过,看来要落伍了)。
当然,还有看雪精华一、二、三、四以及将要出来的五,足够带你上路,还有风飘雪大虾的《风飘雪破解教程》等等等等(其它一些,没说到的就请自行搜集吧),还有就是常到论坛来转转;=》
另外,我觉的你真的很有必要学一门编程语言以及掌握一些Win32程序的知识...
课后FAQ
Q:
哪些人可以学习破解?
A:
任何会启动电脑并运行软件同时又想学习破解的人。
我说的全是实话,如果你既不会启动电脑又不会运行软件,那么我教你一个更高深的吧--破解电脑,呵呵,很简单,到大街上随便抡个板砖什么的,回去慢慢破解吧记得关电源)
Q:
有没有什么办法可以使我快速入门并成为高手?
A:
有。
但你得是个MM(P不PL无所谓),然后找个离你家最近的破解达人,什么也不用做,眨个眼放个电之类的会吧(现在连初中的小女生都会这个),然后就成了,呵呵,想破什么的话,让高手帮忙吧,到时说成是自己破的就成了MM问为什么?
因为那些高手大都奇丑无比,呵呵,有了头脑就没了长相,男的也是这样,而且越是高手,长的就是越丑。
据说一次市里到CCG考察奶牛们的出乳情况,看到大哥Sun某的时候,说了句“这奶牛个儿这么小啊,中午大家吃涮锅”(众大哥:
大家准备好家伙,我们一会儿要去械斗)。
呵呵,玩笑开到这里,其实我说这么多,只是想告诉你,学习破解跟其它技术一样,请你不要试图投机取巧,要想学,就脚踏实地,多看教程多动手实践积累经验,不要经常POSE那种弱智问题“我不懂XX,请问我能学破解吗?
”,答案是不能,你问的同时,不也正在学吗?
想知道重要吗?
那我告诉你好了,凡是看雪教程上要求掌握的,你全要掌握,这还不算,要想成为高手就必须精通,如果你不想一直只停留在入门阶段的话。
不要想偷机取巧,谁一开始也不是什么都会的,但你只要花一些时间和一小部分精力,那么没有什么你学不会的,知识是要积累的,你知道自己不会却不去学,而在那儿问重不重要,人家会觉的你这个人并不想认真学破解,而是报有侥幸心理在浪费时间,请不要做浪费时间的人。
不要刚开始学就想马上成为高手,没有高手,你没必要立下超越的目标,只把学知识放在首位就够了,欲速则不达,请不要做急于求成的人。
Q:
学破解对我来说有什么好处?
A:
这个问题应该你自己来回答,呵呵,你为什么要学?
“我想免费使用共享软件”倒...那多少也算是个目的,但我希望你不要只报这种目的(目前国内共享软件业还有待发展)。
我只是想说给那些只是因为一时冲动才学习破解的人,请将你们当初的冲动继续维持下去,你需要明白,学习破解的目的不只在于破解软件这个词,也许后来你会变为软件分析,随着学习时间的增加,对你的编程水平,相信会有相当大的提高。
学习别人好的思想,并化为已用就我个人来说,学习破解可以把我的汇编的基础给打好,呵呵,俺对操作系统这玩意儿感兴趣,到时候还想写出来个玩玩儿呢,所以汇编这关必须要过....
Q:
我很笨,那些大虾的教程我大都看不明白,我能学会吗?
A:
永远不要说你笨,你只是学的比人家晚而已,太高深的看不懂,那你就捡能看懂的看,别人能入门,你也能,不得要领只是暂时,大虾与你,也许差的就是一两年时间的问题。
第二章--汇编语言
汇编语言用一些助记符来代替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赛扬贵那么多吗)你急什么嘛,由于汇编比较“低级”?
;;所以它是直接操作硬件的,你以为这是用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(三十二位数据)也许我这样说,你还是会不明白,没关系,慢慢来,我给你大概画张图吧,虽然不怎么漂亮:
───────────────────────
││││
││││
│高十六位EAXAHAXAL│
││││
││││
───────────────────────
明白了吗?
不明白没有关系,你就按你自己的理解能力,能理解多少,就理解多少。
这四个寄存器,主要就是用来暂时存放计算过程中所用的操作数、结果或其它信息。
而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这两个还是附加段。
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)<-(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若小于等于则跳
第三章—Windows程序
这一章我都不知道该如何写了,呵呵~~
毕竟,Win32是一个非常深奥的系统,目前还容不得我这种小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂本章的名字就叫《Windows程序》而不是《Windows程序设计》所以,我只是讲一些关于Windows程序运作的原理:
Windows为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来。
也就是这一个又一个窗口的出现,使计算机的使用一下子简单了巨多。
几年前接触过电脑的朋友一定知道DOS吧,不知道的话,去问加解密工具下载版的版主老哥,让他跟你解释你还记的DOS下那黑乎乎的窗口吧,没见过的哥们儿可以在开始菜单中找出来看看。
DOS通过一系列的命令来进行相应的操作,如进入一个目录,删除一个目录等等等等。
那种工作方式就叫做命令提示符方式,也即命令行。
现在国内不懂电脑的人还老爱说要想学电脑,必须要英语过关。
(就是这个,吓跑了多少仅仅是想学习一些基本操作的朋友)可能也就是源自DOS的原因吧。
后来,随着硬件的支持以及技术上的提高,当然还有为了使电脑更方便的服务与人,慢慢的就有了所谓的视图操作系统,从此,你不用再记忆那些大堆的指令了,而且操作上,也有了相大的提高,可以说操作系统发展到今天的份儿上,操作已经够简单了,去看看那些在网吧里一把鼻涕的小孩子们吧…
当然,就像当年DOS之于命令提示行一样,今天的Windows仍和当年一样,占据着大部分的用户群。
(场外:
一观众扔来一烂柿饼,你是唐僧啊,这么多废话)
马上转入正题,Windows之所以好用,除了不用背N多的命令外,一个原因就是因为它本身提供了大量的标准WindowsGUI函数。
所以对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。
不用像当年在DOS下面那样一安装新程序,就要马上看帮助,看说明。
而WindowsGUI函数,只不过是微软提供给程序开发人员的API(ApplicationProgrammingInterface应用编程接口)中的一小部分而以。
WindowsAPI是一大组功能强大的函数,它们本身驻扎在Windows中供人们随时调用。
这些函数的大部分被包含在几个动态链接库(DLL)中,譬如:
kernel32.dll、user32.dll和gdi32.dll。
Kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作等等。
你可能多多少少听说过API函数,如果你不太清楚到底是怎么一回事的话,我尽量给你解释的清楚一点。
不知道你有没有想过,Windows中的那一个又一个窗口是怎么画出来的呢?
呵呵,你可能用VB、Delphi编过程序,你有没有想过你写的程序中的那些窗口是怎么形成的?
是控件变成的。
倒...呵呵,相信你当初学VB或Delphi的时候,所看的书上一定对可视化编程环境大肆赞扬了一番吧,是不是也提到过比VC++怎么怎么方便?
怎么怎么不用再为生成程序的界面而花费大量无用时间了等等。
(台下上来一东北民工:
小子,你找抽啊,还讲不讲了)
马上开说,其实我只是想告诉你,所有你用的Windows下的程序,都是通过调用一个又一个的WindowsAPI来执行相应任务的,没有API,你的程序什么也做不了。
用VB、Delphi以及MFC的朋友也许会说我根本没有调用什么API啊!
其实这些API都是由你所用的开发环境自动进行相应的转换的。
比如说你用Delphi新建一程序,什么也不用动就直接按F9来运行它,是不是出现一个空白的窗体?
这就是个标准的Windows程序,它有Windows程序所具有的一切特征,如最大化按钮、最小化按钮、关闭按钮…你可以通过鼠标来移动它。
但是如果你想用VC++或MASM32来写这样一个程序,那么你有两种方法,在VC++中,你可以用MFC或直接调用API,而在MASM32中,你就只有直接调用API这一种方法。
所谓直接调用API,就是指所有的操作都通过最原始的API来完成。
通过直接调用API来生成这样一个程序,你必须要先注册窗口类(除非您使用Windows预定义的窗口类,如MessageBox或dialogbox);然后产生窗口;然后在桌面显示窗口(除非您不想立即显示它);然后刷新窗口客户区;
麻烦吧,如果你想真正的让这个程序能正常地运行下来,还要再加入以下步骤:
1.你要得到您应用程序的句柄。
2.窗体显示后就进入无限的获取窗口消息的循环。
3.如果有消息到达,由负责该窗口的窗口回调函数处理。
4.如果用户关闭窗口,进行退出处理。
上面这此步骤,都需要调用相应的API来完成。
比如说得到程序的句柄用GetModuleHandle注册窗口类用RegisterClass或RegisterClassEx;注册后,还要用CreateWindowEx函数来生成相应窗口,而后用ShowWindow来显示它,之后还会用UpdateWindow来更新客户区等等等等。
这些还都不算呢,如果你真通过直接调用API去写一个稍大一点儿的程序的话,你会发现那是一个多么不令人愉快的事情。
上面说的这些,只不过是API中的一小小小小小小小小小小….部分,这才几个,真正的API有成百上千个,包括对系统各个方面进行的操作。
没有API,你的程序什么也干不了。
比如说你的程序中有一个Edit控件,VB中应该叫做Text控件吧,你想将用户输入到里面的信息放到一个变量中去,那么Delphi中可以用Str:
=Edit1.text来实现。
VB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 破解 完全 入门