首页
社区
课程
招聘
一个简单CrackMe的分析
发表于: 2006-9-10 10:06 6050

一个简单CrackMe的分析

2006-9-10 10:06
6050

【文章标题】: 一个简单CrackMe的分析
【文章作者】: ikki[D.4s]
【下载地址】: http://bbs.pediy.com/attachment.php?s=&attachmentid=2754
【使用工具】: olldbg
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  
  
  
  CrackMe下载地址:
  http://bbs.pediy.com/attachment.php?s=&attachmentid=2754
  
  
  以输入
  name:ikki
  code:1234-2345-3456-4567
  为例。
  
  00450A94    B9 01000000        mov ecx,1
  00450A99    8B45 CC            mov eax,dword ptr ss:[ebp-34]                 ; /
  00450A9C    0FB64408 FF        movzx eax,byte ptr ds:[eax+ecx-1]
  00450AA1    F7E9               imul ecx
  00450AA3    99                 cdq
  00450AA4    0345 D8            add eax,dword ptr ss:[ebp-28]                 ; 对name字符串进行计算
  00450AA7    1355 DC            adc edx,dword ptr ss:[ebp-24]
  00450AAA    8945 D8            mov dword ptr ss:[ebp-28],eax
  00450AAD    8955 DC            mov dword ptr ss:[ebp-24],edx
  00450AB0    41                 inc ecx
  00450AB1    4B                 dec ebx
  00450AB2  ^ 75 E5              jnz short ♂CrackM.00450A99                    ; \
  
  ----------------
  char strName[] = "ikki";
  unsigned long result = 0;
  for(int i = 0; i < strlen(strName); i++)
  {
  result += strName[i] * (i + 1);
  }
  //"ikki"的计算结果是:0x424
  
  
  
  
  00450AB4    8B45 C8            mov eax,dword ptr ss:[ebp-38]
  00450AB7 >  E8 94FAFFFF        call ♂CrackM.00450550                         ; 计算blowfish子密钥(key="SUNZONES")
  00450ABC    FF75 DC            push dword ptr ss:[ebp-24]                    ; 0x0000
  00450ABF    FF75 D8            push dword ptr ss:[ebp-28]                    ; 0x424(前面对name字符串计算的结果)
  00450AC2 >  E8 4DF9FFFF        call ♂CrackM.00450414                         ; blowfish加密函数--bf_en()
  00450AC7    FF75 DC            push dword ptr ss:[ebp-24]                    ; (不知道作者为什么用相同的参数加密两次)
  00450ACA    FF75 D8            push dword ptr ss:[ebp-28]
  00450ACD >  E8 42F9FFFF        call ♂CrackM.00450414                         ; blowfish加密函数--bf_en()
  00450AD2    8905 245C4500      mov dword ptr ds:[455C24],eax                 ; 结果保存起来,
  00450AD8    8915 285C4500      mov dword ptr ds:[455C28],edx                 ; 后面用到
  00450ADE    8D55 C4            lea edx,dword ptr ss:[ebp-3C]
  00450AE1    8B45 FC            mov eax,dword ptr ss:[ebp-4]
  00450AE4 >  8B80 FC020000      mov eax,dword ptr ds:[eax+2FC]                ; *TForm1.Edit2:TEdit
  00450AEA >  E8 29ECFDFF        call ♂CrackM.0042F718                         ; ->Controls.TControl.GetText(TControl):TCaption;
  00450AEF    8B45 C4            mov eax,dword ptr ss:[ebp-3C]
  00450AF2 >  E8 E535FBFF        call ♂CrackM.004040DC                         ; ->System.@LStrLen(String):Integer;
  00450AF7    83F8 13            cmp eax,13                                    ; code字符串长度是否为19位?
  00450AFA    0F85 68010000      jnz ♂CrackM.00450C68
  00450B00    8D55 D4            lea edx,dword ptr ss:[ebp-2C]
  00450B03    8B45 FC            mov eax,dword ptr ss:[ebp-4]
  00450B06 >  8B80 FC020000      mov eax,dword ptr ds:[eax+2FC]                ; *TForm1.Edit2:TEdit
  00450B0C >  E8 07ECFDFF        call ♂CrackM.0042F718                         ; ->Controls.TControl.GetText(TControl):TCaption;
  00450B11    8D45 D0            lea eax,dword ptr ss:[ebp-30]
  00450B14 >  E8 0333FBFF        call ♂CrackM.00403E1C                         ; ->System.@LStrClr(void;void);
  00450B19    BB 01000000        mov ebx,1                                     ; /
  00450B1E    8D45 C0            lea eax,dword ptr ss:[ebp-40]
  00450B21    8B55 D4            mov edx,dword ptr ss:[ebp-2C]
  00450B24    8A541A FF          mov dl,byte ptr ds:[edx+ebx-1]
  00450B28 >  E8 D734FBFF        call ♂CrackM.00404004                         ; ->System.@LStrFromChar(String;String;Char);
  00450B2D    8B55 C0            mov edx,dword ptr ss:[ebp-40]
  00450B30    8D45 D0            lea eax,dword ptr ss:[ebp-30]                 ; 对code字符串的1-4进行处理
  00450B33 >  E8 AC35FBFF        call ♂CrackM.004040E4                         ; ->System.@LStrCat;
  00450B38    43                 inc ebx                                       ; 依次取一位并连接
  00450B39    83FB 05            cmp ebx,5
  00450B3C  ^ 75 E0              jnz short ♂CrackM.00450B1E                    ; \
  00450B3E    BB 06000000        mov ebx,6                                     ; /
  00450B43    8D45 BC            lea eax,dword ptr ss:[ebp-44]
  00450B46    8B55 D4            mov edx,dword ptr ss:[ebp-2C]
  00450B49    8A541A FF          mov dl,byte ptr ds:[edx+ebx-1]
  00450B4D >  E8 B234FBFF        call ♂CrackM.00404004                         ; ->System.@LStrFromChar(String;String;Char);
  00450B52    8B55 BC            mov edx,dword ptr ss:[ebp-44]                 ; 6-9位
  00450B55    8D45 D0            lea eax,dword ptr ss:[ebp-30]
  00450B58 >  E8 8735FBFF        call ♂CrackM.004040E4                         ; ->System.@LStrCat;
  00450B5D    43                 inc ebx
  00450B5E    83FB 0A            cmp ebx,0A
  00450B61  ^ 75 E0              jnz short ♂CrackM.00450B43                    ; \
  00450B63    BB 0B000000        mov ebx,0B                                    ; /
  00450B68    8D45 B8            lea eax,dword ptr ss:[ebp-48]
  00450B6B    8B55 D4            mov edx,dword ptr ss:[ebp-2C]
  00450B6E    8A541A FF          mov dl,byte ptr ds:[edx+ebx-1]
  00450B72 >  E8 8D34FBFF        call ♂CrackM.00404004                         ; ->System.@LStrFromChar(String;String;Char);
  00450B77    8B55 B8            mov edx,dword ptr ss:[ebp-48]
  00450B7A    8D45 D0            lea eax,dword ptr ss:[ebp-30]                 ; 11-14
  00450B7D >  E8 6235FBFF        call ♂CrackM.004040E4                         ; ->System.@LStrCat;
  00450B82    43                 inc ebx
  00450B83    83FB 0F            cmp ebx,0F
  00450B86  ^ 75 E0              jnz short ♂CrackM.00450B68                    ; \
  00450B88    BB 10000000        mov ebx,10                                    ; /
  00450B8D    8D45 B4            lea eax,dword ptr ss:[ebp-4C]
  00450B90    8B55 D4            mov edx,dword ptr ss:[ebp-2C]
  00450B93    8A541A FF          mov dl,byte ptr ds:[edx+ebx-1]
  00450B97 >  E8 6834FBFF        call ♂CrackM.00404004                         ; ->System.@LStrFromChar(String;String;Char);
  00450B9C    8B55 B4            mov edx,dword ptr ss:[ebp-4C]                 ; 16-19
  00450B9F    8D45 D0            lea eax,dword ptr ss:[ebp-30]
  00450BA2 >  E8 3D35FBFF        call ♂CrackM.004040E4                         ; ->System.@LStrCat;
  00450BA7    43                 inc ebx
  00450BA8    83FB 14            cmp ebx,14
  00450BAB  ^ 75 E0              jnz short ♂CrackM.00450B8D                    ; \
  00450BAD    33C0               xor eax,eax
  00450BAF    55                 push ebp
  00450BB0    68 480C4500        push <♂CrackM.->System.@HandleAnyException;>
  00450BB5    64:FF30            push dword ptr fs:[eax]
  00450BB8    64:8920            mov dword ptr fs:[eax],esp
  00450BBB    8D45 B0            lea eax,dword ptr ss:[ebp-50]
  00450BBE    8B4D D0            mov ecx,dword ptr ss:[ebp-30]
  00450BC1    BA D80C4500        mov edx,♂CrackM.00450CD8
  00450BC6 >  E8 5D35FBFF        call ♂CrackM.00404128                         ; 字符'$'与前面得到的字符串连接
  00450BCB    8B45 B0            mov eax,dword ptr ss:[ebp-50]
  00450BCE >  E8 DD73FBFF        call ♂CrackM.00407FB0                         ; ->SysUtils.StrToInt64(AnsiString):Int64;
  00450BD3    8945 F0            mov dword ptr ss:[ebp-10],eax
  00450BD6    8955 F4            mov dword ptr ss:[ebp-C],edx
  00450BD9    B8 C40C4500        mov eax,♂CrackM.00450CC4                      ; ASCII "SUNZONES"
  00450BDE >  E8 6DF9FFFF        call ♂CrackM.00450550                         ; 计算blowfish子密钥(key="SUNZONES")
  00450BE3    FF75 F4            push dword ptr ss:[ebp-C]                     ; 0x12342345
  00450BE6    FF75 F0            push dword ptr ss:[ebp-10]                    ; 0x34564567
  00450BE9    E8 8AF7FFFF        call ♂CrackM.00450378                         ; blowfish解密函数bf_de()
  00450BEE    8945 E8            mov dword ptr ss:[ebp-18],eax                 ; 保存结果
  00450BF1    8955 EC            mov dword ptr ss:[ebp-14],edx                 ; 保存结果
  00450BF4    8B45 E8            mov eax,dword ptr ss:[ebp-18]
  00450BF7    8B55 EC            mov edx,dword ptr ss:[ebp-14]
  00450BFA    2B05 245C4500      sub eax,dword ptr ds:[455C24]                 ; 与加密时得到的结果比较,是否相等
  00450C00    1B15 285C4500      sbb edx,dword ptr ds:[455C28]                 ; 与加密时得到的结果比较,是否相等
  00450C06    8945 E0            mov dword ptr ss:[ebp-20],eax
  00450C09    8955 E4            mov dword ptr ss:[ebp-1C],edx
  00450C0C    8B45 E0            mov eax,dword ptr ss:[ebp-20]
  00450C0F    83E8 01            sub eax,1                                     ; 根据比较结果跳转。这两句功能类似常见的
  00450C12    73 16              jnb short ♂CrackM.00450C2A                    ; cmp eax, 0/jnz xxx
  00450C14    8B45 FC            mov eax,dword ptr ss:[ebp-4]
  00450C17 >  8B80 14030000      mov eax,dword ptr ds:[eax+314]                ; *TForm1.Label3:TLabel
  00450C1D    8B15 C82D4500      mov edx,dword ptr ds:[452DC8]                 ; ♂CrackM.004509A8
  
  
  00450BDE >  E8 6DF9FFFF        call ♂CrackM.00450550                         ; 计算blowfish子密钥(key="SUNZONES")
