谈谈注册码的逆向解析[网络技术]
本文“谈谈注册码的逆向解析[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
作者: TC-XB,我们目前见到的大大都软件的固然在注册算法,考证方法都各不相同自成体系.但不管怎样改变都没有脱离出一个关于注册码的定式:注册信息 + 算法计算 = 注册码 .概括地说就是目前大大都软件所采纳的注册码生成的方法都是按照:F(注册信息) = 注册码,F(X)表示特定的算法.这样的情势计算得出的.大家也可以留神察看一下平常解析所碰到的软件,绝大部份都是采取这样的方法举行注册码计算的,无论此中的那个F(X)采纳何种复杂的计算,其最根本的情势都是一样的.
这个计算情势,关于破解软件的人来说是一件功德.为什么呢,因为不管注册算法若何,只要可以解析出具体的计算历程或是核心的计算办法都可以轻松的做出注册机.大概有人说他们的算法非常强劲,但是,由于最基本的情势的限制,我们乃至不用解析出具体算法只需求找到算法计算的后果,便可以到达破解的目的.所以说:F(注册信息) = 注册码这种经典的情势是有一定的范围性的,有的时刻这样的方法根本起不到保护软件的作用.
那么,还有没有其他的情势呢!其实,有的人已经注意到这个问题了于是一种新的注册码计算情势呈现了,这个情势可以概括成:F(注册信息) = G(注册码)也就是说,对注册信息和注册码按照差别的算法,同时举行计算.从前的注册码都是“被动”的,计算出的后果是什么注册码就是什么,但目前情形差别了,注册算法计算出的后果必须和注册码经过计算后的后果相同才能注册成功.
这样的好处就是,即便破解者解析出了计算注册码的算法,也不一定可以做出符合条件的注册机,因为注册码不但需求经过计算,并且要保证两个算法计算得到的后果要相同.
关于这样的计算情势,破解的工作量也就无形中加大了,不但要同时解析出两种差别的算法,并且还要保证计算得到的后果相同.可以必定,这确切是一种很不错的办法.
下面,我们就通过两个非常简单的实例来给大家介绍一下这种办法的实际利用.
首先来看看第一个例子,这是一个crackme我们先来查一下壳,用peid查抄一下后果程序没有加壳.目前就用OD来翻开它,通过字符串查找的办法很快便可以找到关键的代码了,历程就不具体说了重点在解析.我们来到一下代码处:
00425050 |. 55 PUSH EBP ; 来到了这里
00425051 |. 68 11514200 PUSH CrackMe.00425111
00425056 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00425059 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0042505C |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
0042505F |. 8B83 B8010000 MOV EAX,DWORD PTR DS:[EBX+1B8]
00425065 |. E8 96C9FEFF CALL CrackMe.00411A00 ; 取注册名位数
0042506A |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
0042506D |. 8B83 BC010000 MOV EAX,DWORD PTR DS:[EBX+1BC]
00425073 |. E8 88C9FEFF CALL CrackMe.00411A00 ; 取假码位数
00425078 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; EBP-C=假码
0042507B |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
0042507E |. E8 71D7FDFF CALL CrackMe.004027F4 ; 计算注册码的CALL,跟进
00425083 |. 8BF0 MOV ESI,EAX
00425085 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00425088 |. E8 13010000 CALL CrackMe.004251A0 ; 计算注册名的CALL,跟进
0042508D |. 8BF8 MOV EDI,EAX
0042508F |. 3BFE CMP EDI,ESI 注册码的计算后果与注册名的计算后果相比
00425091 |. 74 18 JE SHORT CrackMe.004250AB 二者相等就跳向成功
这段代码就是这个crackme完好的注册流程:首先,记录我们输入的注册名和注册码;然后,将注册名与注册码辨别举行计算;最后,将两个计算所得到的后果举行对比,两个后果相等就注册成功.从这里我们便可以看出与以往注册码计算的差别之处了,普通在这里只会对注册名大概其他相近似的注册信息举行计算;而在这个crackme中顺次对注册名和注册码举行了计算.计算完成之后,便对两个计算后果举行对比,和平常一样两个值相等就注册成功.
那么,目前我们就来顺次解析一下程序对注册名和注册码都举行了怎样一个具体的计算历程.当步过对注册码举行处理的那个call时我们发现注册码的值确切发生了改变,但是这个改变让人感到很不测我输入的注册码是12345经过这个call今后这个值变成了3039本想跟进去具体的看看,可即刻想起来了3039刚好就是12345对应的十六进制数,本来在这里程序只是把输入的注册码转换成了对应的十六进制数.看完了注册码我们看看程序对注册名事怎么样举行计算的,跟进对注册名举行计算的call来到下面的代码处:
004251A0 /$ 53 PUSH EBX
004251A1 |. 89C3 MOV EBX,EAX ; EAX=EBX=输入的注册名
004251A3 |. 83FB 00 CMP EBX,0 ; 输入注册名了吗,没有输入就跳走
004251A6 |. 74 13 JE SHORT CrackMe.004251BB
004251A8 |. B8 01000000 MOV EAX,1 ; 使EAX=1
004251AD |. 31C9 XOR ECX,ECX ; ECX清零
004251AF |> 8A0B /MOV CL,BYTE PTR DS:[EBX] ; 取注册名每一位的HEX值,放进ECX
004251B1 |. 80F9 00 |CMP CL,0
004251B4 |. 74 05 |JE SHORT CrackMe.004251BB ; 计算完了吗,计算完毕就跳走
004251B6 |. F7E1 |MUL ECX ; EAX=EAX*EAC
004251B8 |. 43 |INC EBX ; 每计算一次EBX+1
004251B9 |.^ EB F4 \JMP SHORT CrackMe.004251AF
004251BB |> 25 FFFFFF0F AND EAX,0FFFFFFF
004251C0 |. 5B POP EBX
004251C1 \. C3 RETN
本来,关于注册名的计算也非常简单,历程是这样的:
首先:查验能否输入了注册名,然后取注册名每一位的ASCII码
接着:把注册名每一位的ASCII码顺次相乘,相乘的后果就为终究的计算后果
老法则举例阐明一下,在这里我输入的注册名是tcxb首先程序会顺次取注册名每一位的ASCII码,这四个字母对应的ASCII码辨别是:74,63,78,62.然后将这些值相乘就得到终究后果了74*63*78*62=80CBA40.
目前我们对注册名的计算历程也理解清楚了,回想一下将注册码举行计算后的后果3039.很明显80CBA40和3039这两个值是差别的,当然不能满意注册的要求.
呵呵,F(注册信息) = G(注册码)这样的情势别的一个难点就在这里了,就算解析完了整个算法也不能得到最后精确的后果.所以解析完了还得举行考虑,我们目前得知:对注册信息的计算是历程是将对应的ASCII码相乘得到一个积,对注册码的计算是把注册码转换成对应的十六进制数,最后要求这两个后果必须相等.看起来还挺麻烦的,这个crackme只是用来让大家初步理解一下F(注册信息) = G(注册码)这种情势的,所以要得到注册码也不是很难.
目前就要开始逆推了,普通来说逆推时有本领的,要挑选对比复杂的一边先举行解析之后再考虑算法较为简单的一边.因为对注册码举行的计算对比简单所以我们先把它放到一边.先看对注册信息的计算,就已注册名tcxb为例来说吧,计算后的后果是80CBA40那么目前的情形就是要求:G(注册码)=80CBA40, 我们已经知道这里的G(X)就是将此中的值转换成对应的十六进制情势,这样问题就对比明了了.就是说要求某一个数的十六进制数等于80CBA40,这个历程就简单啦.翻开windows自带的计算器先挑选十六进制然后输入80CBA40这个值,最后单击“十进制”便可以得到后果了80CBA40对应的值是135051840也就是说:G(135051840)=80CBA40.那么135051840就应当是与tcxb相匹配的注册码了,重新运行crackme输入注册名tcxb 和注册码135051840公然注册成功了(如图1).
通过上面的例子我们已将看到了,关于F(注册信息) = G(注册码)这样的情势解析出算法大概只需求一会的工夫,但是想要得到终究的后果就得花几倍的精神才能解析出来.并且,在这个例子中crackme的算法可以说是简单至极了,假如再略微复杂一点点,我们解析的工作量也就成倍上升了.
为了更好的阐明问题,我们来看第二个例子:经过PEID的检测没有发现程序加壳,直接用OD载入仍然通过探求字符串的办法找到关键的代码:
00401223 . 83F8 00 cmp eax, 0 ; 查验能否输入了注册信息
00401226 .^ 74 BE je short 004011E6 ; 没有输入注册信息就跳向失利
00401228 . 68 8E214000 push 0040218E ; ASCII "TCXB"
0040122D . E8 4C010000 call 0040137E ; 将我们输入的注册名举行计算
00401232 . 50 push eax ; 保存str1
00401233 . 68 7E214000 push 0040217E ; ASCII "12345"
00401238 . E8 9B010000 call 004013D8 ; 将输入的注册码举行计算
0040123D . 83C4 04 add esp, 4
00401240 . 58 pop eax ; 将两个后果取出
00401241 . 3BC3 cmp eax, ebx ; 对比两个值能否相等
00401243 . 74 07 je short 0040124C ; 相等就注册成功
我们可以看出,程序的注册流程也是非常的简单明了,首先查验我们输入了注册名和注册码.然后辨别将注册名和注册码举行计算,最后对比计算的后果.外表简单里面大概就复杂了,按照次序我们先看看程序是若何对注册名举行计算的,跟进计算注册名的那个CALL:
0040137E /$ 8B7424 04 mov esi, [esp+4] ; 来到了这里
00401382 |. 56 push esi ; 存放输入的注册名
00401383 |> 8A06 /mov al, [esi] ; 取注册名每一位的ASCII码
00401385 |. 84C0 |test al, al
00401387 |. 74 13 |je short 0040139C ; 将对应的字母转换成大写
00401389 |. 3C 41 |cmp al, 41
0040138B |. 72 1F |jb short 004013AC
0040138D |. 3C 5A |cmp al, 5A
0040138F |. 73 03 |jnb short 00401394
00401391 |. 46 |inc esi
00401392 |.^ EB EF |jmp short 00401383
00401394 |> E8 39000000 |call 004013D2
00401399 |. 46 |inc esi ; 查抄下一位
0040139A |.^ EB E7 \jmp short 00401383 ; 循环计算
0040139C |> 5E pop esi ; 将大写的注册名保存
0040139D |. E8 20000000 call 004013C2 ; 将注册名的ASCII码累加
004013A2 |. 81F7 78560000 xor edi, 5678 ; 累加的后果与0x5678做XOR运算
004013A8 |. 8BC7 mov eax, edi ; 保存最后的后果,设为str1
004013AA |. EB 15 jmp short 004013C1
从代码中我们可以解析出程序是按照下面的办法对注册名举行计算的:
第一步:将注册名中的每一个字母都转换成对应的大写字母
第二步:取这些大写的ASCII码,并累加计算得到一个后果
第三步:将这个累加计算得到的后果与定值0x5678做XOR运算,运算的后果即为str1.
以注册名tcxb 为例,首先将他转换成对应的大写字母,后果即为:TCXB然后取每一位的ASCII码举行累加,即:54+43+58+42 = 131,TCXB 对应的ASCII码就是T=54,C=43,X=58,B=42 (这里都是十六进制下的计算)
接着将这个值与定值作异或运算XOR(131,5678)= 5749 目前就得出了str1等于5749,对注册名的处理相对比第一个例子而言历程略微复杂了一点,我们接着看对注册码是怎样举行计算的.跟进对注册码举行计算的CALL,
004013D8 /$ 33C0 xor eax, eax ; 来到了这里
004013DA |. 33FF xor edi, edi
004013DC |. 33DB xor ebx, ebx ; 清空存放器
004013DE |. 8B7424 04 mov esi, [esp+4] ; 将注册码放入ESI中
004013E2 |> B0 0A /mov al, 0A ; 使EAX等A
004013E4 |. 8A1E |mov bl, [esi] ; 使EBX等于注册码每一位的HEX值
004013E6 |. 84DB |test bl, bl ; 计算完了吗
004013E8 |. 74 0B |je short 004013F5 ; 跳出循环
004013EA |. 80EB 30 |sub bl, 30 ; 注册码的每一位
004013ED |. 0FAFF8 |imul edi, eax ; EDI=EDI*EAX
004013F0 |. 03FB |add edi, ebx ; EDI=EDI+EBX
004013F2 |. 46 |inc esi ; 每计算ESI加1
004013F3 |.^ EB ED \jmp short 004013E2 ; 循环计算
004013F5 |> 81F7 34120000 xor edi, 1234 ; 循环计算的后果与1234做XOR运算
004013FB |. 8BDF mov ebx, edi ; 终究后果设为str2
004013FD \. C3 retn
这个历程相较而言就越发复杂了,不一步一步的解析是不能理解到具体的计算历程的.这个工作我已经为的大家做好了,代码固然复杂但是还是可以解析出计算的历程的.这是一个循环计算的历程:在初始化的时刻存放器EDI中的值等于0,EAX中的值为A我们辨别将EDI设为Dn,此中n等于计算的次数EAX设为An,n也为计算次数.目前就开始循环的计算了,在这里我们输入的注册码为12345,那么它的计算历程就是这样的.我们已第一次计算为例举行阐明
首先:取第一位的HEX值即1对应的值等于31,用这个值减去定值30等于1把这个1放进EBX中保存
然后:因为此时D0=0 A0=A(初始化的值),所以EDI=EDI*EAX就等于D1=D0*A0=0*A=0
接着:还是将EDX中的值举行计算,EDI=EDI+EBX即:D2=D1+1=0+1=1
最后:将得到的新的值与注册码的下一位举行相同的计算.
注意,此中EAX的值是不变的即:An一向等于0xA,以此类推,第二次计算的历程就是,A*D2+2,因为D2=1所以就等于1*A+2=C;第三次计算:A*D4+2 因为D4=C所以C*A+3=7B…顺次类推最后的计算后果为3039,这段计算的历程看上去很麻烦但是只要大家有了一定的经验便可以看出这段计算历程的本质内容就是将注册码转换成了对应的十六进制数,由于进制间转换的办法有很多所以一开始看不出来真正的含义,但是我们可以从后果看出来,因为3039恰是12345的对应的十六进制数.目前懂得了,对注册码计算的第一步就是将注册码转换成对应的十六进制数.接下来,程序便把这个十六进制的后果与一个定值1234作异或运算;XOR(3039,1234)= 220D于是这个220D就是注册码处理的终究后果了,我们设为str2.
解析完了两个计算历程,目前我们就要想办法得到精确的注册码了.关于这样一种情势我们普通都采纳是逆推的办法来找到精确的注册码,到这里就有问题了,是用注册码推算注册名呢还是用注册名来推算注册码.其实这之间没有一个规定的套路,哪里的算法简单我们就逆推哪一边.回想一下,对注册名的处理是先累加再异或,对注册码的处理是先转换再异或.由于进制间转化的关系是一一对应的,而累加出一个相同后果却有很多种肯能性,比方说一加三等于四;二加二也等于四.所以相对比而言,进制转换还是对比简单的,既然这样那我们就来逆推注册码的计算历程.
一边的计算后果已经知道了,那么F(注册信息) = G(注册码)这个公式便可以简化为G(注册码)=str1
即:G(注册码)= 5749 接洽注册码的计算历程我们逆流而上,在对注册码计算的历程里最后一步是一个异或运算,也就是说5749这个值是把两个数字经过异或运算得来的,但是此中一个数字是定值1234假如设另一个数字为X那么计算的历程就睡XOR(X,1234)=5749,很幸运异或运算是可逆的所以这里的X就等于XOR(5479,1234)= 457D.就这样第一个未知数就求出来了,那这个未知数与注册码间有什么关系呢?这就简单了,回想程序对注册码的处理办法,很快就知道了本来X就是注册码对应的十六进制数.下面的逆推历程就简单了直接把464D转换回对应的十进制数即为17789,这个十进制数就应当是注册码了.我们考证一下,公然注册名tcxb对应的注册码就是17789(如图2).
通过以上两个实例我们对F(注册信息) = G(注册码)这种情势有了一个大约的理解,简单的总结一下解析F(注册信息) = G(注册码)这种情势的难点主要有以下几个方面
第一:不但要解析对注册信息的计算历程,还要解析注册码的计算历程;这无形之中就增添了我们的解析的工作量.
第二:解析出了全部的计算历程,还必须找到同时符合两种差别算法的后果.只有同时符合计算注册信息是用到的算法,和计算注册码用到的算法才可以满意注册的条件.由于这个缘由,解析的难度加大了很多倍.
但是,我们不可否定,这是一种很有效的保护软件的手段.两个简单的例子之中,我们就领会到了逆推的历程真是相当的痛楚,必须同时满意很多个条件才有大概成立.简单的例子尚且如此,假使软件的作者稍动动头脑改正一下算法,必定够我们受的了.
那么,出了F(注册信息) = 注册码和F(注册信息) = G(注册码)这两种情势,还有其他可以有效保护软件的注册情势吗,下一节中我们持续为大家介绍
以上是“谈谈注册码的逆向解析[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:QQ2006的协议解析
- ·下一篇文章:安全告示:网络安全事件的分类
- ·中查找“谈谈注册码的逆向解析”更多相关内容
- ·中查找“谈谈注册码的逆向解析”更多相关内容