龙人在线
about me

Arron

抛砖只为引玉(QQ长期隐身在线)
不能富贵难成大器皆因懒,
胸无大志庸庸碌碌只为闲。

这里是我平时收集的和写的一些东西,希望和大家一起共同进步!

无聊看看电影 边听音乐边看 有空多交流
Google_search
Google
hot
latest
photos
还你真实的开幕式!震撼美图[转]【连载】 央行今日发行600万张面额10元奥运纪念钞(组图) 巧遇日本妹妹海滩拍片片 诱不可挡超级丰胸大美人
links
龙人在线 >> 学习资料 >> 破解教程 >> 商朝子的破解教学第八章

商朝子的破解教学第八章

来源:来自网络 作者:不详 日期:2010-06-23 热度:

第八章--注册码是怎样炼成的
你应该明白的是,并不是所有的软件作者都像你想象并希望的那笨没有人愿意自己的软件被别人在调试器中用一条d指令就能找到正确的注册码...要是那样的话还出来搞什么?
前边儿我们讲的查找软件注册码的方法是有针对性的,必须保证的是该软件使用的是明码比较,这样的话,我们只需找对地方,一个d指令就成了。那既然有明码比较这个词,就不难猜出还有相应的非明码比较...非明码比较也比较容易理解,就是软件比较两个注册码的方法不同而以,并不是计算出正确的注册码后就与用户输入的进行比较,它可能会采用每计算出一位就与注码中的相应位比较一次,一但发现与用户输入的不同,就提示出错等等等等...
遇到这样的软件,我们其实也可以找到其相应的注册码,但有点儿惨,要一位一位的计下来...但是如果人家不给你面子,一但计算出某位不正确就跳走的话,那你怎么办?所以,国民想致富,种树是根本...NG!所以遇到这种软件,我们就只有对其算法进行分析,并做出注册机才是唯一的方法(如果你想写注册机的话)...
你要明白,就算我们能找到那些采用明码比较的软件的注册码,原因也仅仅是因为其采用的是明码比较,所以我们没有什么值的高兴的地方,我们真正要做的,并不是找到一个注册码而以...当然如果你刚入门,那对你的提高还是很有帮助的。我们Crack一个软件的最终目的,是对其进行相应的分析,搞懂它的注册算法并写出注册机,这样才算是成功的Crack了一个软件,成功后的心情是难以表达的!就像你便秘了多天后一下子排了出来一样 ^_^,呵呵这个比喻虽然粗俗,但是你可以想象一下,对一个软件进行仔细的分析,最后一下把它的算法给搞明白了,那种感觉...我深信不疑的认为有一天你也能体会的到,偶等你
相信你以前看过那些高人大虾的关于软件注册算法分析的文章,同时也相信你有过试图跟踪分析某软件的举动,虽然后来的结果另人不太满意
其实分析一个软件的注册算法,这其中包括了一些技巧性方面的东西以及必要的经验,很难想象一个连调试器的使用都还没掌握的人试图去分析一个软件会是怎样一个场面...嘿嘿,偶是见过的使用调试器并不难,但那并不意味着你就能去分析一个软件了,见CALL就追这样的举动可不是偶一个人有过的经历,本章我尽量给你说明适当的分析方法。
相信大家都有不在父母陪同下独自使用调试器的能力以及看懂大部分汇编指令的能力了吧,那就够了!我们开始...
正式开始今天的正题,我来举两个例子,相信这两个例子都有足够的表达能力,最起码比我们家楼下那个卖油条的表达能力要强多了...
好的,首先,我们还是请出我们的那位老朋友吧嘿嘿,在此,偶向CHINAZIP(中华压缩)v7.0的作者表示我内心最真诚的歉意!相信我用这个老版本的中华压缩不会给您带来经济上的麻烦...
通过前边儿两章的讲解,我们已经把这个软件大体上给搞明白了,并且也追出了其相应的注册码。而我们今天的目的是对其注册算法进行分析,并写出注册机!这个软件的注册算法其实也比较简(并且存在Bug)用它来当例子,很能说明情况...
好的,我们开始,前边儿追注册码的时候我们就已经知道了其用于计算正确注册码的关键CALL的所在位置为004f4dde,我们用TRW2000来对其进行分析!(鉴于目前大部分教程中仍以TRW2000为主,而且这个是大多数菜鸟都会用的调试器,偶就用这个调试器来做具体讲解)
先启动CHINAZIP,帮助--注册(所以我才说这个软件非常适合写教程用嘛,注册后仍然中以再次注册)输入注册名Suunb[CCG],注册码19870219。之看按Ctrl+N呼出TRW2000,下断点bpx 004f4dde,F5返回。
接着就按确定吧,呵呵,被TRW2000拦到了。通过前边两章的分析,我们以经知道了004f4dde处的这个CALL用于计算正确的注册码,所以我们直接按F8跟进吧!注册码的算法,就包涵在这个CALL中,把它给分析透了,我们也就能弄明白软件的注册码是怎样生成的了。但是要怎么分析呢?这是一个比较严肃的问题,面对那一堆堆的指令,我不知道你是怎么想的,反正我第一次时是觉的找不着北,我怎么哪些重要哪些不重要呢?再说了,里面又包涵了那么多CALL,我还要一个一个地追进去看看?
呵呵,这就是我说的技巧所在了。其实也没什么可怕的,只要你汇编不是问题,就行了。我们首先可以先把这个计算注册码的CALL从头到尾执行一遍,搞明白其中大概的跳转以及其中某些CALL的作用,hehe~~你可以执行过一个CALL后就看一下各个寄存器的变化情况(如果寄存器中的值改变了,颜色就会变)如果某寄存器的值在CALL过之后改变了,我们就可以看一下其包含的值是何类型,如是内存地址就用d指令看一下,如是数值就看一下是不是得到你输入注册名或注册码的位数等等,这样的话就可以淘汰下来一大部分的CALL,因为有许多CALL的作用只是把注册名或注册码装入到内存中的某个地址或者得到注册名(注册码)的位数或注册码某一位的ASCII码,对与这些,我们不必深究。还是推荐你用Ollydbg,执行过一条指令后很多信息都可以看到好的,我接着说,按F8追入CALL之后先大概走一遍...我给出追入后的反汇编代码,并给出注释,相应的分析看后面...
0167:004f4fac push   ebp                       <--F8跟入后的第一条指令
0167:004f4fad mov     ebp,esp
0167:004f4faf push   byte +00
0167:004f4fb1 push   byte +00
0167:004f4fb3 push   byte +00
0167:004f4fb5 push   byte +00
0167:004f4fb7 push   byte +00
0167:004f4fb9 push   byte +00
0167:004f4fbb push   byte +00
0167:004f4fbd push   ebx
0167:004f4fbe push   esi
0167:004f4fbf push   edi
0167:004f4fc0 mov     [ebp-08],ecx
0167:004f4fc3 mov     [ebp-04],edx
0167:004f4fc6 mov     eax,[ebp-04]
0167:004f4fc9 call   004041c0
0167:004f4fce xor     eax,eax
0167:004f4fd0 push   ebp
0167:004f4fd1 push   dword 004f5097
0167:004f4fd6 push   dword [fs:eax]
0167:004f4fd9 mov     [fs:eax],esp
0167:004f4fdc xor     esi,esi
0167:004f4fde lea     eax,[ebp-0c]
0167:004f4fe1 mov     edx,[ebp-04]
0167:004f4fe4 call   00403e24                 <--此CALL过后用于得到用户输入的注册名
0167:004f4fe9 mov     eax,[ebp-0c]             <--将得到的注册名的地址装用eax寄存器
0167:004f4fec call   0040400c                 <--此CALL用于得到用户输入的注册名的位数,并将其放入eax中
0167:004f4ff1 mov     edi,eax                 <--将注册名的位数装入edi中
0167:004f4ff3 test   edi,edi                 <--对edi进行测试
0167:004f4ff5 jng     004f5051                 <--如果edi中的值为0就会跳走
0167:004f4ff7 mov     ebx,01                 <--ebx置1,用于后面的运算
0167:004f4ffc mov     eax,[ebp-0c]             <--ebp-0c中装的是注册名的内存地址,此时将其付于eax
0167:004f4fff mov     al,[eax+ebx-01]           <--eax中此时装的是注册名的内存地址,加上ebx中的值再减去01,用于得到注册码中的相应位的字符,比如说我们第一次执行到这里的时候ebx中装入的是01,再减去01后得到的值其实还是eax本身,这样就能得到注册名中的第一个字符了,而执行到后边再跳回来时ebx会加上1,所以就能得到下一个字符了...
0167:004f5003 call   004f4f60                 <--这个CALL很重要,后面会说明我们是怎样知道它很重要的
0167:004f5008 test   al,al                   <--在这里我们会发现一个测试运算,对象是al,而al在前边CALL之前刚装入了注册名中的某一个字符,所以我们可以断定上面的那个CALL会对得到的字符做上一些手脚,待会儿我们再跟入...
0167:004f500a jz     004f5031                 <--如果al中装的是0就跳到004f5031处,而al中的值会被004f5003处的那个CALL所改变
0167:004f500c lea     eax,[ebp-18]              
0167:004f500f mov     edx,[ebp-0c]             <--ebp-0c中装的是注册名的内存地址,此时装入edx中
0167:004f5012 mov     dl,[edx+ebx-01]           <--跟前边儿004f4fff处的指令道理相同,得到注册码中的当前参加运算的字符
0167:004f5016 call   00403f34                 <--不重要!!
0167:004f501b mov     eax,[ebp-18]            
0167:004f501e lea     edx,[ebp-14]
0167:004f5021 call   004088ac                 <--不重要!!
0167:004f5026 mov     edx,[ebp-14]
0167:004f5029 lea     eax,[ebp-10]
0167:004f502c call   00404014                 <--该CALL同样比较重要,其作用是这样的,如果当前参加运算的字符在前边004f5003的CALL里进行运算之后符合了要求(符合要求后al会被置非0值)那么在004f500a处的跳转将会失去作用,而执行到这里后该CALL会将当前的这个符合要求的字符保存到00D3B3C4处(内存)!!后边儿会再详细说明
0167:004f5031 cmp     ebx,byte +01             <--用此时ebx中装的值减去1
0167:004f5034 jz     004f5040                 <--如果为零,也就是说此时计算的是注册名中的第一个字符的话就跳到004f5040处
0167:004f5036 mov     eax,[ebp-0c]             <--ebp-0c中装的是注册名的内存地址,该指令将注册名的内存地址装入eax中
0167:004f5039 movzx   eax,byte [eax+ebx-02]       <--用于得到上一个参加运算的字符
0167:004f503e jmp     short 004f5046             <--无条件跳转到004f5046处
0167:004f5040 mov     eax,[ebp-0c]             <--ebp-0c中装的是注册名的内存地址  
0167:004f5043 movzx   eax,byte [eax]             <--得到注册名的第一个字符
0167:004f5046 lea     esi,[esi+eax*4+a8]         <--!!!这一条指令就是关键所在,后面会说明的!!!此指令先得到本轮参加运算的字符的ASCII码,然后乘以6,之后再加上a8(即十进制数168,呵呵,可以理解)同时再将这个字符计算得到的值与前面已经运算过的字符的值的和相加!
0167:004f504d inc     ebx                   <--ebx加1,用于得到注册码的下一个字符
0167:004f504e dec     edi                   <--edi减1,edi中装的是注册码的位数
0167:004f504f jnz     004f4ffc                 <--不为零就跳到004f4ffc处开始对下一个字符进行运算...也就是说每计算完一个字符就将edi减去1,直到其为0也就是所有的字符全参加过运算为止。
0167:004f5051 lea     edx,[ebp-1c]             <--把装注册码后半部分的地址装入edx,传给下面的CALL
0167:004f5054 mov     eax,esi                 <--将前面计算的注册码的后半部分的值装入eax中
0167:004f5056 call   00408c70                 <--将前面计算得到的注册码后半部分的值转换为十进制,并装入ebp-1c中
0167:004f505b mov     ecx,[ebp-1c]             <--epb-1c中装的是注册码的后半部分
0167:004f505e lea     eax,[ebp-0c]
0167:004f5061 mov     edx,[ebp-10]             <--ebp-10中装的是注册码的前半部分
0167:004f5064 call   00404058                 <--该CALL用于将前后两部分注册码合并置一起,合并后的注册码会存放置ebp-0c处
0167:004f5069 mov     eax,[ebp-08]
0167:004f506c mov     edx,[ebp-0c]
0167:004f506f call   00403de0
0167:004f5074 xor     eax,eax
0167:004f5076 pop     edx
0167:004f5077 pop     ecx
0167:004f5078 pop     ecx
0167:004f5079 mov     [fs:eax],edx
0167:004f507c push   dword 004f509e
0167:004f5081 lea     eax,[ebp-1c]
0167:004f5084 mov     edx,05
0167:004f5089 call   00403db0
0167:004f508e lea     eax,[ebp-04]
0167:004f5091 call   00403d8c
(未完待续)

 

Tags: 注册码 方法 炼成 软件
广告位招租,广告代号:gg468
search
站内
advertise
Copyright © www.jx19.Com All rights reserved.