首页
社区
课程
招聘
[新人必看]Rith CrackMe 1-算法浅探
发表于: 2005-2-10 22:23 6678

[新人必看]Rith CrackMe 1-算法浅探

2005-2-10 22:23
6678

这篇文章是我去年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凌晨

==================================================================================
【工程声明】本过程只供内部学习之用!如要转载请保持过程完整!
==================================================================================


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持楼主!不错的算法入门教材!
2005-2-10 22:31
0
雪    币: 414
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
不错的文章!
望再努力!
2005-2-11 12:23
0
游客
登录 | 注册 方可回帖
返回
//