当前位置:七道奇文章资讯安全技术网络技术
日期:2010-09-12 00:12:00  来源:本站整理

MD5算法利用之"迷魂阵"[网络技术]

赞助商链接



  本文“MD5算法利用之"迷魂阵"[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

文/图 TC-XB
===================================
我们已经见识很多种MD5 算法在软件注册中的利用,同时也得到了一个结论:一味生搬硬套现成的算法而不加改变,即便算法再强盛在破解者眼前也是"不堪一击"的.所以,我们就见识到了各种各样的奇思妙想,将MD5算法利用得淋漓尽致.但是,算法上做足了工夫却没有注意注册码对比的历程,招致了注册码明码在内存中呈现,后果一样会招致"半途而废".所以,必须在算法的利用和注册考证这两个方面同时下手,才可以让一个优异的算法施展出它最大的作用.
本日,我们挑选的这个MD5算法利用的实例,却从另一个角度启迪我们毕竟什么才叫做机动利用.在注册历程中,真正的注册码很简单就被发现了,但想要成功注册?呵呵,门都没有!在稍后解析的历程中,大家一定会看着注册码干焦急,明显就是精确注册码了,却怎么也用不了.这毕竟是为什么呢?让我们带着这个问题开始下面的解析之路吧!
这次的实例是一个CrackMe,用PEiD查抄,肯定这个小程序没有加壳,接下来我们便可以搬出OD了.用OD翻开这个CrackMe,载入之后翻开"字符串查找功效",很简单就发现了关键的注册提醒信息,如图1所示,双击找到的注册提醒,便可以来到对应的代码处了,如图2所示.
 
图1
 
图2
   目前我们看到的是"注册提醒"也就是来到了奉告我们注册成功与否的地方,注册码计算和注册考证的代码应当就在前面了,一路向上来到以下代码处.

00401C05 . 56 push esi  ;在这里设置断点
00401C06 . 8BD8 mov  ebx, eax
00401C08 . FFD7 call edi  ;取输入的注册码
00401C0A . 8D4424 0C  lea  eax, [esp+C]
;将注册码保存在EAX中
00401C0E . 8D50 01  lea  edx, [eax+1]
;对注册码作相同的查抄
00401C11 > 8A08 mov  cl, [eax]
;取注册码的每一位
00401C13 . 40 inc  eax
00401C14 . 84C9 test cl, cl
00401C16 .^ 75 F9  jnz  short 00401C11 ;循环计算
00401C18 . 2BC2 sub  eax, edx
;得到输入的注册码的长度
00401C1A . 8BD0 mov  edx, eax
;将注册码的长度保存在EDX中
00401C1C . 0F84 C5000000 je 00401CE7

程序首先将我们输入的注册码举行了一个预处理,并把注册码的长度记录下来.

00401C22 . 85DB test ebx, ebx
00401C24 . 0F84 BD000000 je 00401CE7
00401C2A . 33C9 xor  ecx, ecx
00401C2C . 85D2 test edx, edx
;开始查验注册码的范围
00401C2E . 7E 29  jle  short 00401C59
00401C30 > 8A440C 0C  mov  al, [esp+ecx+C]
;取注册码的每一位
00401C34 . 3C 30  cmp  al, 30
00401C36 . 7C 04  jl short 00401C3C
00401C38 . 3C 39  cmp  al, 39
00401C3A . 7E 18  jle  short 00401C54
00401C3C > 3C 41  cmp  al, 41
00401C3E . 7C 0C  jl short 00401C4C
00401C40 . 3C 47  cmp  al, 47
00401C42 . 7F 08  jg short 00401C4C
00401C44 . 04 20  add  al, 20
00401C46 . 88440C 0C  mov  [esp+ecx+C], al
00401C4A . EB 08  jmp  short 00401C54
00401C4C > 3C 61  cmp  al, 61
00401C4E . 7C 65  jl short 00401CB5
00401C50 . 3C 67  cmp  al, 67
00401C52 . 7F 61  jg short 00401CB5
00401C54 > 41 inc  ecx
00401C55 . 3BCA cmp  ecx, edx
00401C57 .^ 7C D7  jl short 00401C30
00401C59 > 33C0 xor  eax, eax
00401C5B . 85DB test ebx, ebx
00401C5D . 7E 0D  jle  short 00401C6C
  
紧接着就是对注册码的每一位举行考证,主要目的就是查验注册码的每一位能否符合要求.简单的说,就是注册码的每一位必须在数字和字母这个范围内,超越这个范围就会出错了.大家可以注意到,上面的大段代码都是用来查验注册码的,看来我们输入的注册码固然是"假码",但这个CrackMe却对这个"假码"很感爱好,一而再再而三地举行查验.下面又会对这个假码举行怎样的处理呢?我们持续解析.

00401C5F . 8A4C14 0B  mov  cl, [esp+edx+B]
;取注册码的最后一位
00401C63 > 304C04 40  xor  [esp+eax+40], cl
;与注册名的每一位运算
00401C67 . 40  inc  eax
;每计算一次EAX加1
00401C68 . 3BC3  cmp  eax, ebx
;计算完了吗
00401C6A .^ 7C F7  jl short 00401C63 ;循环计算
00401C6C > 8D4424 40  lea  eax, [esp+40]
;保存计算的后果str1
00401C70 . 50  push eax ;参数入栈

这里程序将我们输入的注册码的最后一位单独取了出来,并用它和注册名一一计算.下面把这段代码的具体计算历程给大家阐明一下.
第一步:取注册码的最后一位的HEX值;
第二步:取注册名每一位的ASCII码;
第三步:将HEX值与注册名每一位的ASCII码作XOR(异或)运算;
第四步:将计算的后果转换成对应的字母.
完好的历程就是这样的,但感受还是有些含糊,我们举例来阐明吧.在这里我输入的注册名是tcxb,注册码是12345,那么在这段代码中的计算历程就是这样的.
第一步:取注册码的最后一位,也就是这里的5,计算对应的HEX值后果是35;
第二步:取注册名每一位的ASCII码,tcxb这四个字母对应的ASCII码辨别是:74、63、78、62;
第三步:将35辨别与74、63、78、62举行异或运算,XOR(35.74)=41,XOR(35.63)=56,XOR(35.78)=4D,XOR(35.62)=57;
第四步:因为在ASCII码表中,字母A对应的值就是41,所以注册名第一位计算得到的终究后果就是A.
按照ASCII码表中的对应关系一一计算,可以得到每一个后果,辨别是A、V、M、W.最后将这四个字母归并构成一个字符串,也就是我们所说的str1=AVMW.得到了这个字符串之后又要干什么呢?我们接着向下解析.
00401C71 . C64414 0F 00 mov  byte ptr [esp+edx+F], 0
00401C76 . E8 75FEFFFF call 00401AF0
;将str1做MD5计算
00401C7B . 83C4 04  add  esp, 4
00401C7E . 8D4C24 0C  lea  ecx, [esp+C]
;取输入的注册码
00401C82 . 51  push ecx  ; /String2
00401C83 . 50  push eax  ; |String1
00401C84 . FF15 00704000 call [<&KERNEL32.lstrcmpA>]; \lstrcmpA
00401C8A . 85C0  test eax, eax  ;将二者对比
00401C8C . 6A 00  push 0
00401C8E . 75 33  jnz  short 00401CC3
00401C90 . 68 98714000 push 00407198 ;succeed!
00401C95 . 68 88714000 push 00407188 ;great,注册成功!
00401C9A > 8B15 40974000 mov  edx, [409740]; |
00401CA0 . 52  push edx  ;|hOwner => NULL
00401CA1 . FF15 DC704000 call [<&USER32.MessageBoxA>]; \MessageBoxA

这段代码就简单多了,主要作用是将上一步得到的str1即AVMW举行MD5计算,将计算得到的后果与我们输入的注册码相对比,假如相等就注册成功.通过各种办法很简单便可以计算出来MD5(AVMW)=c37985c0c4a3a9e4600d67c5d18af450.按照我们解析的后果,这个MD5值假如没有问题就是注册码了.
目前我们重新运行程序顺次输入注册名tcxb,注册码c37985c0c4a3a9e4600d67c5d18af450,很自大地按下"注册"按钮,什么?竟然提醒"注册码"不精确!怎么回事?我们解析的历程没有错呀!再一次翻开OD重新解析一遍,输入注册名tcxb和注册码12345,跟踪到最后,仍然是上一步得到的那个计算后果.注册码就在眼前,可为什么不能成功注册呢?
用OD解析的历程是不大概出错的,问题是不是在我们,是不是解析的时刻漏掉了什么?整理一下思绪,这个CrackMe的计算历程很简单,主要就是把一个字符串用MD5举行了一个加密处理.普通来说,MD5加密的都是注册名或是注册名加固定字符串等这样一些东西,这里也没有什么分外的地方.那么注册码考证的地方就更不用猜疑了,很明显是真假注册码对比,并且还是明码对比,但为什么后果就是不对呢?
大家注意,我们所接触的近似这样将某一个字符串用MD5加密,然后将加密后果作为注册码的情形,被加密的字符串都是由注册名直接变更得出的,比方加上一个固定字符串大概是和某一个数字做计算等,简单的说就是被加密的信息与注册码之间是没有关系的,重新到尾都是对注册名的计算.其实问题就是出在这里了.在这个CrackMe中,大家回想一下被加密的那个str1是怎样得来的?是用注册码的最后一位与注册名的每一位辨别计算后得出的,这样在被加密的信息和输入的注册码之间就有了一个动态关系了,只要输入的注册码发生改变,就直接招致被加密的信息发生改变,被加密的信息都发生改变了,最后的后果必定会出问题的.
还是举一个例子来说吧.仍然是tcxb这个注册名和12345这个注册码,经过解析我们可以理解到,目前的重点就在最后的那个数字5上面,因为被加密的字符串str1是由这个5和注册名直接计算而来的.接着我们在OD中找到了所谓的注册码c37985c0c4a3a9e4600d67c5d18af450,这些都没有问题.但是,当我们试图用c37985c0c4a3a9e4600d67c5d18af450这个字符串作为注册码与tcxb举行注册的时刻,问题呈现了,注册名没有改变,但是注册码的最后一位已不再是5了,而是0了,用5和0这两个差别的数与相同的一个对象作相同的计算,怎么大概得出相同的后果呢?所以在这里被加密的信息已经发生了改变,于是背面的MD5计算的后果也就不大概再相同了.
经过一番注释恍然大悟,本来问题出在了用MD5计算的那个字符串上.根本的缘由就是这个字符串不再是以往的只与注册名有关系了,而是与输入的注册码之间也成立了关系.这样,输入的注册码的改变同时也会惹起被加密信息的改变,最后招致了计算后果的差别.
懂得了原理,我们目前关心的是与注册名tcxb相对应的注册码毕竟是什么呢?首先,我们可以必定,因为被加密的信息与注册名是有关系的,所以我们跟踪得出的字符串c37985c0c4a3a9e4600d67c5d18af450必定与真正的注册码有一定的关系,那么另一个与加密信息有关的就是注册名的最后一位了,在计算c37985c0c4a3a9e4600d67c5d18af450的历程中,被加密的字符串是用数字5与注册名计算得来的,这就是说注册码的最后一位必须是5且注册名是tcxb,最后的计算后果才能是c37985c0c4a3a9e4600d67c5d18af450.既然它们之间是这样的一个关系,那么怎样才能满意这个关系呢?要满意最后一位是5,直接在这个字符串背面加一个5试试,公然,注册成功了!如图3所示.本来满意注册名tcxb的注册码就是c37985c0c4a3a9e4600d67c5d18af4505,还有很重要的一点,在注册码对比的历程中,对最后一位是不举行考证的.
  
图3
目前大家是不是都有这样一种感受,本来MD5还可以这样利用.其实,解析出后果并非最重要的,关键在于我们学习到了一种思绪,将加密信息与注册码成立接洽,便可以使终究的注册码由静态的变成动态的,所以,按照我们普通先输入假码跟踪出真码的办法,碰到这样的注册算法可就算是完好失效了


  以上是“MD5算法利用之"迷魂阵"[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • MD5算法的T-SQL实现(FOR SQL2000)(一)
  • MD5算法的T-SQL实现(FOR SQL2000)(二)
  • MD5算法的T-SQL实现(FORSQL2000)(一)
  • MD5算法的T-SQL实现(FORSQL2000)(二)
  • MD5算法的T-SQL实现(FOR SQL2000)
  • MD5算法利用之"迷魂阵"
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .