missviola 发表于 2009-12-16 15:50:49

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

GGLHY 发表于 2009-12-16 16:00:46

兄弟的分析不错

顶下兄弟了

MOV 发表于 2009-12-16 16:51:56

顶上了/:014

小试锋芒 发表于 2009-12-16 16:58:19

missviola辛苦了!Good Job!/:good可惜我没权限给你加分/:017

[ 本帖最后由 小试锋芒 于 2009-12-16 17:01 编辑 ]

lgjxj 发表于 2009-12-16 17:08:39

cm 没下,看了一下楼主的破文,咋强度貌似版本越高,强度越低

Luckly 发表于 2009-12-16 17:44:42

加精华鼓励/:17   多玩CrackMe/:12

missviola 发表于 2009-12-16 20:10:45

回复 6# Luckly 的帖子

感谢Lcukly版主加精~~:loveliness:

creantan 发表于 2009-12-16 20:21:34

分析的不错。。学习了。。。

HDd1145 发表于 2009-12-20 15:35:51

我也过来学习一下。
页: [1]
查看完整版本: crackme 2.1简单算法分析