首页
社区
课程
招聘
[分享]各类算法学习(windrand各类应用密码学CrackMe的破文)
发表于: 2007-11-9 13:02 6781

[分享]各类算法学习(windrand各类应用密码学CrackMe的破文)

2007-11-9 13:02
6781

为了好好的学习一下加密中的各种类型的算法,正好windrand贴出了各类应用密码学的CrackMe(下载地址:http://bbs.pediy.com/showthread.php?t=47488)。本来很早就想系统学习一下了,但由于各种原因,一直没有时间,现在总算有时间了,可以慢慢研究了,希望可以都能通过自己全部了解和掌握。再次感谢windrand无私的提供了练习的好机会!

Hash类CrackMe:
CRC32算法 ==>CRC32CrackMe


[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2023-12-24 00:02
伟叔叔
为你点赞~
2023-9-23 00:03
PLEBFE
为你点赞~
2023-7-1 00:11
QinBeast
为你点赞~
2023-6-26 05:36
shinratensei
为你点赞~
2023-6-2 02:32
心游尘世外
为你点赞~
2023-5-27 04:14
飘零丶
为你点赞~
2023-5-18 04:18
最新回复 (6)
雪    币: 246
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
CRC32算法 ==>CRC32CrackMe:

CRC(CyclicRedundancyCheck,直译:循环冗余校验)技术是一项很成熟的技术,在众多领域有广泛的应用,在数据存储和通信传输应用中处处都可以看到它的身影。最常用的CRC校验形式有CRC-16,CRC-32两种形式,采用CRC-16校验,可以保证在1014 位码元中只含有一位未被检测出的错误,采用CRC-32校验的出错概率比CRC-16还低105 倍。CRC的主要特点就是:检错能力极强,开销很小,易于实现。从性能和开销上综合考虑,其远远优于奇偶校验及算术和校验等方式。因此,很多软件在加密保护时都将CRC技术应用其中。

--------------------------------------------------------------------------------

【注册验证部分代码】

00401282   .  68 00010000   PUSH 100                                   ; /Count = 100 (256.)
00401287   .  51            PUSH ECX                                   ; |Buffer
00401288   .  68 E8030000   PUSH 3E8                                   ; |ControlID = 3E8 (1000.)
0040128D   .  56            PUSH ESI                                   ; |hWnd
0040128E   .  FFD3          CALL EBX                                   ; \GetDlgItemTextA
00401290   .  8DBC24 0C0100>LEA EDI,DWORD PTR SS:[ESP+10C]             ;  用户名地址送EDI(根据字符串参考在这里下断)00401297   .  83C9 FF       OR ECX,FFFFFFFF
0040129A   .  33C0          XOR EAX,EAX
0040129C   .  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040129E   .  F7D1          NOT ECX
004012A0   .  49            DEC ECX
004012A1   .  83F9 01       CMP ECX,1                                  ;  用户名位数与1比较
004012A4   .  73 1F         JNB SHORT CRC32Cra.004012C5                ;  大于等于1则跳
004012A6   .  6A 40         PUSH 40                                    ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004012A8   .  68 8C604000   PUSH CRC32Cra.0040608C                     ; |注册提示
004012AD   .  68 74604000   PUSH CRC32Cra.00406074                     ; |用户名不能为空请输入!
004012B2   .  56            PUSH ESI                                   ; |hOwner
004012B3   .  FF15 A8504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>]  ; \MessageBoxA
004012B9   .  5F            POP EDI
004012BA   .  5E            POP ESI
004012BB   .  33C0          XOR EAX,EAX
004012BD   .  5B            POP EBX
004012BE   .  81C4 00030000 ADD ESP,300
004012C4   .  C3            RET
004012C5   >  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
004012C9   .  68 00010000   PUSH 100
004012CE   .  52            PUSH EDX
004012CF   .  68 07040000   PUSH 407
004012D4   .  56            PUSH ESI
004012D5   .  FFD3          CALL EBX
004012D7   .  8D7C24 0C     LEA EDI,DWORD PTR SS:[ESP+C]               ;  试验码地址送EDI
004012DB   .  83C9 FF       OR ECX,FFFFFFFF
004012DE   .  33C0          XOR EAX,EAX
004012E0   .  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004012E2   .  F7D1          NOT ECX
004012E4   .  49            DEC ECX
004012E5   .  83F9 01       CMP ECX,1                                  ;  试验码位数与1比较
004012E8   .  73 1F         JNB SHORT CRC32Cra.00401309                ;  大于等于1则跳
004012EA   .  6A 40         PUSH 40                                    ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004012EC   .  68 8C604000   PUSH CRC32Cra.0040608C                     ; |注册提示
004012F1   .  68 5C604000   PUSH CRC32Cra.0040605C                     ; |注册码不能为空请输入!
004012F6   .  56            PUSH ESI                                   ; |hOwner
004012F7   .  FF15 A8504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>]  ; \MessageBoxA
004012FD   .  5F            POP EDI
004012FE   .  5E            POP ESI
004012FF   .  33C0          XOR EAX,EAX
00401301   .  5B            POP EBX
00401302   .  81C4 00030000 ADD ESP,300
00401308   .  C3            RET
00401309   >  8D8424 0C0200>LEA EAX,DWORD PTR SS:[ESP+20C]
00401310   .  8D8C24 0C0100>LEA ECX,DWORD PTR SS:[ESP+10C]             ;  用户名地址
00401317   .  50            PUSH EAX
00401318   .  51            PUSH ECX
00401319   .  E8 F2FDFFFF   CALL CRC32Cra.00401110                     ;  算法Call,F7跟进去
0040131E   .  8D9424 140200>LEA EDX,DWORD PTR SS:[ESP+214]             ;  算法Call计算得到的值
00401325   .  8D4424 14     LEA EAX,DWORD PTR SS:[ESP+14]              ;  试验码
00401329   .  52            PUSH EDX                                   ;  注册码地址入栈
0040132A   .  50            PUSH EAX                                   ;  试验码地址入栈
0040132B   .  E8 D0FCFFFF   CALL CRC32Cra.00401000                     ;  比较真假注册码Call,F7跟进00401330   .  83C4 10       ADD ESP,10
00401333   .  83F8 01       CMP EAX,1                                  ;  EAX=0与0比较
00401336   .  6A 40         PUSH 40                                    ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401338   .  68 8C604000   PUSH CRC32Cra.0040608C                     ; |注册提示
0040133D   .  75 18         JNZ SHORT CRC32Cra.00401357                ; |不相等则跳向死亡(关健跳)
0040133F   .  68 48604000   PUSH CRC32Cra.00406048                     ; |恭喜你,注册码正确!
00401344   .  56            PUSH ESI                                   ; |hOwner
00401345   .  FF15 A8504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>]  ; \MessageBoxA
0040134B   .  5F            POP EDI
0040134C   .  5E            POP ESI
0040134D   .  33C0          XOR EAX,EAX
0040134F   .  5B            POP EBX
00401350   .  81C4 00030000 ADD ESP,300
00401356   .  C3            RET
00401357   >  68 30604000   PUSH CRC32Cra.00406030                     ; |注册码错误,继续加油!
0040135C   .  56            PUSH ESI                                   ; |hOwner
0040135D   .  FF15 A8504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>]  ; \MessageBoxA
00401363   .  5F            POP EDI
00401364   .  5E            POP ESI
00401365   .  33C0          XOR EAX,EAX
00401367   .  5B            POP EBX
00401368   .  81C4 00030000 ADD ESP,300
0040136E   .  C3            RET

