My FAQ,最新最全的IT技术FAQ
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论
  当前位置:> 看雪学院专区 > CrackMe
[新人必看]Rith CrackMe 1-算法浅探
作者:佚名 时间:2005-11-17 11:37 出处:pediy.com 责编:My FAQ
              摘要:[新人必看]Rith CrackMe 1-算法浅探
这篇文章是我去年5月初学算法分析的时候写的,希望对像我这样的小鸟们有一点帮助...

==================================================================================
【工程作者】深海游侠
【作者邮箱】shenhaiyouxia@163.com
==================================================================================
【软件名称】Rith CrackMe 1
【软件下载】
附件:rith-crackme1.zip
【软件介绍】
一个不错的练习CRACKME!
【破解目的】只是兴趣,失误之处请各位大侠指点!
==================================================================================
【工程平台】WIN ME
【调试工具】TRW2000  peid  Windows自带计算器
==================================================================================
【破解过程】
首先老规矩查壳,不管有还是没有都要养成这个习惯,无壳VC++6.0,用TRW2000载入,下万能断点,断下,然后按N个F12,我们到了这里:


016F:004015C1 8B7E60           MOV      EDI,[ESI+60]
016F:004015C4 8B5FF8           MOV      EBX,[EDI-08]
016F:004015C7 83FB05           CMP      EBX,BYTE +05   -------->用户名是否小于5位
016F:004015CA 7C7E             JL       0040164A       -------->不是就不用比较了。
016F:004015CC 8B4664           MOV      EAX,[ESI+64]
016F:004015CF 89442414         MOV      [ESP+14],EAX
016F:004015D3 3958F8           CMP      [EAX-08],EBX   -------->用户名位数是否个注册码相等。
016F:004015D6 7572             JNZ      0040164A       -------->不等就不用比了,(这里我们知道了用户名和注册码的位数是相等的)
016F:004015D8 83FB14           CMP      EBX,BYTE +14   -------->用户名位数是否大于20
016F:004015DB 7F6D             JG       0040164A       -------->大于也不用比了,(上面是在计算前定义用户名和注册码的基本规律)
016F:004015DD 33C9             XOR      ECX,ECX        -------->ECX清0用于下面计算。
016F:004015DF 85DB             TEST     EBX,EBX    
016F:004015E1 7E54             JNG      00401637
016F:004015E3 8B742410         MOV      ESI,[ESP+10]   -------->ESI=31415926535897932384(这可不是注册码啊!算是一个小型的表!)
016F:004015E7 8A040F           MOV      AL,[EDI+ECX]   -------->用户名第一位以ASCII码形式入AL
016F:004015EA 0FBE2C31         MOVSX    EBP,BYTE [ECX+ESI]       --------->表的第一位3以ASCII码形式入EBP。EBP=33
016F:004015EE 0FBEC0           MOVSX    EAX,AL         -------->AL=EAX
016F:004015F1 99               CDQ     
016F:004015F2 F7FD             IDIV     EBP            -------->EAX/EBP,商入EAX,余入EDX
016F:004015F4 8BC2             MOV      EAX,EDX        -------->EDX→EAX
016F:004015F6 D1E0             SHL      EAX,1          -------->EAX逻辑左移1位,EAX=EAX*2
016F:004015F8 83F87B           CMP      EAX,BYTE +7B   -------->比较EAX和7B
016F:004015FB 7E03             JNG      00401600       -------->小于或者等于就跳
016F:004015FD 83E81A           SUB      EAX,BYTE +1A   -------->大于?那EAX=EAX-1A
016F:00401600 83F841           CMP      EAX,BYTE +41   -------->比较EAX和41
016F:00401603 7D09             JNL      0040160E       -------->大于或者等于就跳
016F:00401605 BA82000000       MOV      EDX,82         -------->EDX=82
016F:0040160A 2BD0             SUB      EDX,EAX        -------->EDX=EDX-EAX
016F:0040160C 8BC2             MOV      EAX,EDX        -------->EDX→EAX
016F:0040160E 83F85B           CMP      EAX,BYTE +5B   -------->比较EAX和5B
016F:00401611 7E12             JNG      00401625       -------->小于或者等于就跳
016F:00401613 83F861           CMP      EAX,BYTE +61   -------->比较EAX和61
016F:00401616 7D0D             JNL      00401625       -------->大于或者等于就跳
016F:00401618 99               CDQ                     -------->这个命令具体我也不清楚,但我知道EDX清0了。
016F:00401619 BD0A000000       MOV      EBP,0A         -------->0A→EBP
016F:0040161E F7FD             IDIV     EBP            -------->EAX/0A,商入EAX,余数入EDX
016F:00401620 83C230           ADD      EDX,BYTE +30   -------->EDX=EDX+30
016F:00401623 8BC2             MOV      EAX,EDX        -------->EDX→EAX
016F:00401625 8B542414         MOV      EDX,[ESP+14]   -------->EDX为假码
016F:00401629 38040A           CMP      [EDX+ECX],AL   -------->因为ECX充当计数器,所以就是比较这一位是否和计算出的EAX相等。
016F:0040162C 751C             JNZ      0040164A       -------->不等?那死
016F:0040162E 41               INC      ECX            -------->计数器ECX+1
016F:0040162F 3BCB             CMP      ECX,EBX        -------->EBX为用户名位数。相当于循环!
016F:00401631 7CB4             JL       004015E7       -------->循环!
016F:00401633 8B742418         MOV      ESI,[ESP+18]
016F:00401637 6A00             PUSH     BYTE +00
016F:00401639 6834304000       PUSH     DWORD 00403034
016F:0040163E 6820304000       PUSH     DWORD 00403020
016F:00401643 8BCE             MOV      ECX,ESI
016F:00401645 E854020000       CALL     `MFC42!ord_00001080`   ------>这个CALL我想就是我们想要的东西了。
016F:0040164A 8D4C2410         LEA      ECX,[ESP+10]
016F:0040164E C7442424FFFFFFFF MOV      DWORD [ESP+24],FFFFFFFF
016F:00401656 E835010000       CALL     `MFC42!ord_00000320`
016F:0040165B 8B4C241C         MOV      ECX,[ESP+1C]
016F:0040165F 5F               POP      EDI
016F:00401660 5E               POP      ESI
016F:00401661 5D               POP      EBP
016F:00401662 5B               POP      EBX
016F:00401663 64890D00000000   MOV      `DOSMGR_BackFill_Allowed`,ECX
016F:0040166A 83C418           ADD      ESP,BYTE +18
016F:0040166D C3               RET     
016F:0040166E 90               NOP     


算法分析:
1)首先用户名必须大于等于5位,而注册码必须和用户名位数相等!

2)用户名不能超过20位,可以等于20位

3)取表31415926535897932384   然后每一位和用户名的每一位计算,当然如果你用户名只有5位,那么只用前5位和用户名计算,计算过程我已经在上边表示了,要注意的是那几种情况,既然是练习,我也就不多罗嗦了,大家跟一遍就知道了。

4)我的用户名是cxxxxx  注册码是6VbVfv

破后感评:
既然是练习,我就不多说算法了,其实也就是看你跟踪能力,不要被过多跳转所迷惑,慢慢跟,其实都会看到你想要的。另外值得一提的就是几个跳转命令大家也要明白什么时候相等跳,什么时候相等不跳,还有他们直接的关系!
又一个漫漫长夜过去了,我不后悔。

                                             -----------深海游侠
                                             -----------2004.5.30凌晨

 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有