crackme 2.1简单算法分析
【文章标题】: Crackme 2.1简单算法分析【文章作者】: patapon
【下载地址】: 本区自己找
【使用工具】: PEID OD
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
昨晚联系了该cm的作者小试锋芒大侠,大侠说让我写篇破文发到论坛上去,遂有了此文。首先PEID查壳,显示为Delphi编写。
用OD载入,在455D40这里下断点,输入用户名pediy,注册码123456。分析如下:
00455D40 > .55 push ebp ;<-TForm1@Button1Click
00455D41 .8BEC mov ebp, esp
00455D43 .33C9 xor ecx, ecx
00455D45 .51 push ecx
00455D46 .51 push ecx
00455D47 .51 push ecx
00455D48 .51 push ecx
00455D49 .51 push ecx
00455D4A .51 push ecx
00455D4B .51 push ecx
00455D4C .51 push ecx
00455D4D .53 push ebx
00455D4E .56 push esi
00455D4F .57 push edi
00455D50 .8945 F8 mov dword ptr , eax
00455D53 .33C0 xor eax, eax
00455D55 .55 push ebp
00455D56 .68 A55E4500 push <->System.@HandleFinally;>
00455D5B .64:FF30 push dword ptr fs:
00455D5E .64:8920 mov dword ptr fs:, esp
00455D61 .8D55 EC lea edx, dword ptr
00455D64 .8B45 F8 mov eax, dword ptr
00455D67 > .8B80 F8020000 mov eax, dword ptr ;*Edit1:TEdit
00455D6D > .E8 4ADCFDFF call 004339BC ;->Controls.TControl.GetText(TControl):TCaption;
00455D72 .8D55 F0 lea edx, dword ptr
00455D75 .8B45 F8 mov eax, dword ptr
00455D78 > .8B80 FC020000 mov eax, dword ptr ;*Edit2:TEdit
00455D7E > .E8 39DCFDFF call 004339BC ;->Controls.TControl.GetText(TControl):TCaption;
00455D83 .8B45 F0 mov eax, dword ptr
00455D86 > .E8 69E3FAFF call 004040F4 ;->System.@LStrLen(String):Integer;<+>
00455D8B .8945 F4 mov dword ptr , eax
00455D8E .33C0 xor eax, eax
00455D90 .55 push ebp
00455D91 .68 C15D4500 push <->System.@HandleAnyException;>
00455D96 .64:FF30 push dword ptr fs:
00455D99 .64:8920 mov dword ptr fs:, esp
00455D9C .8D4D E8 lea ecx, dword ptr
00455D9F .BA 03000000 mov edx, 3
00455DA4 .8B45 F0 mov eax, dword ptr
00455DA7 > .E8 602AFDFF call 0042880C ;->StrUtils.RightStr(AnsiString;Integer):AnsiString;overload;
00455DAC .8B45 E8 mov eax, dword ptr
00455DAF > .E8 8821FBFF call 00407F3C ;->SysUtils.StrToInt(AnsiString):Integer;
00455DB4 .8945 FC mov dword ptr , eax
00455DB7 .33C0 xor eax, eax
00455DB9 .5A pop edx
00455DBA .59 pop ecx
00455DBB .59 pop ecx
00455DBC .64:8910 mov dword ptr fs:, edx
00455DBF .EB 12 jmp short 00455DD3
00455DC1 > .^ E9 BED7FAFF jmp 00403584 ;->System.@HandleAnyException;
00455DC6 .8B45 F8 mov eax, dword ptr
00455DC9 > .E8 629CFFFF call 0044FA30 ;->Forms.TCustomForm.Close(TCustomForm);
00455DCE > .E8 19DBFAFF call 004038EC ;->System.@DoneExcept;
00455DD3 >33C0 xor eax, eax
00455DD5 .55 push ebp
00455DD6 .68 785E4500 push <->System.@HandleAnyException;>
00455DDB .64:FF30 push dword ptr fs:
00455DDE .64:8920 mov dword ptr fs:, esp
00455DE1 .BB 105E4500 mov ebx, 00455E10
00455DE6 .B8 675E4500 mov eax, 00455E67
00455DEB .29D8 sub eax, ebx
00455DED .BA 00000000 mov edx, 0
00455DF2 .B9 04000000 mov ecx, 4
00455DF7 .F7F1 div ecx
00455DF9 .89C1 mov ecx, eax
00455DFB .89DE mov esi, ebx
00455DFD >8B06 mov eax, dword ptr 取各条指令的机器码
00455DFF .3345 FC xor eax, dword ptr 同注册码最后3位异或
00455E02 .8906 mov dword ptr , eax 再写回去
00455E04 .83C6 04 add esi, 4 ;(initial cpu selection)
00455E07 .^ E2 F4 loopd short 00455DFD
走到455DFD这里要动动脑子了,由于参加异或的是注册码的后3位,所以异或以后有一些字节是不会变的。我们可以从这些不
会变的字节下手,来猜正确的代码以及注册码的后3位。
第一次和第二次参加运算的机器码分别为8BE45785和25E8EE4D。第一次异或以后8B是不会变的,那就是说455E13此处应该为
一条mov指令,那么后面的4D和EE就分别代表了某个寄存器和。我们首先猜测后面的4D(ecx)异或以后变成45(eax)。
那么3位数的后两位应该为4D xor 45 = 08。
我们再回过头来猜第一位。由于有了后两位所以455E10出的第一个机器码85异或以后变成了8B,也就是lea指令。那么后面就可能是
lea 寄存器,的这种形式了。我们就猜后面的57异或以后变成了55.那么57 xor 55 =2。由此推算出后3位的十六进制应该
为0x208 = 520。这个数字很有含义哦,可能是正确的啊,我们代进去看看异或的结果。
00455E09 .60 pushad
00455E0A .B8 01000000 mov eax, 1
00455E0F .61 popad
00455E10 .8D55 E4 lea edx, dword ptr
00455E13 .8B45 EC mov eax, dword ptr
00455E16 .E8 25FCFFFF call 00455A40
00455E1B .8B45 E4 mov eax, dword ptr
00455E1E .50 push eax
00455E1F .8D4D E0 lea ecx, dword ptr
00455E22 .8B55 F4 mov edx, dword ptr
00455E25 .83EA 03 sub edx, 3
00455E28 .8B45 F0 mov eax, dword ptr
00455E2B .E8 6C29FDFF call 0042879C
00455E30 .8B55 E0 mov edx, dword ptr
00455E33 .58 pop eax
00455E34 .E8 07E4FAFF call 00404240
00455E39 .75 15 jnz short 00455E50
00455E3B .6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00455E3D .68 B45E4500 push 00455EB4 ; |Title = "提示"
00455E42 .68 BC5E4500 push 00455EBC ; |Text = ""D7,"",A2,"",B2,"岢晒",A6,"?,A1,""
00455E47 .6A 00 push 0 ; |hOwner = NULL
00455E49 .E8 0209FBFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00455E4E .EB 13 jmp short 00455E63
00455E50 >6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00455E52 .68 B45E4500 push 00455EB4 ; |Title = "提示"
00455E57 .68 C85E4500 push 00455EC8 ; |Text = ""D7,"",A2,"",B2,"崾?,B0,"埽",A1,""
00455E5C .6A 00 push 0 ; |hOwner = NULL
00455E5E .E8 ED08FBFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00455E63 >90 nop
00455E64 .90 nop
00455E65 .90 nop
00455E66 .90 nop
这个就是正确的指令了,后面两个MessageBoxA分别跳出正确和错误的对话框。要看算法的话可以跟进call 455A40这里。算法
很简单,就是注册名各位同注册名长度异或。这里不跟进去了,给出一组可用的注册信息吧。
用户名:pediy
注册码:u`al|520
--------------------------------------------------------------------------------
【经验总结】
总的来说这个cm不算太难,关键是那个smc猜代码的地方要用点心思。看出来以后算法及其简单。最后感谢小试锋芒大侠百
忙之中抽出时间写cm给我们练习。破文里有些地方说的不是很到位,还望各位大侠看官多多批评指正,也希望能有更多的大
侠写破文给我们这些小菜学习学习。。。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于PYG技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年12月16日 15:51:11 兄弟的分析不错
顶下兄弟了 顶上了/:014 missviola辛苦了!Good Job!/:good可惜我没权限给你加分/:017
[ 本帖最后由 小试锋芒 于 2009-12-16 17:01 编辑 ] cm 没下,看了一下楼主的破文,咋强度貌似版本越高,强度越低 加精华鼓励/:17 多玩CrackMe/:12
回复 6# Luckly 的帖子
感谢Lcukly版主加精~~:loveliness: 分析的不错。。学习了。。。 我也过来学习一下。
页:
[1]