【算法Call代码】
00401110  /$  83EC 0C       SUB ESP,0C                                 ;  来到这里
00401113  |.  56            PUSH ESI
00401114  |.  57            PUSH EDI
00401115  |.  E8 B6FFFFFF   CALL CRC32Cra.004010D0                     ;  动态生成码表Call,F7跟进0040111A  |.  8B7424 18     MOV ESI,DWORD PTR SS:[ESP+18]              ;  取用户名地址送ESI
0040111E  |.  83C9 FF       OR ECX,FFFFFFFF
00401121  |.  8BFE          MOV EDI,ESI
00401123  |.  33C0          XOR EAX,EAX
00401125  |.  83CA FF       OR EDX,FFFFFFFF
00401128  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040112A  |.  F7D1          NOT ECX
0040112C  |.  49            DEC ECX
0040112D  |.  85C9          TEST ECX,ECX                               ;  测试用户名位数
0040112F  |.  7E 1F         JLE SHORT CRC32Cra.00401150                ;  为0则跳
00401131  |.  53            PUSH EBX
00401132  |>  8BC2          /MOV EAX,EDX                               ;  以下循环将进行一系列运算后根据EAX值取上面计算出码表中数据
00401134  |.  33DB          |XOR EBX,EBX
00401136  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]                  ;  依次取用户名
00401138  |.  25 FF000000   |AND EAX,0FF
0040113D  |.  33C3          |XOR EAX,EBX
0040113F  |.  C1EA 08       |SHR EDX,8
00401142  |.  8B0485 208540>|MOV EAX,DWORD PTR DS:[EAX*4+408520]       ;  根据EAX的值取动态码表数组中的数据
00401149  |.  33D0          |XOR EDX,EAX                               ;  EDX最后得到一个数值
0040114B  |.  46            |INC ESI
0040114C  |.  49            |DEC ECX
0040114D  |.^ 75 E3         \JNZ SHORT CRC32Cra.00401132
0040114F  |.  5B            POP EBX
00401150  |>  33C9          XOR ECX,ECX
00401152  |.  8D4424 08     LEA EAX,DWORD PTR SS:[ESP+8]
00401156  |.  894C24 09     MOV DWORD PTR SS:[ESP+9],ECX
0040115A  |.  6A 10         PUSH 10
0040115C  |.  F7D2          NOT EDX                                    ;  这里对EDX取反

