【文章标题】: 再来一个CRACK
【作者邮箱】: pyw800923@yahoo.com.cn
【软件名称】: Rith CrackMe 1
【软件大小】: 20.0KB
【编写语言】: vc++ 6.0
【使用工具】: OD PEID
【操作平台】: win XP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
输入练码,程序没有任何反应,故推测只有正确的用户名与注册码,才会有反应。
先用PEID检测,无壳。
OD载入,进行“超级字串查找”,发现 Well done cracker!双击进入
0040159D . 57 push edi ;F2下断
0040159E . 68 48304000 push Rith_Cra.00403048 ; 31415926535897932384
004015A3 . 8D4C24 14 lea ecx, dword ptr ss:[esp+14]
004015A7 . 897424 1C mov dword ptr ss:[esp+1C], esi
004015AB . E8 FA020000 call <jmp.&MFC42.#537>
004015B0 . 6A 01 push 1
004015B2 . 8BCE mov ecx, esi
004015B4 . C74424 28 000>mov dword ptr ss:[esp+28], 0
004015BC . E8 E3020000 call <jmp.&MFC42.#6334>
004015C1 . 8B7E 60 mov edi, dword ptr ds:[esi+60] ; 用户输入的用户名到edi
004015C4 . 8B5F F8 mov ebx, dword ptr ds:[edi-8] ; 用户名长度
004015C7 . 83FB 05 cmp ebx, 5 ; 比较用户名位数是否小于5位
004015CA . 7C 7E jl short Rith_Cra.0040164A ; 用户名小于5位,退出
004015CC . 8B46 64 mov eax, dword ptr ds:[esi+64] ; 用户输入的密码
004015CF . 894424 14 mov dword ptr ss:[esp+14], eax ; 密码转存到esp+14处
004015D3 . 3958 F8 cmp dword ptr ds:[eax-8], ebx ; 用户名长度与密码长度对比
004015D6 . 75 72 jnz short Rith_Cra.0040164A ; 用户名长度与密码长度不同退出
004015D8 . 83FB 14 cmp ebx, 14
004015DB . 7F 6D jg short Rith_Cra.0040164A ; 用户名长度大于14退出
004015DD . 33C9 xor ecx, ecx
004015DF . 85DB test ebx, ebx
004015E1 . 7E 54 jle short Rith_Cra.00401637
004015E3 . 8B7424 10 mov esi, dword ptr ss:[esp+10] ; 取圆周率
004015E7 > 8A040F mov al, byte ptr ds:[edi+ecx] ; ecx=0.取用户名中的第edi+ecx位
004015EA . 0FBE2C31 movsx ebp, byte ptr ds:[ecx+esi] ; 取圆周率的第esi+ecx位,并扩充为32位,用符号位填充
004015EE . 0FBEC0 movsx eax, al ; 将取出的用户名,扩充为32位
004015F1 . 99 cdq ; 用EAX的符号位填充EDX,然后edx:eax作被除数
004015F2 . F7FD idiv ebp ; edx:eax/ebp,商在eax中,余数在edx中
004015F4 . 8BC2 mov eax, edx ; 将余数放入eax
004015F6 . D1E0 shl eax, 1 ; 将余数放在eax中,再逻辑左移1位,
004015F8 . 83F8 7B cmp eax, 7B ; 结果与7b比较
004015FB . 7E 03 jle short Rith_Cra.00401600
004015FD . 83E8 1A sub eax, 1A
00401600 > 83F8 41 cmp eax, 41
00401603 . 7D 09 jge short Rith_Cra.0040160E
00401605 . BA 82000000 mov edx, 82 ; 82为十六进制数
0040160A . 2BD0 sub edx, eax ; 82减去第一位计算出的注册码,再存到eax中
0040160C . 8BC2 mov eax, edx
0040160E > 83F8 5B cmp eax, 5B
00401611 . 7E 12 jle short Rith_Cra.00401625 ; 小于等于跳转
00401613 . 83F8 61 cmp eax, 61
00401616 . 7D 0D jge short Rith_Cra.00401625 ; 大于等于跳转
00401618 . 99 cdq
00401619 . BD 0A000000 mov ebp, 0A
0040161E . F7FD idiv ebp
00401620 . 83C2 30 add edx, 30
00401623 . 8BC2 mov eax, edx
00401625 > 8B5424 14 mov edx, dword ptr ss:[esp+14]
00401629 . 38040A cmp byte ptr ds:[edx+ecx], al ; 计算出的注册码的第一位放入al,与输入的第一位比较
0040162C . 75 1C jnz short Rith_Cra.0040164A ; 如果有一位不一样则跳出,退出比较
0040162E . 41 inc ecx ; ECX加1
0040162F . 3BCB cmp ecx, ebx ; ECX与EBX(即用户名长度)比较,小于,计算下一位,否则显示成功
00401631 .^ 7C B4 jl short Rith_Cra.004015E7
00401633 . 8B7424 18 mov esi, dword ptr ss:[esp+18]
00401637 > 6A 00 push 0
00401639 . 68 34304000 push Rith_Cra.00403034 ; congratulations!
0040163E . 68 20304000 push Rith_Cra.00403020 ; well done cracker!
――――――――――――――――――――――――――――――――――――――――――――――――――――――
算法总结:
第一位注册码为00beH=n
用户名中的第EDI+ECX位,放入EAX中,扩充到EDX:EAX,然后去除圆周率中的第ESI+ECX位,将余数由EDX放入EAX中,然后再将EAX左移一位,结果与7B比较(小于等于7B则EAX与41比较),如果大于等于7B,则EAX减去1A, 跟41比较,如果EAX小于41,则使EDX=82,82-EAX=EDX,再将EDX送到EAX中,(如果大于等于41,则EAX直接与5B比较),EAX再与5B比较,小于等于转移到00401625,
与5B比较, 大于,则EAX与61比较,大于等于61则转移到00401625 否则,与61比较,小于61,则将EAX中的值扩充到EDX:EAX, 使EBP=0A,用EDX:EAX去除EBP,将余数
放EDX,再加30,送到EAX中
转移到00401625,
00401625,取出用户输入的第EDX+ECX位注册码,与计算出来的EAX中的最低位AL,比较,相等,则重复计算下一位EAX与用户输入的第二位注册码比较,
不相等,则直接退出。
用户名:pywsxq
注册码:nTd6fp
x=78h
00000000:00000078/35h=2.....0Eh(EDX);78H=120d,35H=53d,则120/53=2余14即0EH=EDX=EAX
EAX=0EH左移一位为
EAX=0000 0000 0000 1110
EAX=0000 0000 0001 1100=0000001CH<41h,则EDX=82H-EAX=66H=EAX,EAX=66H>5BH则EAX与61H比较,EAX>61H
EAX中的AL为66H=字符f
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年05月02日 15:16:50
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)