------------
00450550    55                 push ebp
00450551    8BEC               mov ebp,esp
00450553    83C4 E8            add esp,-18
00450556    53                 push ebx
00450557    56                 push esi
00450558    57                 push edi
00450559    8945 FC            mov dword ptr ss:[ebp-4],eax
0045055C    8B45 FC            mov eax,dword ptr ss:[ebp-4]
0045055F    E8 683DFBFF        call ♂CrackM.004042CC
00450564    33C0               xor eax,eax
00450566    55                 push ebp
00450567    68 76064500        push ♂CrackM.00450676
0045056C    64:FF30            push dword ptr fs:[eax]
0045056F    64:8920            mov dword ptr fs:[eax],esp
00450572    B8 D04B4500        mov eax,♂CrackM.00454BD0
00450577    33C9               xor ecx,ecx
00450579    BA 48100000        mov edx,1048
0045057E    E8 7D25FBFF        call ♂CrackM.00402B00
00450583    BB 01000000        mov ebx,1
00450588    BE 12000000        mov esi,12
0045058D    C745 EC 801D4500   mov dword ptr ss:[ebp-14],♂CrackM.00451D80
00450594    C745 E8 D04B4500   mov dword ptr ss:[ebp-18],♂CrackM.00454BD0
0045059B    33C0               xor eax,eax
0045059D    8945 F8            mov dword ptr ss:[ebp-8],eax
004505A0    BF 04000000        mov edi,4
004505A5    8B45 F8            mov eax,dword ptr ss:[ebp-8]                  ; /
004505A8    C1E0 08            shl eax,8
004505AB    8B55 FC            mov edx,dword ptr ss:[ebp-4]
004505AE    0FB6541A FF        movzx edx,byte ptr ds:[edx+ebx-1]
004505B3    0BC2               or eax,edx
004505B5    8945 F8            mov dword ptr ss:[ebp-8],eax                  ; strToHex
004505B8    43                 inc ebx
004505B9    8B45 FC            mov eax,dword ptr ss:[ebp-4]
004505BC    E8 1B3BFBFF        call ♂CrackM.004040DC
004505C1    3BD8               cmp ebx,eax
004505C3    7E 05              jle short ♂CrackM.004505CA
004505C5    BB 01000000        mov ebx,1
004505CA    4F                 dec edi
004505CB  ^ 75 D8              jnz short ♂CrackM.004505A5                    ; \
004505CD    8B45 EC            mov eax,dword ptr ss:[ebp-14]                 ; /
004505D0    8B00               mov eax,dword ptr ds:[eax]
004505D2    3345 F8            xor eax,dword ptr ss:[ebp-8]
004505D5    8B55 E8            mov edx,dword ptr ss:[ebp-18]                 ; 用key依次XOR pBox
004505D8    8902               mov dword ptr ds:[edx],eax                    ; pBox[i](i form 0 to 17)
004505DA    8345 E8 04         add dword ptr ss:[ebp-18],4                   ; key="SUNZONES"
004505DE    8345 EC 04         add dword ptr ss:[ebp-14],4
004505E2    4E                 dec esi
004505E3  ^ 75 B6              jnz short ♂CrackM.0045059B                    ; \
004505E5    33F6               xor esi,esi
004505E7    BA C81D4500        mov edx,♂CrackM.00451DC8
004505EC    33DB               xor ebx,ebx
004505EE    8BC2               mov eax,edx
004505F0    8BCE               mov ecx,esi                                   ; /
004505F2    C1E1 08            shl ecx,8
004505F5    03CB               add ecx,ebx
004505F7    8B38               mov edi,dword ptr ds:[eax]                    ; 初始化SBox[4][256]
004505F9    893C8D 184C4500    mov dword ptr ds:[ecx*4+454C18],edi
00450600    43                 inc ebx
00450601    83C0 04            add eax,4
00450604    81FB 00010000      cmp ebx,100
0045060A  ^ 75 E4              jnz short ♂CrackM.004505F0
0045060C    46                 inc esi
0045060D    81C2 00040000      add edx,400
00450613    83FE 04            cmp esi,4
00450616  ^ 75 D4              jnz short ♂CrackM.004505EC                    ; \
00450618    C745 F0 00000000   mov dword ptr ss:[ebp-10],0
0045061F    C745 F4 00000000   mov dword ptr ss:[ebp-C],0
00450626    BE 09020000        mov esi,209
0045062B    BB D04B4500        mov ebx,♂CrackM.00454BD0
00450630    FF75 F4            push dword ptr ss:[ebp-C]                     ; /
00450633    FF75 F0            push dword ptr ss:[ebp-10]
00450636    E8 D9FDFFFF        call ♂CrackM.00450414                         ; bf_en()
0045063B    8945 F0            mov dword ptr ss:[ebp-10],eax
0045063E    8955 F4            mov dword ptr ss:[ebp-C],edx
00450641    8B45 F4            mov eax,dword ptr ss:[ebp-C]                  ; PBox/SBox替换
00450644    33D2               xor edx,edx
00450646    8903               mov dword ptr ds:[ebx],eax
00450648    6A 01              push 1
0045064A    6A 00              push 0
0045064C    8B45 F0            mov eax,dword ptr ss:[ebp-10]
0045064F    8B55 F4            mov edx,dword ptr ss:[ebp-C]
00450652    E8 8D45FBFF        call ♂CrackM.00404BE4
00450657    8943 04            mov dword ptr ds:[ebx+4],eax
0045065A    83C3 08            add ebx,8
0045065D    4E                 dec esi
0045065E  ^ 75 D0              jnz short ♂CrackM.00450630                    ; \
00450660    33C0               xor eax,eax
00450662    5A                 pop edx
00450663    59                 pop ecx
00450664    59                 pop ecx
00450665    64:8910            mov dword ptr fs:[eax],edx
00450668    68 7D064500        push ♂CrackM.0045067D
0045066D    8D45 FC            lea eax,dword ptr ss:[ebp-4]
00450670    E8 A737FBFF        call ♂CrackM.00403E1C
00450675    C3                 retn
-------------

  00450ACD >  E8 42F9FFFF        call ♂CrackM.00450414                         ; blowfish加密函数--bf_en()
