-
-
[新人必看]Rith CrackMe 1-算法浅探
-
发表于:
2005-2-10 22:23
6668
-
[新人必看]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凌晨
==================================================================================
【工程声明】本过程只供内部学习之用!如要转载请保持过程完整!
==================================================================================
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)