再一個CrackMe的算法分析

算法比較簡單,算法也比較經典。

原作者的註冊算法好像有點問題,因爲0-9數字間的任意兩個數相加不會等於6D。

還是帖出來。

00450062    55                    push ebp
00450063    68 8D014500           push KeyGenMe.0045018D
00450068    64:FF30               push dword ptr fs:[eax]
0045006B    64:8920               mov dword ptr fs:[eax],esp
0045006E    8D55 F8               lea edx,dword ptr ss:[ebp-8]
00450071    8B45 FC               mov eax,dword ptr ss:[ebp-4]
00450074    8B80 00030000         mov eax,dword ptr ds:[eax+300]
0045007A    E8 D9F2FDFF           call KeyGenMe.0042F358              ; 讀取用戶名
0045007F    8B45 F8               mov eax,dword ptr ss:[ebp-8]
00450082    E8 4940FBFF           call KeyGenMe.004040D0              ; 讀取用戶名的長度
00450087    8945 F0               mov dword ptr ss:[ebp-10],eax
0045008A    837D F0 02            cmp dword ptr ss:[ebp-10],2         ; 如果用戶名的長度小於2,就死了
0045008E    0F8C DE000000         jl KeyGenMe.00450172
00450094    8D55 F4               lea edx,dword ptr ss:[ebp-C]
00450097    8B45 FC               mov eax,dword ptr ss:[ebp-4]
0045009A    8B80 08030000         mov eax,dword ptr ds:[eax+308]
004500A0    E8 B3F2FDFF           call KeyGenMe.0042F358              ; 讀取輸入的註冊碼
004500A5    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 存放eax中
004500A8    E8 2340FBFF           call KeyGenMe.004040D0              ; 讀取假註冊碼的長度
004500AD    8945 EC               mov dword ptr ss:[ebp-14],eax
004500B0    837D EC 0A            cmp dword ptr ss:[ebp-14],0A        ; 如果註冊碼的長度不等於10,死
004500B4    0F85 B8000000         jnz KeyGenMe.00450172               ; 跳轉
004500BA    8B45 EC               mov eax,dword ptr ss:[ebp-14]
004500BD    85C0                  test eax,eax                        ; 判斷eax是否爲空
004500BF    7E 34                 jle short KeyGenMe.004500F5         ; 大於則跳
004500C1    8945 E4               mov dword ptr ss:[ebp-1C],eax
004500C4    C745 E8 01000000      mov dword ptr ss:[ebp-18],1         ; 賦值1
004500CB    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 假註冊碼
004500CE    8B55 E8               mov edx,dword ptr ss:[ebp-18]
004500D1    807C10 FF 30          cmp byte ptr ds:[eax+edx-1],30      ; 如果小於30H,就死
004500D6    0F82 96000000         jb KeyGenMe.00450172
004500DC    8B45 F4               mov eax,dword ptr ss:[ebp-C]
004500DF    8B55 E8               mov edx,dword ptr ss:[ebp-18]
004500E2    807C10 FF 39          cmp byte ptr ds:[eax+edx-1],39      ; 如果大於39H,死
004500E7    0F87 85000000         ja KeyGenMe.00450172
004500ED    FF45 E8               inc dword ptr ss:[ebp-18]           ; 賦值+1
004500F0    FF4D E4               dec dword ptr ss:[ebp-1C]           ; 自減
004500F3  ^ 75 D6                 jnz short KeyGenMe.004500CB         ; 循環判斷註冊碼是否爲0-9之間
004500F5    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
004500F8    0FB600                movzx eax,byte ptr ds:[eax]         ; 讀取假註冊碼的第1位
004500FB    8B55 F4               mov edx,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
004500FE    0FB652 05             movzx edx,byte ptr ds:[edx+5]       ; 讀假註冊碼的第6位
00450102    03C2                  add eax,edx                         ; eax=eax+edx
00450104    83F8 6D               cmp eax,6D                          ; 如果eax不等於6D則跳(m),數字加數字不可能等於6D
00450107    75 69                 jnz short KeyGenMe.00450172
00450109    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
0045010C    0FB640 01             movzx eax,byte ptr ds:[eax+1]       ; 讀取假註冊碼的第2位
00450110    8B55 F4               mov edx,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
00450113    0FB652 06             movzx edx,byte ptr ds:[edx+6]       ; 讀取假註冊碼的第7位
00450117    03C2                  add eax,edx                         ; eax=eax+edx
00450119    83F8 67               cmp eax,67                          ; 如果eax不等於67H,死
0045011C    75 54                 jnz short KeyGenMe.00450172
0045011E    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
00450121    0FB640 02             movzx eax,byte ptr ds:[eax+2]       ; 假註冊碼的第3位
00450125    8B55 F4               mov edx,dword ptr ss:[ebp-C]        ; 假註冊碼
00450128    0FB652 07             movzx edx,byte ptr ds:[edx+7]       ; 假註冊碼的第8位
0045012C    03C2                  add eax,edx                         ; eax=eax+edx
0045012E    83F8 69               cmp eax,69                          ; 如果eax不等於69H,死
00450131    75 3F                 jnz short KeyGenMe.00450172
00450133    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
00450136    0FB640 03             movzx eax,byte ptr ds:[eax+3]       ; 讀取假註冊碼的第4位
0045013A    8B55 F4               mov edx,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
0045013D    0FB652 08             movzx edx,byte ptr ds:[edx+8]       ; 讀取假註冊碼的第9位
00450141    03C2                  add eax,edx                         ; eax=eax+edx
00450143    83F8 70               cmp eax,70                          ; 如果eax不等於70H,死
00450146    75 2A                 jnz short KeyGenMe.00450172
00450148    8B45 F4               mov eax,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
0045014B    0FB640 04             movzx eax,byte ptr ds:[eax+4]       ; 讀註冊碼的第5位
0045014F    8B55 F4               mov edx,dword ptr ss:[ebp-C]        ; 讀取假註冊碼
00450152    0FB652 09             movzx edx,byte ptr ds:[edx+9]       ; 讀取假註冊碼的第10位
00450156    F7EA                  imul edx                            ; eax=eax*edx
00450158    3D 8C0A0000           cmp eax,0A8C                        ; 如果eax不等於0A8CH,死
0045015D    75 13                 jnz short KeyGenMe.00450172         ; 跳轉的地方
0045015F    6A 40                 push 40                             ; 註冊成功的地方
00450161    68 98014500           push KeyGenMe.00450198              ; ASCII "Congratulations"
00450166    68 A8014500           push KeyGenMe.004501A8              ; ASCII "Good job,man!"
0045016B    6A 00                 push 0
0045016D    E8 2E63FBFF           call <jmp.&user32.MessageBoxA>      ; 消息提示框
00450172    33C0                  xor eax,eax                         ; eax清零
00450174    5A                    pop edx
00450175    59                    pop ecx
00450176    59                    pop ecx
00450177    64:8910               mov dword ptr fs:[eax],edx

 算法還不錯,卻有點問題。唯一的是爆破。

就分析到這。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章