------------
00450411    8D40 00            lea eax,dword ptr ds:[eax]
00450414    55                 push ebp
00450415    8BEC               mov ebp,esp
00450417    83C4 E8            add esp,-18
0045041A    53                 push ebx
0045041B    56                 push esi
0045041C    57                 push edi
0045041D    8B45 0C            mov eax,dword ptr ss:[ebp+C]
00450420    33D2               xor edx,edx
00450422    8BF0               mov esi,eax
00450424    6A 01              push 1
00450426    6A 00              push 0
00450428    8B45 08            mov eax,dword ptr ss:[ebp+8]
0045042B    8B55 0C            mov edx,dword ptr ss:[ebp+C]
0045042E    E8 B147FBFF        call ♂CrackM.00404BE4
00450433    8945 F4            mov dword ptr ss:[ebp-C],eax
00450436    B3 01              mov bl,1
00450438    BF D04B4500        mov edi,♂CrackM.00454BD0
0045043D    3337               xor esi,dword ptr ds:[edi]
0045043F    8BC6               mov eax,esi
00450441    E8 6A000000        call ♂CrackM.004504B0                         ; F()
00450446    3145 F4            xor dword ptr ss:[ebp-C],eax
00450449    80FB 10            cmp bl,10
0045044C    73 08              jnb short ♂CrackM.00450456
0045044E    8B45 F4            mov eax,dword ptr ss:[ebp-C]
00450451    8975 F4            mov dword ptr ss:[ebp-C],esi
00450454    8BF0               mov esi,eax
00450456    43                 inc ebx
00450457    83C7 04            add edi,4
0045045A    80FB 11            cmp bl,11
0045045D  ^ 75 DE              jnz short ♂CrackM.0045043D
0045045F    A1 104C4500        mov eax,dword ptr ds:[454C10]
00450464    3145 F4            xor dword ptr ss:[ebp-C],eax
00450467    3335 144C4500      xor esi,dword ptr ds:[454C14]
0045046D    8BC6               mov eax,esi
0045046F    33D2               xor edx,edx
00450471    8945 E8            mov dword ptr ss:[ebp-18],eax
00450474    8955 EC            mov dword ptr ss:[ebp-14],edx
00450477    8B45 F4            mov eax,dword ptr ss:[ebp-C]
0045047A    33D2               xor edx,edx
0045047C    52                 push edx
0045047D    50                 push eax
0045047E    8B55 E8            mov edx,dword ptr ss:[ebp-18]
00450481    33C0               xor eax,eax
00450483    0B0424             or eax,dword ptr ss:[esp]
00450486    0B5424 04          or edx,dword ptr ss:[esp+4]
0045048A    83C4 08            add esp,8
0045048D    8945 E8            mov dword ptr ss:[ebp-18],eax
00450490    8955 EC            mov dword ptr ss:[ebp-14],edx
00450493    8B45 E8            mov eax,dword ptr ss:[ebp-18]
00450496    8945 F8            mov dword ptr ss:[ebp-8],eax
00450499    8B45 EC            mov eax,dword ptr ss:[ebp-14]
0045049C    8945 FC            mov dword ptr ss:[ebp-4],eax
0045049F    8B45 F8            mov eax,dword ptr ss:[ebp-8]
004504A2    8B55 FC            mov edx,dword ptr ss:[ebp-4]
004504A5    5F                 pop edi
004504A6    5E                 pop esi
004504A7    5B                 pop ebx
004504A8    8BE5               mov esp,ebp
004504AA    5D                 pop ebp
004504AB    C2 0800            retn 8

