大学生
 
- 金币
- 2094
- 好评
- 1
- 信誉
- 100
|
本帖最后由 czsgyz 于 2025-12-23 18:36 编辑
1. 也来看看马年运程,找了一下算法的出处,下面是机器码变换与假注册码比较的地方
public static boolean g(String str, String str2) { str 为机器码“-”前半部分 str2为注册码 通过函数g来比较
b bVar = f1727a; 这个函数是标准的MD5
a.y = a(bVar.m(a.f(str.substring(0, 5) + "-41231".substring(1, 5))));
f(str2);
String e2 = e(str2);
if (str2.length() != 15) {
return false;
}
if (!a.y.equals(e2)) {
a.z = false;
return false;
}
a.z = true;
return true;
}
}
2. a.y = a(bVar.m(a.f(str.substring(0, 5) + "-41231".substring(1, 5)))); 这样实际是取机器码前5位与4123链接成9位(F78984123) 进行f 函数运算,bVar.m这个函数是标准的MD5
下面查看f函数
public static String f(String str) {
int length = str.length();
if (length <= 0) {
return "";
}
long j2 = 0;
for (int i2 = 0; i2 < length; i2++) {
byte charAt = (byte) str.charAt(i2);
int i3 = charAt + 7;
int i4 = charAt * 5;
j2 = (j2 + ((long) j(charAt, i3, i4)) + ((long) k(charAt, i3, i4)) + ((long) l(charAt, i3, i4))) * ((long) (m(charAt, i3, i4) + 12));
if (j2 > 100000000) {
j2 = (long) Integer.parseInt(String.valueOf(j2).substring(String.valueOf(j2).length() - 7));
}
}
String valueOf = String.valueOf(j2);
return valueOf.length() >= 6 ? valueOf.substring(valueOf.length() - 6) : String.valueOf(j2 + 523109);
}
public static int j(int i2, int i3, int i4) {
return (i2 << 2) | (i3 & i4);
}
public static int k(int i2, int i3, int i4) {
return i2 & i4 & ((i3 << 3) | i4);
}
public static int l(int i2, int i3, int i4) {
return (i2 & (i4 << 2)) | ((i3 << 3) & i4);
}
public static int m(int i2, int i3, int i4) {
return (i2 << 4) & (i4 << 2) & ((i3 << 2) | i4);
}
里面调用到是j\k\l\m4个函数
3.经过变换后969820取MD5值 为 56fd2644b9d1c130b092913f36277d7c
4.将MD5值进入a函数
public static String a(String str) {
String str2;
String str3 = "";
if (str.length() > 0) {
str2 = str3;
for (int i2 = 0; i2 < str.length(); i2++) {
char charAt = str.charAt(i2);
if (Character.isDigit(charAt)) {
str2 = str2 + charAt;
}
}
} else {
str2 = str3;
} 到这一步实际是取MD5值的数字,字母去除
if (str2.length() >= 12) {
str2 = str2.substring(2, 6) + str2.substring(5, 9) + str2.substring(8, 12);
}
int i3 = 0;
while (i3 < str2.length()) {
int i4 = i3 + 1;
str3 = str3 + String.valueOf(Integer.parseInt(str2.substring(i3, i4)) ^ 4);
i3 = i4;
}
if (str3.length() > 12) {
str3 = str3.substring(0, 12);
}
String valueOf = String.valueOf(Long.parseLong(str3) + 10832712602L);
return valueOf.substring(3, 5) + valueOf.substring(8, 10) + valueOf.substring(6, 8);
得到6位值 838106
5. 再来看看下面的比较
String e2 = e(str2); 取注册码进入函数e
if (str2.length() != 15) { 注册码为15位
return false;
}
if (!a.y.equals(e2)) { 不等,注册不成功
a.z = false;
return false;
}
a.z = true; 否则注册成功
return true;
public static String e(String str) {
return str.substring(2, 5) + str.substring(11, 14); 注册码3-5及12-14这6位的值
} 下面为取注册码第2位,版本检测,感觉取6能覆盖相关版本 ,主要是针对几个复合的软件,如批八字等 public static boolean a(String str) { return str.equals("1") || str.equals("4") || str.equals("7"); }
public static boolean b(String str) { return str.equals("2") || str.equals("5") || str.equals("8"); }
public static boolean c(String str) { return str.equals("3") || str.equals("6") || str.equals("9"); }
'位置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ' ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
'| 方法 | 截取范围 | 返回长度 | 在校验流程里的用途 | '| -------- | ---------- - | ---- - | ---------------------------------------- | '| `f(str)` | 6-7 | 2 | “年”段(后两位) | '| `e(str)` | 8-9 | 2 | “月”段 | '| `d(str)` | 10-11 | 2 | “日”段 | '| `g(str)` |3-5 + 12-14 | 3+3=6 | 把第 3-5 位和第 12-14 位拼起来,共 6 位,后续当 MAC/校验向量 | '| `h(str)` | 2 | 1 | 单独取第 1 位字符,可能当版本或密钥索引 |
''[1] [2] [3 4 5] [6 7] [8 9] [10 11] [12 13 14] [15] ' ▲▲ ▲ ▲ ▲ ▲ ▲ ▲ ' | | | | | | | | ' | | | | | | | +-- 末位校验或填充 ' | | | | | | +---------- g() 的后半段 ' | | | | | +------------------- d() 日段 ' | | | | +-------------------------- e() 月段 ' | | | +-------------------------------- f() 年段(后两位,年份小于2040年) ' | | +--------------------------------------- g() 的前半段 ' | +-------------------------------------------- h() 版本位 ' +------------------------------------------------ 保留/密钥索引
6.最后注册码实际是比较6个位的值,通过机器码算出6位值,分别与注册码3-5及12-14这6位的值比较
7.1位保留/密钥索引,随机取8,2位版本位,可取6,好象覆盖版本吧;6-11位对应的是到期时间对应年(后两位,要小于2040年)月日,最后一位位校验或填充,随机取8吧
如机器码:F789805E-41231 注册码:868383808181068
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +1
金币 +1
|