0040115E  |.  894C24 11     MOV DWORD PTR SS:[ESP+11],ECX
00401162  |.  50            PUSH EAX
00401163  |.  52            PUSH EDX
00401164  |.  C64424 14 00  MOV BYTE PTR SS:[ESP+14],0
00401169  |.  884C24 1D     MOV BYTE PTR SS:[ESP+1D],CL
0040116D  |.  E8 24380000   CALL CRC32Cra.00404996                    
00401172  |.  8D7C24 14     LEA EDI,DWORD PTR SS:[ESP+14]
00401176  |.  83C9 FF       OR ECX,FFFFFFFF
00401179  |.  33C0          XOR EAX,EAX
0040117B  |.  83C4 0C       ADD ESP,0C
0040117E  |.  33F6          XOR ESI,ESI
00401180  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401182  |.  F7D1          NOT ECX
00401184  |.  49            DEC ECX                                    ;  得到注册码个数
00401185  |.  74 25         JE SHORT CRC32Cra.004011AC                 ;  等于0则跳
00401187  |>  0FBE4C34 08   /MOVSX ECX,BYTE PTR SS:[ESP+ESI+8]
0040118C  |.  51            |PUSH ECX
0040118D  |.  E8 4E020000   |CALL CRC32Cra.004013E0
00401192  |.  884434 0C     |MOV BYTE PTR SS:[ESP+ESI+C],AL
00401196  |.  83C4 04       |ADD ESP,4
00401199  |.  8D7C24 08     |LEA EDI,DWORD PTR SS:[ESP+8]
0040119D  |.  83C9 FF       |OR ECX,FFFFFFFF
004011A0  |.  33C0          |XOR EAX,EAX
004011A2  |.  46            |INC ESI
004011A3  |.  F2:AE         |REPNE SCAS BYTE PTR ES:[EDI]
004011A5  |.  F7D1          |NOT ECX
004011A7  |.  49            |DEC ECX
004011A8  |.  3BF1          |CMP ESI,ECX
004011AA  |.^ 72 DB         \JB SHORT CRC32Cra.00401187                ;  以上循环用于将注册码中小写字母转换为大写字母
004011AC  |>  8B4424 1C     MOV EAX,DWORD PTR SS:[ESP+1C]
004011B0  |.  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]
004011B4  |.  52            PUSH EDX                                   ; /String2
004011B5  |.  50            PUSH EAX                                   ; |String1
004011B6  |.  FF15 00504000 CALL DWORD PTR DS:[<&KERNEL32.lstrcpyA>]   ; \lstrcpyA
004011BC  |.  5F            POP EDI
004011BD  |.  5E            POP ESI
004011BE  |.  83C4 0C       ADD ESP,0C
004011C1  \.  C3            RET                                        ;  这里结束

【动态生成码表Call】