--------------------------------------------------------------------------------
【经验总结】
  从以上分析可以看到,这个CrackMe的验证就是
  blowfish_EN(clac(name))=?blowfish_DE(code)
  (key="SUNZONES")
  
  所以
  code=bf_EN(bf_EN(calc(name)))
  (key="SUNZONES")
  通过这个就可以计算出对应的注册码了,其中bf_EN()/bf_DE()的代码在CrackMe中都包含有,可以利用

它自身做个keygen。

  用的是标准的blowfish算法,只是对SBOX的最后4位参数作了修改:
  原始参数   修改后的参数       
  B74E6132-->B74E6131

  CE77E25B-->CE77E25A

  578FDFE3-->578FDFE2

  3AC372E6-->3AC372E5
  
  一个可用的name和code:
  name:ikki
  code:1B8F-01FD-23AE-5F44

  用网上的blowfish的代码写了个C的注册机,代码比较简单,看看就明白了。  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年09月10日 10:05:56


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
都没说明为什么会断在
00450A94    B9 01000000        mov ecx,1

开篇就直接分析了,为难我这种菜鸟了。。
2006-9-10 16:58
0
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
其中bf_EN()/bf_DE()的代码在CrackMe中都包含有
里面的代码乱七八糟 只能用汇编 直接复制代码进去
我等小菜菜看不明白 希望写个C的注册机 学习学习
2006-9-10 18:02
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
4
最初由 phoenix[ne] 发布
都没说明为什么会断在
00450A94 B9 01000000 mov ecx,1

开篇就直接分析了,为难我这种菜鸟了。。


是Delphi写的,你用DeDe看看按钮事件的处理代码就知道应该在哪里断了。
DeDe这末好的工具,不用多浪费
2006-9-11 10:11
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
只能顶下先,还没整明白
2006-9-12 19:24
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
爆破从哪破??
2006-10-2 10:07
0
游客
登录 | 注册 方可回帖
返回
//