飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4091|回复: 8

[原创] crackme 2.1简单算法分析

[复制链接]

该用户从未签到

发表于 2009-12-16 15:50:49 | 显示全部楼层 |阅读模式
【文章标题】: 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
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2009-12-16 16:00:46 | 显示全部楼层
    兄弟的分析不错

    顶下兄弟了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2009-12-16 16:51:56 | 显示全部楼层
    顶上了/:014
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-4-26 10:19
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2009-12-16 16:58:19 | 显示全部楼层
    missviola辛苦了!Good Job!/:good可惜我没权限给你加分/:017

    [ 本帖最后由 小试锋芒 于 2009-12-16 17:01 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-16 17:08:39 | 显示全部楼层
    cm 没下,看了一下楼主的破文,咋强度貌似版本越高,强度越低
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-16 17:44:42 | 显示全部楼层
    加精华鼓励/:17   多玩CrackMe/:12
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2009-12-16 20:10:45 | 显示全部楼层

    回复 6# Luckly 的帖子

    感谢Lcukly版主加精~~:loveliness:
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2015-10-29 08:08
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2009-12-16 20:21:34 | 显示全部楼层
    分析的不错。。学习了。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-29 07:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-12-20 15:35:51 | 显示全部楼层
    我也过来学习一下。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表