首页
社区
课程
招聘
[原创]注册机-2016腾讯游戏安全大赛-pc-第一轮
发表于: 2025-12-1 23:54 283

[原创]注册机-2016腾讯游戏安全大赛-pc-第一轮

2025-12-1 23:54
283

MFC软件可以使用UI控件解析出其他按钮绑定的函数
例如这个软件
图片描述

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 <stdio.h>
#include <Windows.h>
 
//明确    数据      存储      循环计数        算法
 
 
 
// 自定义Base64字符集
const char* base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@%";
 
// 函数:将二进制数组转换为Base64字符串
void binary_to_base64_string(const unsigned char* input, int input_len, char* output) {
    int i = 0, j = 0;
    unsigned char char_array_3[3];
    unsigned char char_array_4[4];
    int output_index = 0;
 
    while (input_len--) {
        char_array_3[i++] = *(input++);
 
        // 每积累3个字节,转换为4个Base64字符
        if (i == 3) {
            char_array_4[0] = (char_array_3[0] & 0xFC) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xF0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0F) << 2) + ((char_array_3[2] & 0xC0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3F;
 
            for (i = 0; i < 4; i++) {
                output[output_index++] = base64_chars[char_array_4[i]];
            }
            i = 0;
        }
    }
 
    // 处理剩余的字节(如果不是3的倍数)
    if (i > 0) {
        // 0填充剩余的字节
        for (j = i; j < 3; j++) {
            char_array_3[j] = '\0';
        }
 
        // 转换为Base64字符
        char_array_4[0] = (char_array_3[0] & 0xFC) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xF0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0F) << 2) + ((char_array_3[2] & 0xC0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3F;
 
        // 添加Base64字符
        for (j = 0; j < i + 1; j++) {
            output[output_index++] = base64_chars[char_array_4[j]];
        }
 
        // 添加填充字符(可选,如果您需要标准Base64格式)
        // while (i++ < 3) {
        //     output[output_index++] = '=';
        // }
    }
 
    output[output_index] = '\0'; // 字符串结束符
}
 
int main() {
    char user[0x100] = { 0 };       // "123456"
    char pass[0x100] = { 0 };
    scanf_s("%s", user, sizeof(user));
    byte name_encrypt_1[0x100] = { 0 };
 
    UINT32 userLen = strlen(user);
    if (userLen < 6 || userLen>20) {
        printf("用户名长度不合法:6<=长度<=20");
        return 0;
    }
    int len = 0;
    //用户名算法1
    {
        //DWORD+DWORD  四字节   BYTE+BYTE  一字节
        unsigned char* userEncodePtr = 0;
        for (size_t i = 0; i < 0x10; i++)
        {
            len = i % userLen;  //字符串长度6   0x10 
            userEncodePtr = name_encrypt_1 + i;
            *(DWORD32*)userEncodePtr += user[len] * (0x1339E7E + i) * userLen;//0x1339E7E的十进制是2016 01 26 日期  char
        }
        printf("用户名算法1输出内存数据:");
        for (int j = 0; j < 0x14; j++) {
            printf("%02X", name_encrypt_1[j]);  //B4D8048CC50ACCBABDE340AAB7C9F03A585977
        }
        printf("\n");
    }
 
    //用户名算法2
    BYTE name_encrypt_2[20] = { NULL };
    {
        for (size_t i = 0; i < 0x14; i += 4)
        {
            /*
            0x66666667 = 1717986919 (十进制)
            2³⁴ ÷ 10 = 1717986918.4 1717986919
            10=2³⁴/1717986919
            x/10=1717986919/2³⁴=1717986919>>34
            所以:
            ecx / 10 ≈ (ecx × 0x66666667) ÷ 2³⁴
                     = (ecx × 0x66666667) >> 34
 
            x*1717986919/2³⁴  == x/10
            */
            int tmp = *(int*)&name_encrypt_1[i] / 10;
            *(int*)&name_encrypt_2[i] = tmp;
        }
        printf("用户名算法2输出内存数据:");
        for (size_t i = 0; i < sizeof(name_encrypt_2); i++)
        {
            printf("%02X", name_encrypt_2[i]);      //79E266F47B6714F993E36CF7F8E0E40555EF0B00
        }
        printf("\n");
    }
 
 
    //通过N解密P数组
    DWORD32* N = (DWORD32*)name_encrypt_2;
    DWORD32 P[5] = { 0 };// 注意这里是 DWORD
 
    P[4] = N[0] + N[1];
    P[3] = N[2] + N[3];
    P[2] = 2 * N[0] + N[1];
    P[1] = 3 * N[2] - N[4];
    P[0] = 2 * N[2] + N[3];
 
    BYTE* pPassWord = (BYTE*)P;
    printf("计算所得二进制密码为:");
    for (int i = 0; i < 20; i++)
    {
        printf("%02X", pPassWord[i]);
    }
    printf("\n");
 
    char StringBuffer[0x100] = { 0 };
    binary_to_base64_string((const unsigned char*)P, sizeof(P), StringBuffer);
    printf("二进制数据转Base64编码密码为:");
    printf("%s", StringBuffer);
    printf("\n");
 
    return 0;
}

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回