-
-
[原创]Crackme 05 的详解
-
发表于:
2011-8-20 19:15
11921
-
【破文标题】Crackme 05 的详解
【难度级别】初入门的新手
【下载地址】见附件
【破解工具】OD,peid
【加壳方式】无壳
【保护方式】无Anti-debug
【破解声明】本人破解很菜,此CrackMe算是入门级的,希望以此作为一些简单的案例,给我室友以及才开始接触逆向的各位兄弟,希望大家有所收获,如果不出意外这是一个长期的学习笔记,请大家多多指教。
【前文连接】http://bbs.pediy.com/showthread.php?t=138271
及才开始接触逆向的各位兄弟,希望大家有所收获,如果不出意外这是一个长期的学习笔记,请大家多多指教。
【备 注】
1.老手勿看。
2.前段时候回家和高中同学聚会,学习什么的就偷了点懒,更新速度慢了些,不过还是希望大家多多支持。
3.过段时间CrackMe比赛就要开始了,大家提早热热身找找感觉噢
老规矩,首先用PEiD载入。如图,我们发现显示的是"什么也没发现",可能加了壳的,但是我们观察区段信息和导入表的的API又发现貌似是未加壳滴。所以,我们直接用OD加载,通过对反汇编代码的观察,我们大致可以确定是masm编写的。对GetWindowTextA这个API下断点,然后按F9,程序跑起来。在"help"菜单下点击"registra",弹出了输入用户名和密码的对话框。我们随便输入一组"loongzyd","1234567890"。点击"OK"Button,我们来到了0x4014AD处,我们发现这里调用了两次GetWindowTextA,显示这是获取我们输入的用户名和密码,接下来的几十行就是整个算法的处理。
首先,程序将我们输入的用户名和密码分别存放在两个数组中,其中要求用户名的长度要大于等于6并且最多只读入前10位的字符,而密码的长度必须为10。然后通过一个循环来判断输入的密码字符串的字符是否都是数字字符(0-9)或者B-F,只要有一个字符不符合要求就失败,接下来通过另外一个循环将输入的用户名字符串的字符的asc码之和模256的值保存(即取其低16位)
0040154B . 0FB605 F33140>MOVZX EAX,BYTE PTR DS:[4031F3]
00401552 . 8AC8 MOV CL,AL ; 密码前2个字符处理之后的果
00401554 . 2ACB SUB CL,BL ; 减去用户名字符串的和的低16的值
00401556 . 80F9 04 CMP CL,4 ; 如果大于0x4则失败
00401559 . 7F 63 JG SHORT Pythagor.004015BE
0040155B . 80F9 FC CMP CL,0FC ; 如果小于-4则失败
0040155E . 7C 5E JL SHORT Pythagor.004015BE
00401560 . F7E0 MUL EAX ; 0x12*0x12(密
码字符串前2个字符处理之后的数值计算其平方)
00401562 . 8BD8 MOV EBX,EAX
00401564 . 0FB705 F43140>MOVZX EAX,WORD PTR DS:[4031F4] ;
0x3456*0x3456(密码字符串第3-6位字符处理之后的数值计算其平方)
0040156B . F7E0 MUL EAX
0040156D . 03D8 ADD EBX,EAX ; 前两个值相加
0040156F . 0FB705 F63140>MOVZX EAX,WORD PTR DS:[4031F6]
00401576 . F7E0 MUL EAX ;
0x7890*0x7890(密码字符串第7-10位字符处理之后的数值计算其平方)
00401578 . 33C3 XOR EAX,EBX ;
0x12*0x12+0x3456*0x3456==0x7890*0x7890(两个必须相等)
0040157A . 75 42 JNZ SHORT Pythagor.004015BE
0040157C . 66:A1 F631400>MOV AX,WORD PTR DS:[4031F6]
00401582 . 66:2B05 F4314>SUB AX,WORD PTR DS:[4031F4] ; 0x7890-0x3456
00401589 . 2C 08 SUB AL,8 ; 0x90-0x56 ==
0x08
0040158B . 75 31 JNZ SHORT Pythagor.004015BE
0040158D . 6A 30 PUSH 30 ; /Style =
MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040158F . 68 B0314000 PUSH Pythagor.004031B0 ; |Title = ":-)
Well done!!!"
00401594 . 68 7F314000 PUSH Pythagor.0040317F ; |Text =
"Bravo, hai trovato il seriale di questo CrackMe!"
00401599 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040159C . E8 3D010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)