返回列表 发新帖

也来看看马年运程算法(好象231系列都是这样的)

  [复制链接]

1

主题

849

回帖

4211

积分

大学生

Rank: 5Rank: 5

金币
2094
好评
1
信誉
100
发表于 2025-12-22 14:50:33 | 显示全部楼层 | 阅读模式  来自 江苏
本帖最后由 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人评分好评 金币 理由
wrsky + 1 + 1 很给力!

查看全部评分 总评分:好评 +1  金币 +1 

回复

使用道具 举报

0

主题

1万

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
6870
好评
1
信誉
100
发表于 2025-12-22 15:22:46 来自手机  | 显示全部楼层  来自 河北
看看隐藏
回复

使用道具 举报

12

主题

4207

回帖

1万

积分

博士生

......

Rank: 7Rank: 7Rank: 7

金币
678
好评
18
信誉
100

考神MT论坛新人MT论坛最佳新人MT论坛帅哥挂机大佬

QQ
发表于 2025-12-22 15:24:04 来自手机  | 显示全部楼层  来自 江西
看看隐藏
回复

使用道具 举报

688

主题

1万

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
3411
好评
164
信誉
119

考神MT论坛新人MT论坛活跃会员MT论坛帅哥MT论坛灌水老大MT论坛侠客MT论坛最佳新人

发表于 2025-12-22 15:24:52 来自手机  | 显示全部楼层  来自 山西
看看有没有
回复

使用道具 举报

39

主题

1192

回帖

6448

积分

硕士生

孤儿

Rank: 6Rank: 6

金币
1109
好评
82
信誉
98
发表于 2025-12-22 15:26:34 来自手机  | 显示全部楼层  来自 四川
看见隐藏
回复

使用道具 举报

5

主题

2733

回帖

5471

积分

硕士生

Rank: 6Rank: 6

金币
1410
好评
0
信誉
89
发表于 2025-12-22 15:29:37 来自手机  | 显示全部楼层  来自 广西
谢谢谢谢
回复

使用道具 举报

1

主题

860

回帖

1906

积分

高中生

Rank: 4

金币
12
好评
0
信誉
98
发表于 2025-12-22 15:30:49 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

24

主题

4585

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4374
好评
7
信誉
91
发表于 2025-12-22 15:32:06 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

2

主题

972

回帖

2736

积分

大学生

Rank: 5Rank: 5

金币
2296
好评
0
信誉
100
发表于 2025-12-22 15:47:23 来自手机  | 显示全部楼层  来自 广东
看看分享
回复

使用道具 举报

8

主题

1万

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
5136
好评
1
信誉
100
发表于 2025-12-22 15:57:37 来自手机  | 显示全部楼层  来自 山东
看看隐藏
回复

使用道具 举报

22

主题

1784

回帖

5788

积分

硕士生

Rank: 6Rank: 6

金币
3010
好评
0
信誉
100
发表于 2025-12-22 15:58:35 来自手机  | 显示全部楼层  来自 广东
看看一下
回复

使用道具 举报

7

主题

542

回帖

2516

积分

大学生

Rank: 5Rank: 5

金币
1285
好评
3
信誉
100

考神MT论坛新人

发表于 2025-12-22 16:00:23 来自手机  | 显示全部楼层  来自 江西
谢谢分享
回复

使用道具 举报

69

主题

2250

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2741
好评
21
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛活跃会员

发表于 2025-12-22 16:17:29 来自手机  | 显示全部楼层  来自 湖北
学习
回复

使用道具 举报

8

主题

1475

回帖

2892

积分

大学生

Rank: 5Rank: 5

金币
548
好评
1
信誉
100
发表于 2025-12-22 16:24:32 来自手机  | 显示全部楼层  来自 河南
学习一下
回复

使用道具 举报

218

主题

5608

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
8149
好评
25
信誉
134

MT论坛最佳新人MT论坛活跃会员MT论坛帅哥MT论坛新人MT论坛灌水老大考神

发表于 2025-12-22 16:29:18 来自手机  | 显示全部楼层  来自 广东
厉害哦
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表