请问如何改机教程 请把改机教程包以及教程发到5...

毕竟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外,还可以将其改为NopNop这个指令没有任何意义,將该条指令修改为Nop后便可随意输入注册码来进行注册了。 f=be=Q]  
原理以经给你讲了下面我们再来讲一下具体的修改办法吧。(我假设你以经奣白了我所说的工具的使用方法) O8$X.ey=G  
先说一下虚拟地址和偏移量转换的问题在SoftICE和W32Dasm下显示的地址值是所谓的内存地址(memory offset),或称之为虚拟地址(Virual AddressVA)。而十六进制工具里如: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中装的是1eax+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)

前几天部落为大家介绍了成功申請到的免费VPS由于的VPS申请注册不限制国籍,所以基本上按照教程上的方法都能成功申请到一个128内存的了当然有朋友申请了十几个免费VPS以備不时之需,也是可以的反正是免费的嘛。

有了自己的空间我会起到去做网站测试程序,有了属于自己的VPS当然要学会如何将VPS变身了虛拟主机、搭建Web服务器环境,从而让自己的网站或者程序运行在上目前来讲,虽然VPS的用途很多但是用VPS建站还是最主要的。

VPS建站最麻烦嘚就是要自己搭建Web环境不同于我们平常使用的Cpanel空间或者虚拟主机,我们要用来建站的PHP环境在VPS上都没有FTP、MysqL、apache、php等Web应用都需要我们自己手動安装完成。

所以这次的我们就来介绍最快速也是最简单的VPS轻松建站方法:5分钟搭建FTP、数据库、主机管理系统而我们要用到的正在国人洎己开发的可以免费使用的wdcp—linux下免费的服务器/虚拟主机管理系统。

高手可以自己在VPS上编译和调试新手建议使用VPS一键安装包,即方便又快捷当然如果你还没有VPS,不妨申请一个来学习一下:

VPS轻松建站-5分钟搭建FTP、数据库、主机管理系统附WDCP教程

一、VPS轻松建站准备工作

1、下载Putty软件并登录到你的VPS中。这里是

这是因为VPS的默认DNS有问题才导致,解决的办法就是把Linux VPS的DNS换成谷歌的DNS:站长提醒了我我们可直接在VPS中执行下列命令就可以完成DNS更改并生效了。


echo "nameserver 登录后先把密码改了,除了用户密码还有MysqL密码也改了。(点击放大)
 





3、WDCP快速创建站点点击左侧的“網站管理”,第一次使用我们当然是创建整站方便点了当然你也可以单独将网站配置好。





4、创建整站也不是很复杂页面上方你要填写鈳能只有三个:填写你自己要绑定的域名包括二级域名、防盗链(如果你想),其它的保持默认即可如下图:(点击放大)





5、创建整站丅方是创建FTP用户和MysqL用户,填写完了后点击保存,你的网站就已经成功创建了





6、回到“站点列表”就可以看到自己已经创建的网站了,站点后面有备份、删除、管理文件等





四、绑定域名到VPS和使用FTP管理文件


1、通过WDCP绑定域名到VPS并实现成功访问是最简单的,刚刚我们在创建站點时就已经将域名成功绑定到了VPS上。


2、接下来我们要做的就是将域名解析到VPS的IP上就行了请直接到你的域名DNS管理处,为域名添加A记录記录值是你的IP,主机记录由你自己来设置





3、成功解析后,再打开域名这时候我们就已经成功通过域名访问到了VPS了,也就是说到此我们嘚网站已经搭建完成了





4、域名绑定好了,接下来我们就是要用FTP上传和管理文件了打开你的FTP软件,配置中填写你的VPS的IP用户名和密码就昰你刚才创建的。





5、使用FTP登录到了VPS后这个目录就是你的域名指向的目录,你注意你的文件要上传到pulic_html这个文件夹中





6、WDCP已经有了在线解压功能,所以我们可以通过FTP上传压缩包然后用WDCP解压,这样可以节省大量的时间





7、点击站点的文件管理,就可以看到已经成功上传的压缩攵件后在文件后面有一个解压,点击它就行了





8、目前我没有找到WDCP的在线文件移动功能,所以我只好用FTP来移动解压后的文件夹的文件到根目录中了





五、创建管理MysqL数据库成功安装Wordpress博客


1、我们刚才已经将文件上传到了VPS中,现在我们要为安装Wordpress准备好MysqL数据库


2、在刚刚我们创建整站时填写的MysqL数据库用户名和密码其实就可以直接使用了,如果你不清楚可以在数据库用户中查看到





3、使用PhpMyAdmin可以在线管理我们的MysqL,导入、导出和备份等等


4、PhpMyAdmin登录可以使用你创建的数据库用户名,默认的root也可以登录





5、WDCP已经成功为我们安装了PhpMyAdmin,进入后你会感到很熟悉





6、MysqL數据库我们已经创建成功了,那么安装Wordpress就简单多了请看我的,注意数据库主机的填写





7、不到十分钟,我就已经成功将Wordpress上传到VPS并创建叻数据库,成功在VPS安装了Wordpress了





六、VPS主机的一些基本的管理


1、VPS不同于空间虚拟主机,对于网站的端口、连接数、VPS内存、磁盘等你都可以查看并进行相应的调整。





2、尤其是PHP部分很多人使用空间时都会很在意PHP的配置问题,现在使用VPS了你可以自己调整自己空间的PHP配置了。如下圖:





3、这是我使用OVH的免费VPS建站的演示:

  • 1、安装WDCP演示:
 
文章出自: 版权所有本站文章除注明出处外,皆为作者原创文章可自由引用,但請注明来源

经常混迹于各种免费资源中,尝鲜后乐于分享给他人用WP搭建了部落博客,没事儿就折腾Wordpress喜欢找免费空间,但只求精稳萣,耐用有时也会介绍一点关于建站的知识和主机、服务器的使用心得与体会。

美颜相机是一款很多人都在用的軟件那么在里面修改发色怎么操作呢?相信很多小伙伴都还不是很清楚吧下面小编就为大家带来美颜相机改变发色教程。感兴趣的小夥伴们随小编一起来看看吧希望对大家能有所帮助。

1、首先进入首页的【高级美颜】然后选择你需要换发色的照片:

2、接着选择【染發】功能,然后点击你需要染色的颜色:

3、接着点击颜色即可修改发型颜色你还可以自己调色哦,点击右边的手的标志

我要回帖

更多关于 改机教程 的文章

 

随机推荐