004010D0  /$  56            PUSH ESI                                   ;  这里开始
004010D1  |.  33D2          XOR EDX,EDX
004010D3  |.  B9 20854000   MOV ECX,CRC32Cra.00408520                  ;  指向00408520内存地址(相当于指向一定义数组)
004010D8  |>  8BC2          /MOV EAX,EDX
004010DA  |.  BE 08000000   |MOV ESI,8                                 ;  定义小循环次数
004010DF  |>  A8 01         |/TEST AL,1                                ;  测试AL是否为奇数
004010E1  |.  74 09         ||JE SHORT CRC32Cra.004010EC               ;  不是则跳
004010E3  |.  D1E8          ||SHR EAX,1                                ;  右移1位
004010E5  |.  35 2083B8ED   ||XOR EAX,EDB88320                         ;  与固定值EDB88320异或
004010EA  |.  EB 02         ||JMP SHORT CRC32Cra.004010EE
004010EC  |>  D1E8          ||SHR EAX,1                                ;  右移1位
004010EE  |>  4E            ||DEC ESI
004010EF  |.^ 75 EE         |\JNZ SHORT CRC32Cra.004010DF
004010F1  |.  8901          |MOV DWORD PTR DS:[ECX],EAX                ;  将EAX值送入指定内存(数组)中
004010F3  |.  83C1 04       |ADD ECX,4                                 ;  指向下一个数组单元地址
004010F6  |.  42            |INC EDX                                   ;  EDX加1
004010F7  |.  81F9 20894000 |CMP ECX,CRC32Cra.00408920                 ;  与数组末地址比较(根据数组起始地址推算,该大循环次数为256次)
004010FD  |.^ 7C D9         \JL SHORT CRC32Cra.004010D8                ;  小于则跳
004010FF  |.  5E            POP ESI
00401100  \.  C3            RET                                        ;  这里结束

