用VB反汇编查看
![]() |
|---|
global_76
-
初始赋值 :在
Form_Initialize事件中,global_76 = &H45A0(十六进制),转换为十进制是 17824。 -
计算结果 :在
Form_Load事件中,执行global_76 = CLng(Fix((CDbl(global_76) * 3.1124)))。即17824 * 3.1124 = 55475.4176,再经Fix函数截断小数部分 取整,得到 55475。
var_94
-
ASCII拼接:将用户名每个字符的ASCII码拼接成数字字符串。
-
除以π简化 :循环执行
var_94 = Fix(var_94 / 3.141592654),直到其长度≤9位。 -
异或运算 :
var_94 = var_94 Xor &H30F85678(&H30F85678的十进制是821580432)。 -
减去global_76 :
var_94 = var_94 - 55475。
(用户注册码 - var_94) = 用户名长度是否成立。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
// 模拟VB6的Fix函数(向零取整)
__int64 vb6_fix(double number) {
if (number >= 0) {
return (__int64)floor(number);
} else {
return (__int64)ceil(number);
}
}
__int64 calculate_registration_code(const char* username) {
char ascii_str[256] = "";
int len = strlen(username);
// 1. ASCII拼接
for (int i = 0; i < len; i++) {
char temp[10];
sprintf(temp, "%d", (int)username[i]);
strcat(ascii_str, temp);
}
// 将字符串转换为__int64
__int64 s = _atoi64(ascii_str);
// 2. 循环除以π简化
char temp_buf[50];
while (strlen(ascii_str) > 9) {
s = vb6_fix((double)s / 3.141592654);
sprintf(ascii_str, "%I64d", s);
}
// 3. 后续运算
s = s ^ 0x30F85678;
s = s - 55475;
s = s + len;
return s;
}
int main() {
char username[100];
printf("请输入用户名: ");
scanf("%s", username);
// 计算注册码
__int64 registration_code = calculate_registration_code(username);
printf("用户名: %s\n", username);
printf("注册码: %I64d\n", registration_code);
// 验证计算公式
int name_len = strlen(username);
__int64 intermediate_value = registration_code - name_len;
printf("验证: (%I64d - %I64d) = %d\n", registration_code, intermediate_value, name_len);
return 0;
}
![]() |
|---|

