- UID
- 38098
注册时间2007-12-1
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
【文章标题】: Crackme 2.1简单算法分析
【文章作者】: patapon
【下载地址】: 本区自己找
【使用工具】: PEID OD
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
昨晚联系了该cm的作者小试锋芒大侠,大侠说让我写篇破文发到论坛上去,遂有了此文。首先PEID查壳,显示为Delphi编写。
用OD载入,在455D40这里下断点,输入用户名pediy,注册码123456。分析如下:
00455D40 > . 55 push ebp ; <[email=-TForm1@Button1Click]-TForm1@Button1Click[/email]
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 [ebp-8], eax
00455D53 . 33C0 xor eax, eax
00455D55 . 55 push ebp
00455D56 . 68 A55E4500 push <->System.@HandleFinally;>
00455D5B . 64:FF30 push dword ptr fs:[eax]
00455D5E . 64:8920 mov dword ptr fs:[eax], esp
00455D61 . 8D55 EC lea edx, dword ptr [ebp-14]
00455D64 . 8B45 F8 mov eax, dword ptr [ebp-8]
00455D67 > . 8B80 F8020000 mov eax, dword ptr [eax+2F8] ; *Edit1:TEdit
00455D6D > . E8 4ADCFDFF call 004339BC ; ->Controls.TControl.GetText(TControl):TCaption;
00455D72 . 8D55 F0 lea edx, dword ptr [ebp-10]
00455D75 . 8B45 F8 mov eax, dword ptr [ebp-8]
00455D78 > . 8B80 FC020000 mov eax, dword ptr [eax+2FC] ; *Edit2:TEdit
00455D7E > . E8 39DCFDFF call 004339BC ; ->Controls.TControl.GetText(TControl):TCaption;
00455D83 . 8B45 F0 mov eax, dword ptr [ebp-10]
00455D86 > . E8 69E3FAFF call 004040F4 ; ->System.@LStrLen(String):Integer;<+>
00455D8B . 8945 F4 mov dword ptr [ebp-C], eax
00455D8E . 33C0 xor eax, eax
00455D90 . 55 push ebp
00455D91 . 68 C15D4500 push <->System.@HandleAnyException;>
00455D96 . 64:FF30 push dword ptr fs:[eax]
00455D99 . 64:8920 mov dword ptr fs:[eax], esp
00455D9C . 8D4D E8 lea ecx, dword ptr [ebp-18]
00455D9F . BA 03000000 mov edx, 3
00455DA4 . 8B45 F0 mov eax, dword ptr [ebp-10]
00455DA7 > . E8 602AFDFF call 0042880C ; ->StrUtils.RightStr(AnsiString;Integer):AnsiString;overload;
00455DAC . 8B45 E8 mov eax, dword ptr [ebp-18]
00455DAF > . E8 8821FBFF call 00407F3C ; ->SysUtils.StrToInt(AnsiString):Integer;
00455DB4 . 8945 FC mov dword ptr [ebp-4], 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:[eax], edx
00455DBF . EB 12 jmp short 00455DD3
00455DC1 > .^ E9 BED7FAFF jmp 00403584 ; ->System.@HandleAnyException;
00455DC6 . 8B45 F8 mov eax, dword ptr [ebp-8]
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:[eax]
00455DDE . 64:8920 mov dword ptr fs:[eax], 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 [esi] 取各条指令的机器码
00455DFF . 3345 FC xor eax, dword ptr [ebp-4] 同注册码最后3位异或
00455E02 . 8906 mov dword ptr [esi], 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就分别代表了某个寄存器和[ebp-X]。我们首先猜测后面的4D(ecx)异或以后变成45(eax)。
那么3位数的后两位应该为4D xor 45 = 08。
我们再回过头来猜第一位。由于有了后两位所以455E10出的第一个机器码85异或以后变成了8B,也就是lea指令。那么后面就可能是
lea 寄存器,[ebp+X]的这种形式了。我们就猜后面的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 [ebp-1C]
00455E13 . 8B45 EC mov eax, dword ptr [ebp-14]
00455E16 . E8 25FCFFFF call 00455A40
00455E1B . 8B45 E4 mov eax, dword ptr [ebp-1C]
00455E1E . 50 push eax
00455E1F . 8D4D E0 lea ecx, dword ptr [ebp-20]
00455E22 . 8B55 F4 mov edx, dword ptr [ebp-C]
00455E25 . 83EA 03 sub edx, 3
00455E28 . 8B45 F0 mov eax, dword ptr [ebp-10]
00455E2B . E8 6C29FDFF call 0042879C
00455E30 . 8B55 E0 mov edx, dword ptr [ebp-20]
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 |
|