【比较真假注册码Call】
00401000  /$  81EC 00020000 SUB ESP,200                                ;  这里开始
00401006  |.  56            PUSH ESI
00401007  |.  57            PUSH EDI
00401008  |.  B9 3F000000   MOV ECX,3F
0040100D  |.  33C0          XOR EAX,EAX
0040100F  |.  8D7C24 09     LEA EDI,DWORD PTR SS:[ESP+9]
00401013  |.  C64424 08 00  MOV BYTE PTR SS:[ESP+8],0
00401018  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
0040101A  |.  66:AB         STOS WORD PTR ES:[EDI]
0040101C  |.  AA            STOS BYTE PTR ES:[EDI]
0040101D  |.  B9 3F000000   MOV ECX,3F
00401022  |.  33C0          XOR EAX,EAX
00401024  |.  8DBC24 090100>LEA EDI,DWORD PTR SS:[ESP+109]
0040102B  |.  C68424 080100>MOV BYTE PTR SS:[ESP+108],0
00401033  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00401035  |.  66:AB         STOS WORD PTR ES:[EDI]
00401037  |.  8B35 00504000 MOV ESI,DWORD PTR DS:[<&KERNEL32.lstrcpyA>>;  kernel32.lstrcpyA
0040103D  |.  8D4C24 08     LEA ECX,DWORD PTR SS:[ESP+8]
00401041  |.  AA            STOS BYTE PTR ES:[EDI]
00401042  |.  8B8424 0C0200>MOV EAX,DWORD PTR SS:[ESP+20C]
00401049  |.  50            PUSH EAX                                   ; /String2
0040104A  |.  51            PUSH ECX                                   ; |String1
0040104B  |.  FFD6          CALL ESI                                   ; \lstrcpyA
0040104D  |.  8B9424 100200>MOV EDX,DWORD PTR SS:[ESP+210]
00401054  |.  8D8424 080100>LEA EAX,DWORD PTR SS:[ESP+108]
0040105B  |.  52            PUSH EDX                                   ; /String2
0040105C  |.  50            PUSH EAX                                   ; |String1
0040105D  |.  FFD6          CALL ESI                                   ; \lstrcpyA
0040105F  |.  8DBC24 080100>LEA EDI,DWORD PTR SS:[ESP+108]
00401066  |.  83C9 FF       OR ECX,FFFFFFFF
00401069  |.  33C0          XOR EAX,EAX
0040106B  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040106D  |.  F7D1          NOT ECX
0040106F  |.  49            DEC ECX                                    ;  注册码位数(8位)
00401070  |.  8D7C24 08     LEA EDI,DWORD PTR SS:[ESP+8]
00401074  |.  8BD1          MOV EDX,ECX                                ;  注册码位数送EDX(EDX=8)
00401076  |.  83C9 FF       OR ECX,FFFFFFFF
00401079  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040107B  |.  F7D1          NOT ECX
0040107D  |.  49            DEC ECX
0040107E  |.  3BCA          CMP ECX,EDX                                ;  试验码位数与注册码位数进行比较
00401080  |.  75 40         JNZ SHORT CRC32Cra.004010C2                ;  不相等则跳
00401082  |.  8D7C24 08     LEA EDI,DWORD PTR SS:[ESP+8]
00401086  |.  83C9 FF       OR ECX,FFFFFFFF
00401089  |.  33D2          XOR EDX,EDX
0040108B  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040108D  |.  F7D1          NOT ECX
0040108F  |.  49            DEC ECX
00401090  |.  74 22         JE SHORT CRC32Cra.004010B4
00401092  |>  8A4414 08     /MOV AL,BYTE PTR SS:[ESP+EDX+8]
00401096  |.  8A8C14 080100>|MOV CL,BYTE PTR SS:[ESP+EDX+108]
0040109D  |.  3AC1          |CMP AL,CL
0040109F  |.  75 21         |JNZ SHORT CRC32Cra.004010C2
004010A1  |.  8D7C24 08     |LEA EDI,DWORD PTR SS:[ESP+8]
004010A5  |.  83C9 FF       |OR ECX,FFFFFFFF
004010A8  |.  33C0          |XOR EAX,EAX
004010AA  |.  42            |INC EDX
004010AB  |.  F2:AE         |REPNE SCAS BYTE PTR ES:[EDI]
004010AD  |.  F7D1          |NOT ECX
004010AF  |.  49            |DEC ECX
004010B0  |.  3BD1          |CMP EDX,ECX
004010B2  |.^ 72 DE         \JB SHORT CRC32Cra.00401092                ;  以上循环用于试验码与注册码比较
004010B4  |>  5F            POP EDI
004010B5  |.  B8 01000000   MOV EAX,1
004010BA  |.  5E            POP ESI
004010BB  |.  81C4 00020000 ADD ESP,200
004010C1  |.  C3            RET
004010C2  |>  5F            POP EDI
004010C3  |.  33C0          XOR EAX,EAX
004010C5  |.  5E            POP ESI
004010C6  |.  81C4 00020000 ADD ESP,200
004010CC  \.  C3            RET                                        ;  这里结束

--------------------------------------------------------------------------------

C语言注册机如下:(注:该注册机得出的注册码值中字母都是小写的,在实际中应全部为大写,数字则保持不变)
以下C语言代码在VC6.0编译器下调试通过

#include "stdio.h"
#include "string.h"

//自定义函数//

//向table写入码表值
void fun2(unsigned long int *bp1);

//根据用户名计算具体数值后查码表得到注册码
unsigned long int fun1(char nam[30],unsigned long int *bp1);

//主函数
void main()
{

        unsigned long int a;
        char name[30];//用户名
    unsigned long int table[256]={0};//动态生成的数组码表
        unsigned long int *p;
        p=table;//指针指向动态码表table
        printf("请输入用户名: ");
        gets(name);
        fun2(p);//调用fun2函数向table数组码表写入数据
        a=fun1(name,p);//调用fun1函数得到注册码
    printf("\n");
        printf("你的注册码是: ");

    printf("%x",a);
        printf("\n");
}

//调用自定义函数

//向table写入码表值:该函数对应动态生成码表Call
void fun2(unsigned long int *bp1)
{
        unsigned long int a,c,d,si;
        unsigned long int *p;
        p=bp1;
       
        d=0;

        for(c=0;c<256;c++)
       
        {
                a=d;
                si=0x8;
                for(si=0x8;si!=0;si--)
                {
                        if(a%2==1)
                        {
                                a=a>>0x1;
                                a=a^0xedb88320;
                        }
                        else
                        {
                                a=a>>0x1;       
                        }
                }
                *(p+c)=a;
                d=d+1;
        }
}

//根据用户名计算具体数值后查上述码表得到注册码:该函数对应算法Call代码中蓝色小循环代码
unsigned long int fun1(char nam[30],unsigned long int *bp1)

{
        unsigned long int a,b,d;
        int m,i;
        unsigned long int *p;
        p=bp1;
        m=strlen(nam);
        d=0xffffffff;
        for(i=0;i<m;i++)
        {
            a=d;
            b=0;
            b=nam[i];
            a=a&0xff;
            a=a^b;
            d=d>>0x8;
            a=*(p+a);
            d=d^a;
        }
        d=~d;
        return d;
}

给出一个注册码:
用户名:tgfy
注册码:92FF30CB
2007-11-9 13:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习
2007-11-9 18:49
0
雪    币: 56003
活跃值: (21415)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
文章很详细,天高飞扬你可以一个CrackMe开一个新的主题帖。
2007-11-9 19:00
0
雪    币: 246
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
谢谢坛主支持,我知道了
2007-11-12 23:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文章,又学到了一点东西...
2007-11-14 15:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文章!慢慢的消受!
2007-11-15 08:08
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册