xhn1002 发表于 2007-9-1 10:05:31

crackme 算法分析

【文章标题】: crackme 算法分析
【文章作者】: anan
【作者邮箱】: [email protected]
【下载地址】: ...没法上传附件......还是去 看雪crackme2007上 下吧 (序列号\4nail \一只老虎)
【作者声明】: 没有任何反调试的东西 适合我等新手啊
--------------------------------------------------------------------------------
【详细过程】

0048C6D4/.55            push    ebp
0048C6D5|.8BEC          mov   ebp, esp
0048C6D7|.83C4 84       add   esp, -7C
0048C6DA|.53            push    ebx
0048C6DB|.56            push    esi
0048C6DC|.57            push    edi
0048C6DD|.33C9          xor   ecx, ecx
0048C6DF|.894D 84       mov   dword ptr , ecx
0048C6E2|.894D FC       mov   dword ptr , ecx
0048C6E5|.894D F8       mov   dword ptr , ecx
0048C6E8|.894D F4       mov   dword ptr , ecx
0048C6EB|.894D F0       mov   dword ptr , ecx
0048C6EE|.894D EC       mov   dword ptr , ecx
0048C6F1|.8BD8          mov   ebx, eax
0048C6F3|.33C0          xor   eax, eax
0048C6F5|.55            push    ebp
0048C6F6|.68 67C84800   push    0048C867
0048C6FB|.64:FF30       push    dword ptr fs:
0048C6FE|.64:8920       mov   dword ptr fs:, esp
0048C701|.8D55 FC       lea   edx, dword ptr
0048C704|.8B83 04030000 mov   eax, dword ptr
0048C70A|.E8 E57EFAFF   call    004345F4                         ;取用户名N
0048C70F|.8D55 F8       lea   edx, dword ptr
0048C712|.8B83 08030000 mov   eax, dword ptr
0048C718|.E8 D77EFAFF   call    004345F4                         ;取注册码S
0048C71D|.8D45 F4       lea   eax, dword ptr
0048C720|.BA 80C84800   mov   edx, 0048C880                  ;字符串Z1:i am bin laden
0048C725|.E8 CA77F7FF   call    00403EF4
0048C72A|.8D45 F0       lea   eax, dword ptr
0048C72D|.BA 98C84800   mov   edx, 0048C898                  ;字符串Z2:i am yi zhi lao hu
0048C732|.E8 BD77F7FF   call    00403EF4
0048C737|.8B45 FC       mov   eax, dword ptr
0048C73A|.E8 DD79F7FF   call    0040411C                         ;取用户名N的位数
0048C73F|.83F8 0A       cmp   eax, 0A                        ;N的位数要>=10
0048C742|.0F8C FC000000 jl      0048C844
0048C748|.8B45 FC       mov   eax, dword ptr          ;N送EAX
0048C74B|.E8 CC79F7FF   call    0040411C                         ;取用户名N的位数
0048C750|.83F8 10       cmp   eax, 10                        ;N的位数要<=16
0048C753|.0F8F EB000000 jg      0048C844
0048C759|.8B45 F8       mov   eax, dword ptr          ;注册码S送EAX
0048C75C|.E8 BB79F7FF   call    0040411C
0048C761|.83F8 11       cmp   eax, 11                        ;S的位数>=17
0048C764|.0F8C DA000000 jl      0048C844
0048C76A|.8B45 F8       mov   eax, dword ptr
0048C76D|.E8 AA79F7FF   call    0040411C
0048C772|.83F8 16       cmp   eax, 16                        ;S的位数<=22
0048C775|.0F8F C9000000 jg      0048C844
0048C77B|.8D45 FC       lea   eax, dword ptr          ;EAX指向N
0048C77E|.8B55 F4       mov   edx, dword ptr
0048C781|.E8 9E79F7FF   call    00404124                         ;N与Z1联接=N1
0048C786|.BB 64000000   mov   ebx, 64
0048C78B|.8D45 88       lea   eax, dword ptr
0048C78E|>C600 2E       /mov   byte ptr , 2E
0048C791|.40            |inc   eax
0048C792|.4B            |dec   ebx
0048C793|.^ 75 F9         \jnz   short 0048C78E
0048C795|.8B45 FC       mov   eax, dword ptr          ;N1送EAX
0048C798|.E8 7F79F7FF   call    0040411C                         ;N1的位数(控制外循环)
0048C79D|.8BF8          mov   edi, eax
0048C79F|.85FF          test    edi, edi
0048C7A1|.7E 47         jle   short 0048C7EA
0048C7A3|.BB 01000000   mov   ebx, 1
0048C7A8|>8B45 F0       /mov   eax, dword ptr          ;Z2送EAX(Z2的位数控制内循环)
0048C7AB|.E8 6C79F7FF   |call    0040411C
0048C7B0|.8BF0          |mov   esi, eax
0048C7B2|.85F6          |test    esi, esi
0048C7B4|.7E 30         |jle   short 0048C7E6
0048C7B6|.B9 01000000   |mov   ecx, 1
0048C7BB|>8B45 FC       |/mov   eax, dword ptr          ;N1送EAX
0048C7BE|.0FB64418 FF   ||movzx   eax, byte ptr       ;N1按字节传送给EAX
0048C7C3|.8B55 F8       ||mov   edx, dword ptr          ;S送EDX
0048C7C6|.0FB6540A FF   ||movzx   edx, byte ptr       ;S按字节送EDX
0048C7CB|.F7EA          ||imul    edx                            ;N1*S
0048C7CD|.51            ||push    ecx
0048C7CE|.B9 1A000000   ||mov   ecx, 1A
0048C7D3|.33D2          ||xor   edx, edx
0048C7D5|.F7F1          ||div   ecx                            ;/1A
0048C7D7|.59            ||pop   ecx
0048C7D8|.83C2 41       ||add   edx, 41                        ;余数+41H
0048C7DB|.8D0419      ||lea   eax, dword ptr          (算出的数(0--1a)+41H实际上就是(大写字母的ASC范围)
0048C7DE|.885405 87   ||mov   byte ptr , dl
0048C7E2|.41            ||inc   ecx
0048C7E3|.4E            ||dec   esi
0048C7E4|.^ 75 D5         |\jnz   short 0048C7BB               注意内循环存放数据有覆盖的过程
0048C7E6|>43            |inc   ebx
0048C7E7|.4F            |dec   edi
0048C7E8|.^ 75 BE         \jnz   short 0048C7A8               得到新字符串Z3
0048C7EA|>8D45 EC       lea   eax, dword ptr
0048C7ED|.E8 6A76F7FF   call    00403E5C
0048C7F2|.8B45 F8       mov   eax, dword ptr
0048C7F5|.E8 2279F7FF   call    0040411C
0048C7FA|.8BF8          mov   edi, eax
0048C7FC|.85FF          test    edi, edi
0048C7FE|.7E 1F         jle   short 0048C81F
0048C800|.8D5D 8E       lea   ebx, dword ptr
0048C803|>8D45 84       /lea   eax, dword ptr
0048C806|.8A13          |mov   dl, byte ptr
0048C808|.E8 3778F7FF   |call    00404044
0048C80D|.8B55 84       |mov   edx, dword ptr
0048C810|.8D45 EC       |lea   eax, dword ptr
0048C813|.8B4D EC       |mov   ecx, dword ptr
0048C816|.E8 4D79F7FF   |call    00404168
0048C81B|.43            |inc   ebx
0048C81C|.4F            |dec   edi
0048C81D|.^ 75 E4         \jnz   short 0048C803                ;Z3的第6位开始取与注册码相同位数
0048C81F|>8B45 EC       mov   eax, dword ptr          逆序存放
0048C822|.8B55 F8       mov   edx, dword ptr           ;S送EDX
0048C825|.E8 3E7AF7FF   call    00404268                        比较CALL
0048C82A|.75 18         jnz   short 0048C844
0048C82C|.6A 40         push    40
0048C82E|.B9 ACC84800   mov   ecx, 0048C8AC                  ;恭喜你
0048C833|.BA B4C84800   mov   edx, 0048C8B4                  ;注册成功!请联系我!qq:609841314
0048C838|.A1 D0EB4800   mov   eax, dword ptr
0048C83D|.8B00          mov   eax, dword ptr
0048C83F|.E8 F478FCFF   call    00454138
0048C844|>33C0          xor   eax, eax
0048C846|.5A            pop   edx
0048C847|.59            pop   ecx
0048C848|.59            pop   ecx
0048C849|.64:8910       mov   dword ptr fs:, edx
0048C84C|.68 6EC84800   push    0048C86E
0048C851|>8D45 84       lea   eax, dword ptr
0048C854|.E8 0376F7FF   call    00403E5C
0048C859|.8D45 EC       lea   eax, dword ptr
0048C85C|.BA 05000000   mov   edx, 5
0048C861|.E8 1A76F7FF   call    00403E80
0048C866\.C3            retn
========================================================================
算法比较简单 注意点 :1个是 数据存放有个覆盖过程
还有一个就是 N1*S%0x1A+0x41=S(I由注册码的位数决定 写注册机时可以自己决定
但不能随便决定 如 10位用户名就不能对应18位注册码,为什么会这样 自己分析吧)
可以得到S ,知道S以后就没什么难的了(就这个S我想了半天才弄明白。。。。。)
注册机 10位用户名对应19位注册码
#include "stdio.h"
#include "string.h"
main()
{ char name,z1[]="i am bin laden",z2[]="i am yi zhi lao hu",string,s;
    int i=0,j,k;
   
    printf("请输入用户名:");
    loop:scanf("%s",name);
    while(name!='\0')i++;
    if(i<10||i>16)
    {printf("请重新输入用户名:");
    goto loop;}
    strcpy(string,name);
    strcat(string,z1);
    for(i=65;i<=90;i++)
    {if((string*i)%0x1a+0x41==i)
    k=i;}
    for(i=5;i<=23;i++)
    s=(string*k)%0x1a+0x41;
    for(i=23;i>=5;i--)
          printf("%c",s);

--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年09月01日 上午 09:42:22

bhcjl 发表于 2007-9-3 14:57:23

发错地方了吧???
页: [1]
查看完整版本: crackme 算法分析