首页
社区
课程
招聘
6
[原创]算法逆向练习系列
发表于: 2011-12-16 22:39 25149

[原创]算法逆向练习系列

2011-12-16 22:39
25149

大家喜欢玩的拿去练习吧,这是我逆的。Crackme原版看附件,这个Crackme没有全部逆完,做到了算法部分一模一样。
#define ROL(x,t) (x<<t)|(x>>32-t)
#define ROR(x,t) (x>>t)|(x<<32-t)
/**********************************************************************************
004010D6  |.  B9 10000000   MOV ECX,10
004010DB  |.  2BC8          SUB ECX,EAX                ;  减去用户名长度
004010DD  |.  BE 60214000   MOV ESI,00402160           ;  user首地址
004010E2  |.  8BFE          MOV EDI,ESI                ;  用户名首地址
004010E4  |.  03F8          ADD EDI,EAX                ;  得到user的结束位置
004010E6  |.  FC            CLD
004010E7  |.  F3:A4         REP MOVSB                  ;  用user自己输入的补足16位
004010E9  |.  33C9          XOR ECX,ECX
004010EB  |.  BE 71214000   MOV ESI,00402171           ;  Password首地址
004010F0  |>  41            /INC ECX                   ;  长度
004010F1  |.  AC            |LODSB                     ;  放入EAX
004010F2  |.  0AC0          |OR AL,AL                  ;  判断是否结束
004010F4  |.  74 0A         |JE SHORT 00401100
004010F6  |.  3C 7E         |CMP AL,7E                 ;  判断是否大于0x7E
004010F8  |.  7F 06         |JG SHORT 00401100
004010FA  |.  3C 30         |CMP AL,30                 ;  判断是否小于0x30
004010FC  |.  72 02         |JB SHORT 00401100
004010FE  |.^ EB F0         \JMP SHORT 004010F0        ;  继续循环
00401100  |>  83F9 11       CMP ECX,11                 ;  比较Password长度
*********************************************************************************/
int CheckLength(unsigned char *user,unsigned char *password)
{
        int i=0;
        for(;i<10;i++)
        {
                user[i+6]=user[i];
        }
        i=0;
        while(*password)
        {
                if(*password==0||*password>0x7E||*password<0x30)
                        break;
                password++;
                i++;
        }
        if(i!=17)
        {
                return 0;
        }
        return i;
}
/**********************************************************************************
004011F1  /$  A1 60214000   MOV EAX,DWORD PTR DS:[402160]            ;  user的0-4位
004011F6  |.  8B1D 64214000 MOV EBX,DWORD PTR DS:[402164]            ;  user的5-8位
004011FC  |.  3305 71214000 XOR EAX,DWORD PTR DS:[402171]            ;  Password的0-4位
00401202  |.  331D 75214000 XOR EBX,DWORD PTR DS:[402175]            ;  Password的5-8位
00401208  |.  25 0F1F3F7F   AND EAX,7F3F1F0F                         ;  按位与
0040120D  |.  81E3 00010307 AND EBX,7030100                          ;  按位与
**********************************************************************************/
#define  CalcleA(x,y) (*(DWORD*)x^*(DWORD*)y)&0x7F3F1F0F
#define  CalcleB(a,b) (*(DWORD*)(a+4)^*(DWORD*)(b+4))&0x7030100
/**********************************************************************************
00401229  |.  8BD6          |MOV EDX,ESI
0040122B  |.  C0EE 07       |SHR DH,7
0040122E  |.  66:C1E2 07    |SHL DX,7
00401232  |.  C1EA 08       |SHR EDX,8
00401235  |.  C0EE 07       |SHR DH,7
00401238  |.  66:C1E2 07    |SHL DX,7
0040123C  |.  C1EA 08       |SHR EDX,8
**********************************************************************************/
DWORD Cycle(DWORD TSize)
{
        DWORD DSize=TSize;
        WORD  WSize=0;
        BYTE  BSize=0;
        WSize=DSize&0xffff;
        BSize=((unsigned)WSize>>8);
        BSize>>=7;
        WSize=(BSize<<8)|((unsigned)WSize&0xff);
        WSize<<=7;
        DSize&=0xffff0000;
        DSize|=WSize;
        DSize>>=8;
        WSize=DSize&0xffff;
        BSize=((unsigned)WSize>>8);
        BSize>>=7;
        WSize=(BSize<<8)|((unsigned)WSize&0xff);
        WSize<<=7;
        DSize&=0xffff0000;
        DSize|=WSize;
        DSize>>=8;
        return DSize;
}
/**********************************************************************************
0040123F  |.  C0EE 07       |SHR DH,7
00401242  |.  66:D1EA       |SHR DX,1
00401245  |.  8BF2          |MOV ESI,EDX
**********************************************************************************/
DWORD CycleLow(DWORD Num)
{
        WORD  WSize=Num&0xffff;
        BYTE  BSize=((unsigned)WSize>>8);
        BSize>>=7;
        WSize=(BSize<<8)|((unsigned)WSize&0xff);
        WSize>>=1;
        Num&=0xffff0000;
        Num|=WSize;
        return Num;
}
/**********************************************************************************
0040125D  |.  C0EE 07       |SHR DH,7
00401260  |.  66:C1EA 05    |SHR DX,5
00401264  |.  8BFA          |MOV EDI,EDX
**********************************************************************************/
DWORD CycleLowA(DWORD Num)
{
        WORD  WSize=Num&0xffff;
        BYTE  BSize=((unsigned)WSize>>8);
        BSize>>=7;
        WSize=(BSize<<8)|((unsigned)WSize&0xff);
        WSize>>=5;
        Num&=0xffff0000;
        Num|=WSize;
        return Num;
}
/*******************************************************************
004011F1  /$  A1 60214000   MOV EAX,DWORD PTR DS:[402160]            ;  user的0-4位
004011F6  |.  8B1D 64214000 MOV EBX,DWORD PTR DS:[402164]            ;  user的5-8位
004011FC  |.  3305 71214000 XOR EAX,DWORD PTR DS:[402171]            ;  Password的0-4位
00401202  |.  331D 75214000 XOR EBX,DWORD PTR DS:[402175]            ;  Password的5-8位
00401208  |.  25 0F1F3F7F   AND EAX,7F3F1F0F                         ;  按位与
0040120D  |.  81E3 00010307 AND EBX,7030100                          ;  按位与
00401213  |.  33C9          XOR ECX,ECX
00401215  |>  8BF0          /MOV ESI,EAX
00401217  |.  8BFB          |MOV EDI,EBX
00401219  |.  D3E6          |SHL ESI,CL
0040121B  |.  D3E7          |SHL EDI,CL
0040121D  |.  81E6 80808080 |AND ESI,80808080
00401223  |.  81E7 80808080 |AND EDI,80808080
00401229  |.  8BD6          |MOV EDX,ESI
0040122B  |.  C0EE 07       |SHR DH,7
0040122E  |.  66:C1E2 07    |SHL DX,7
00401232  |.  C1EA 08       |SHR EDX,8
00401235  |.  C0EE 07       |SHR DH,7
00401238  |.  66:C1E2 07    |SHL DX,7
0040123C  |.  C1EA 08       |SHR EDX,8
0040123F  |.  C0EE 07       |SHR DH,7
00401242  |.  66:D1EA       |SHR DX,1
00401245  |.  8BF2          |MOV ESI,EDX
00401247  |.  8BD7          |MOV EDX,EDI
00401249  |.  C0EE 07       |SHR DH,7
0040124C  |.  66:C1E2 07    |SHL DX,7
00401250  |.  C1EA 08       |SHR EDX,8
00401253  |.  C0EE 07       |SHR DH,7
00401256  |.  66:C1E2 07    |SHL DX,7
0040125A  |.  C1EA 08       |SHR EDX,8
0040125D  |.  C0EE 07       |SHR DH,7
00401260  |.  66:C1EA 05    |SHR DX,5
00401264  |.  8BFA          |MOV EDI,EDX
00401266  |.  33FE          |XOR EDI,ESI
00401268  |.  8BD7          |MOV EDX,EDI
0040126A  |.  81E2 FF000000 |AND EDX,0FF
00401270  |.  51            |PUSH ECX
00401271  |.  52            |PUSH EDX
00401272  |.  BA 08000000   |MOV EDX,8
00401277  |.  91            |XCHG EAX,ECX
00401278  |.  83F8 03       |CMP EAX,3
0040127B  |.  7F 0F         |JG SHORT 0040128C
0040127D  |.  F6E2          |MUL DL
0040127F  |.  5A            |POP EDX
00401280  |.  83C0 08       |ADD EAX,8
00401283  |.  91            |XCHG EAX,ECX
00401284  |.  D3C0          |ROL EAX,CL
00401286  |.  33C2          |XOR EAX,EDX
00401288  |.  D3C8          |ROR EAX,CL
0040128A  |.  EB 0D         |JMP SHORT 00401299
0040128C  |>  83E8 03       |SUB EAX,3
0040128F  |.  F6E2          |MUL DL
00401291  |.  5A            |POP EDX
00401292  |.  91            |XCHG EAX,ECX
00401293  |.  D3C3          |ROL EBX,CL
00401295  |.  33DA          |XOR EBX,EDX
00401297  |.  D3CB          |ROR EBX,CL
00401299  |>  59            |POP ECX
0040129A  |.  41            |INC ECX
0040129B  |.  83F9 08       |CMP ECX,8
0040129E  |.^ 0F85 71FFFFFF \JNZ 00401215
*******************************************************************/
DWORD CycleKeyGen(unsigned char *user,unsigned char *password)
{
        DWORD KeyA=CalcleA(user,password);
        DWORD KeyB=CalcleB(user,password);
        DWORD ESI=0;
        DWORD EDI=0;
        DWORD Edx=0;
        for(char i=0;i!=8;i++)
        {
                ESI=KeyA;
                EDI=KeyB;
                ESI<<=i;
                EDI<<=i;
                ESI&=0x80808080;
                EDI&=0x80808080;
                Edx=ESI;
                Edx=Cycle(Edx);
                ESI=CycleLow(Edx);
                Edx=EDI;
                Edx=Cycle(Edx);
                EDI=CycleLowA(Edx);
                EDI^=ESI;
                Edx=EDI&0xff;
                if(i<=3)
                {
                        int c=i*8+8;
                        KeyA=ROL(KeyA,c);
                        KeyA^=Edx;
                        KeyA=ROR(KeyA,c);
                }
                else
                {
                        char c=(i-3)*8;
                        KeyB=ROL(KeyB,c);
                        KeyB^=Edx;
                        KeyB=ROR(KeyB,c);
                }
        }
        return KeyA;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 03:20
心游尘世外
为你点赞~
2024-3-21 03:57
飘零丶
为你点赞~
2024-3-13 00:44
QinBeast
为你点赞~
2024-2-17 01:23
shinratensei
为你点赞~
2024-1-26 01:45
PLEBFE
为你点赞~
2023-3-7 00:47
最新回复 (31)
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
2
这个Crackme算法逆了大部分,想玩的同学下载附件玩吧,这是我逆的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <windows.h>
#include "resource.h"
char *ChangeWChar(char *Buffer)
{
    char *Tvar=Buffer;
    while(*Tvar!=0x00)
    {
        if(*Tvar>=0x61&&*Tvar<=0x7A)
        {
            *Tvar-=0x20;
        }
        Tvar++;
    }
    return Buffer;
}
UINT WspChange(char *Buffer)
{
    UINT Value=0;
    while(*Buffer!=0)
    {
        if(*Buffer<0x30&&*Buffer>0x46)
            return 0;
        if(*Buffer>0x39&&*Buffer>=0x41)
        {
            *Buffer-=0x37;
        }
        else{
            *Buffer-=0x30;
        }
        Value=((Value<<4)|(Value>>28));
        Value+=*Buffer;
        Buffer++;
    }
    return Value;
}
int ButtonProc(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    char User[128]={0};
    char Code[128]={0};
    switch(LOWORD(wParam))
    {
        case IDC_CHECK:
            if(GetDlgItemText(hWnd,IDC_USER,User,40)<5)
            {
                break;
            }
            if(GetDlgItemText(hWnd,IDC_CODE,Code,40)!=8)
            {
                break;
            }
            UINT Key=WspChange(ChangeWChar(Code));
            if(Key==0)
                break;
            Key=((Key^0x52476433)^0x52472456)-0x4000000;
    }
    return 1;
}
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            break;
        case WM_CLOSE:
            EndDialog(hWnd, 0);
            break;
        case WM_COMMAND:
            ButtonProc(hWnd,wParam,lParam);
            break;
    }
    return FALSE;
}
 
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
}
上传的附件:
2011-12-16 22:43
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
3
这个CRC32效验工具全逆,计算出的结果和原程序一模一样,想玩的同学下载附件玩吧,这是我逆的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <windows.h>
#include <shellapi.h>
#include "resource.h"
HINSTANCE hInst;
char wcPath[MAX_PATH]={0};
char Crc32Table[256]={0};
void InitCrc32(void)
{
    UINT Value=0;
    UINT Count=0;
    for(UINT i=0;i<1024;i+=4,Count++)
    {
        Value=Count;
        for(int j=8;j!=0;j--)
        {
            if(((BYTE)Value)&1)
                Value=(Value>>1)^0xEDB88320;
            else
                Value=(Value>>1);
        }
        *(DWORD*)(Crc32Table+i)=Value;
    }
}
UINT CalculateCrc32(char *Buffer,int Size)
{
    UINT Value=0xffffffff;
    BYTE WChar;
    for(int i=0;i<Size;i++)
    {
        WChar=Buffer[i];
        UINT Key=(Value&0xff)^WChar;
        Value=(Value>>8)^*(DWORD*)(Crc32Table+(Key*4));
    }
    return ~Value;
}
void CalculateBinary(UINT Key,char *Buffer)
{
    UINT Value;
    for(unsigned char i=0;i<32;i++)
    {
        Value=(Key<<i)&0x80000000;
        if(Value!=0x80000000)
        {
            *Buffer=0x30;
        }
        else{
            *Buffer=0x31;
        }
        Buffer++;
    }
    *Buffer=0x00;
}
BOOL GetOpenFile(HWND hWnd)
{
    OPENFILENAME  FileName = {0,0,0};
    TCHAR szPe[]="Target(*.exe)\0*.exe\0Target(*.dll)\0*.dll\0";
    FileName.hInstance = (HINSTANCE)hWnd;
    FileName.hwndOwner = hWnd;
    FileName.lStructSize = sizeof(OPENFILENAME);
    FileName.lpstrFilter = szPe;
    FileName.lpstrFile = wcPath;
    FileName.Flags = OFN_FILEMUSTEXIST||OFN_PATHMUSTEXIST;
    FileName.nMaxFile = sizeof(wcPath);
    if(!GetOpenFileName(&FileName))
    {
        return FALSE;
    }
    return TRUE;
}
int ButtonProc(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    char *lpText=0x00;
    UINT Size=0;
    DWORD dwRead=0;
    HANDLE hFile=NULL;
    char Crc32[32]={0};
    DWORD Crc=0;
    switch(LOWORD(wParam))
    {
        case IDBROWSE:
            GetOpenFile(hWnd);
            SetDlgItemText(hWnd,IDPATH,wcPath);
            break;
        case IDEDIT:
            Size=SendMessage(GetDlgItem(hWnd,IDEDIT),WM_GETTEXTLENGTH,0,0);
            lpText=(char*)malloc(Size);
            GetDlgItemText(hWnd,IDEDIT,lpText,Size+1);
            InitCrc32();
            Crc=CalculateCrc32(lpText,Size);
            wsprintf(Crc32,"%08X",Crc);
            SetDlgItemText(hWnd,ID_CRC32,Crc32);
            CalculateBinary(Crc,Crc32);
            SetDlgItemText(hWnd,ID_BIN,Crc32);
            break;
        case IDOK:
            hFile=CreateFile(wcPath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
            Size=GetFileSize(hFile,NULL);
            lpText=(char*)malloc(Size);
            ReadFile(hFile,lpText,Size,&dwRead,NULL);
            InitCrc32();
            Crc=CalculateCrc32(lpText,Size);
            wsprintf(Crc32,"%08X",Crc);
            SetDlgItemText(hWnd,IDCRC32,Crc32);
            CalculateBinary(Crc,Crc32);
            SetDlgItemText(hWnd,IDBIN,Crc32);
            break;
    }
    return 0;
}
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDROP hDrop;
    HICON  hIcon;
    switch(uMsg)
    {
        case WM_INITDIALOG:
            hIcon = LoadIcon(hInst,(LPCTSTR)IDI_ICON);
            SendMessage(hWnd,WM_SETICON,TRUE,(WPARAM)hIcon);
            DragAcceptFiles(hWnd,TRUE);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, 0);
            break;
        case WM_COMMAND:
            ButtonProc(hWnd,wParam,lParam);
            break;
        case WM_DROPFILES:
            hDrop = ( HDROP )wParam;
            UINT nFile = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
            for(int i=0;i<nFile;i++)
            {
                DragQueryFile(hDrop,i, wcPath, sizeof(wcPath));
                SetDlgItemText(hWnd,IDPATH,wcPath);
            }
            DragFinish(hDrop);
            break;
    }
    return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    hInst=hInstance;
    return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
}
上传的附件:
2011-12-16 22:45
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
4
这是一个Crackme的注册机,想玩的同学下载去玩吧,这是我逆的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "Header.h"
int BMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    char *Table="ZWATRQLCGHPSXYENVBJDFKMU";
    char Name[MAX_PATH]={0};
    char Serial[MAX_PATH]={0};
    int Length=0;
    BYTE Var=0;
    long Var1=0;
    switch(LOWORD(wParam))
    {
        case IDOK:
            Length=GetDlgItemText(hWnd,IDC_NAME,Name,MAX_PATH);
            for(int i=0;i<Length;i++)
            {
                Var+=Name[i];
            }
            Var1=((unsigned)Var%0x18);
            if(Var1>0x18)
                Var1-=0x18;
            Serial[0]=*(Table+Var1);
            Serial[1]=0x45;
            Var1+=Var1;
            if(Var1>0x18)
                Var1-=0x18;
            Serial[2]=*(Table+Var1);
            BYTE Key=0;
            BYTE TVar=Var1;
            for(int i=2;i!=8;i++)
            {
                Key=Serial[i];
                TVar=(TVar+(Key-0x41));
                if(TVar>0x18)
                    TVar-=0x18;
                Serial[i+1]=Table[TVar];
            }
            Var1=0;
            for(int i=0;i<9;i++)
            {
                Var1+=Serial[i];
            }
            Serial[9]=(Var1/9);
            SetDlgItemText(hWnd,IDC_SERIAL,Serial);
            break;
        case IDABOUT:
            ShellExecute(hWnd,"open","http://www.pediy.com",NULL,NULL,SW_SHOWNORMAL);
            break;
    }
    return 1;
}
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HICON Icon;
    switch(uMsg)
    {
        case WM_INITDIALOG:
            Icon=LoadIcon((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDI_ICON);
            SendMessage(hWnd,WM_SETICON,TRUE,(WPARAM)Icon);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, 0);
            break;
        case WM_COMMAND:
            BMCommand(hWnd,wParam,lParam);
            break;
    }
    return FALSE;
}
 
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    InitCommonControls();
    DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
    ExitProcess(0);
}
上传的附件:
2011-12-16 22:47
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
5
这个Crackme是一个查表,想玩的同学下载附件玩吧,这是我逆的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <windows.h>
#include <shellapi.h>
#include <mmsystem.h>
#include "resource.h"
UINT GetASIICode(BYTE Offset,char *Buffer)
{
    UINT TVar=Buffer[3+Offset];
    UINT TVar1=Buffer[2+Offset];
    TVar<<=8;
    TVar+=TVar1;
    TVar1=Buffer[1+Offset];
    TVar<<=8;
    TVar+=TVar1;
    TVar1=Buffer[0+Offset];
    TVar<<=8;
    TVar+=TVar1;
    return TVar;
}
UINT GetUserKey(char *Buffer)
{
    UINT Array[]={0x12,0x5C,0x34,0x22,0xAB,0x9D,0x54,0x00,0xDD,0x84,0xAE,0x66,0x31,0x78,0x73,0xCF};
    char *TVar="eheh";
    UINT Asii=GetASIICode(0,TVar);
    strcat(Buffer," is a whore.");
    int j=0;
    for(UINT i=0;i<sizeof(Array);i+=4,j++)
    {
        UINT ASII=GetASIICode(i,Buffer);
        ASII+=(Array[j]^j);
        ASII=(ASII<<7)|(ASII>>25);
        Asii^=ASII;
    }
    return Asii;
}
void ClearString(UINT Length,char *Buffer)
{
    UINT Len=strlen(Buffer);
    while(Len!=Length)
    {
        Buffer[Len]=0;
        Len--;
    }
    Buffer[Len]=0;
}
int BMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    char User[64]={0};
    char Buffer[32]={0};
    char *Table="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char Serial[]="KEYGENNING4NEWBIES";
    UINT Length;
    UINT KEY;
    switch(LOWORD(wParam))
    {
        case IDOK:
            Length=GetDlgItemText(hWnd,IDC_USER,User,64);
            if(Length==0&&Length>64)
                return 0;
            KEY=GetUserKey(User);
            ClearString(Length,User);
            for(UINT i=0;i<18;i++)
            {
                Buffer[i]=Table[KEY%0x1A];
            _asm{
                    mov eax,KEY
                    shl eax,3
                    IMUL EAX
                    ADD EAX,EDX
                    mov [KEY],eax
                }
            }
            for(UINT i=0;i<18;i++)
            {
                Serial[i]^=i;
            }
            for(UINT i=0;i<18;i++)
            {
                Serial[i]=((Serial[i]^Buffer[i])+0x30);
            }
            SetDlgItemText(hWnd,IDC_SERIAL,Serial);
            break;
        case IDABOUT:
            ShellExecute(hWnd,"open","http://www.pediy.com",NULL,NULL,SW_SHOWNORMAL);
            break;
    }
    return 1;
}
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HICON Icon;
    switch(uMsg)
    {
        case WM_INITDIALOG:
            Icon=LoadIcon((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDI_ICON);
            SendMessage(hWnd,WM_SETICON,TRUE,(WPARAM)Icon);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, 0);
            break;
        case WM_COMMAND:
            BMCommand(hWnd,wParam,lParam);
            break;
    }
    return FALSE;
}
 
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
}
上传的附件:
2011-12-16 22:49
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
6
这个是加密解密第五章的Crackme,想玩的同学下载玩吧,这是我逆的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <windows.h>
#include <shellapi.h>
#include <mmsystem.h>
#include "resource.h"
#pragma comment(linker, "/EXPORT:WinMain,@16")
#pragma comment(linker, "/ENTRY:WinMain")
#pragma comment(linker, "/BASE:1000")
#pragma comment(linker, "/ALIGN:0x200")
#pragma comment(linker, "/SAFESEH:NO")
int BMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    char User[32]={0};
    char Serial[32]={0};
    UINT Length;
    UINT KEY=0;
    switch(LOWORD(wParam))
    {
        case IDOK:
            Length=GetDlgItemText(hWnd,IDC_USER,User,32);
            for(UINT i=0;i<Length;i++)
            {
                if(User[i]<0x41)
                    break;
                if(User[i]>=0x41&&User[i]>0x5A)
                {
                    User[i]-=0x20;
                }
                KEY+=User[i];
            }
            KEY^=0x5678;
            KEY^=0x1234;
            wsprintf(Serial,"%d",KEY);
            SetDlgItemText(hWnd,IDC_SERIAL,Serial);
            break;
        case IDABOUT:
            ShellExecute(hWnd,"open","http://www.pediy.com",NULL,NULL,SW_SHOWNORMAL);
            break;
    }
    return 1;
}
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HICON Icon;
    switch(uMsg)
    {
        case WM_INITDIALOG:
            Icon=LoadIcon((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDI_ICON);
            SendMessage(hWnd,WM_SETICON,TRUE,(WPARAM)Icon);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, 0);
            break;
        case WM_COMMAND:
            BMCommand(hWnd,wParam,lParam);
            break;
    }
    return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    return DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
}
上传的附件:
2011-12-16 22:51
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
这是源代码,以前那个。想看下这垃圾代码的下载附件吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <windows.h>
/**************************************
检测横排是否有一样的数字
**************************************/
int CheckX(char Code[9][9])
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            BYTE Key=Code[i][j];
            if(Key==Code[i][1]&&j!=1)
                return 0;
            if(Key==Code[i][2]&&j!=2)
                return 0;
            if(Key==Code[i][3]&&j!=3)
                return 0;
            if(Key==Code[i][4]&&j!=4)
                return 0;
            if(Key==Code[i][5]&&j!=5)
                return 0;
            if(Key==Code[i][6]&&j!=6)
                return 0;
            if(Key==Code[i][7]&&j!=7)
                return 0;
            if(Key==Code[i][8]&&j!=8)
                return 0;
        }
    }
    return 1;
}
/**************************************
检测竖排是否有一样的数字
**************************************/
int CheckY(char code[9][9])
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            BYTE Key=code[i][j];
            if(Key==code[1][j]&&i!=1)
                return 0;
            if(Key==code[2][j]&&i!=2)
                return 0;          
            if(Key==code[3][j]&&i!=3)
                return 0;
            if(Key==code[4][j]&&i!=4)
                return 0;
            if(Key==code[5][j]&&i!=5)
                return 0;
            if(Key==code[6][j]&&i!=6)
                return 0;
            if(Key==code[7][j]&&i!=7)
                return 0;
            if(Key==code[8][j]&&i!=8)
                return 0;
        }
    }
    return 1;
}
/**************************************
检测左斜排是否有一样的数字
**************************************/
int CheckXY(char code[9][9])
{
    for(int i=0;i<9;i++)
    {
        BYTE Key=code[i][i];
        if(Key==code[1][1]&&i!=1)
            return 0;
        if(Key==code[2][2]&&i!=2)
            return 0;
        if(Key==code[3][3]&&i!=3)
            return 0;
        if(Key==code[4][4]&&i!=4)
            return 0;
        if(Key==code[5][5]&&i!=5)
            return 0;
        if(Key==code[6][6]&&i!=6)
            return 0;
        if(Key==code[7][7]&&i!=7)
            return 0;
        if(Key==code[8][8]&&i!=8)
            return 0;
    }
    return 1;
}
/**************************************
检测右斜排是否有一样的数字
**************************************/
int CheckYX(char code[9][9])
{
    int j=8;
    for(int i=0;i<9;i++)
    {
        BYTE Key=code[i][j];
        if(Key==code[i+1][j-1])
            return 0;
        if(Key==code[i+2][j-2])
            return 0;
        if(Key==code[i+3][j-3])
            return 0;
        if(Key==code[i+4][j-4])
            return 0;
        if(Key==code[i+5][j-5])
            return 0;
        if(Key==code[i+6][j-6])
            return 0;
        if(Key==code[i+7][j-7])
            return 0;
        if(Key==code[i+8][j-8])
            return 0;
        j--;
    }
    return 1;
}
/**************************************
检测横排的和
**************************************/
int CheckXCum(char code[9][9])
{
    for(int i=0;i<9;i++)
    {
        int Num=0;
        for(int j=0;j<9;j++)
        {
            Num+=code[i][j];
        }
        if(Num!=477)
            return 0;
    }
    return 1;
}
/**************************************
检测竖排的和
**************************************/
int CheckYCum(char code[9][9])
{
    for(int i=0;i<9;i++)
    {
        int Num=0;
        for(int j=0;j<9;j++)
        {
            Num+=code[j][i];
        }
        if(Num!=477)
            return 0;
    }
    return 1;
 
}
上传的附件:
2011-12-16 22:56
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
8
感谢韬哥的分享,主题合并,方便大家学习。
2011-12-17 09:32
0
雪    币: 287
活跃值: (598)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
滔哥牛B啊!什么时候才能追上你啊
2011-12-17 14:43
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
10
算法牛人啊!简直无法超越
2011-12-17 16:47
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
一个字:帅呆了。
2011-12-17 17:17
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
牛!!!!!!!!!!
2011-12-17 23:35
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
MARK!!!!!
2011-12-17 23:36
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
进来膜拜学习,感谢楼主分享
2011-12-18 07:16
0
雪    币: 437
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
膜拜一下。
2011-12-18 10:06
0
雪    币: 14983
活跃值: (5304)
能力值: ( LV15,RANK:880 )
在线值:
发帖
回帖
粉丝
16
牛啊。话说算法搞起来真的很蛋疼。
2011-12-18 13:14
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
膜拜牛人!!
2011-12-18 13:49
0
雪    币: 257
活跃值: (28)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
C语言我是新手。请教一下高手们:在用数据类型时,用DWORD还是UINT、用BYTE还是char有什么讲究吗?
2011-12-18 14:26
0
雪    币: 768
活跃值: (575)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
19
小邓进步神速呀:)太猛了
2011-12-18 14:28
0
雪    币: 14435
活跃值: (4712)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
牛!

谢谢分享!!!
2011-12-18 20:07
0
雪    币: 156
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
我以前也写过一个简单的...比起楼主这个差远了....有感触啊
2011-12-19 10:30
0
雪    币: 149
活跃值: (371)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
强。。拿来学习一下。
2011-12-19 11:08
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
先膜拜一下
这些算法看的我头晕  
也不知道逆这些算法花了多长时间,要是让我随便逆其中的一个  也得花好几个小时或者一天 甚至更长时间
也不知道什么时候才能脱离这个痛苦的阶段
2011-12-19 14:51
0
雪    币: 2562
活跃值: (4303)
能力值: ( LV13,RANK:540 )
在线值:
发帖
回帖
粉丝
24
学习,学习~~
2011-12-20 10:29
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
前来道声韬哥牛B !
2011-12-20 23:20
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

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