爱数产品注册机

爱数产品注册机

爱数的产品的激活码检查逻辑在liblicense.so中实现,使用了自定义字符串加密算法。

IDA Debug

以下为激活产品过程中加密、解密关键算法的参数及返回值。

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
# 3EAEE402F224 machine code
# 3KMW40SW5KEA activte code

reg("R3NMM-36ESB-DPXNN-DU8ZK-KD49U-48MN1", "3EAEE402F224", "3KMW40SW5KEA")

# 验证serial是否合法
K32 36ESBDPXNNDU8IKKD49U48MN1 K32 @anyrobot3.0/enterprise/module/ml 0
38Q437BF7J74EMIKRQXKQMML5

K32 37BF7J7EMIKRQXKQMML5 K32 4Q834 0
3XTP9DRQQE87WVA8UMDN

K32 3XTP9DRQQE87WVA8UMDN K32 @anyrobot3.0/enterprise/module/ml 0
317117D8AA2F4188AA3D

K32 317117D8AA2F4188AA3D K32 @anyrobot3.0/enterprise/module/ml 1
3XTP9DRQQE87WVA8UMDN

# print '4Q834' == '4Q834'
# True


# 判断激活码是否正确
# crc32('3EAEE402F224') = 3986590392
# 39865903923986590392
K32 3KMW40SW5KEA K32 39865903923986590392 0
3GEKME48J422

K32 3GEKME48J422 K32 36ESBDPXNNDU8ZKKD49U48MN1 0
30G6Q2E0RS8O

K32 30G6Q2E0RS8O K32 39865903923986590392 0
3U8SAGOA7CUG

K32 3EAEE402F224 K32 36ESBDPXNNDU8ZKKD49U48MN1 1
3U8SAGOA7CUG

# print '3U8SAGOA7CUG' == '3U8SAGOA7CUG'
# True



验证serial是否合法

  1. 查询序列号的前5字节是否存在。

  2. 使用产品名称(上方样例中的值为@anyrobot3.0/enterprise/module/ml)解密序列号。

  3. 根据表中的偏移信息拼凑解密秘钥。

    1
    2
    3
    解密后的字符串:38Q437BF7J74EMIKRQXKQMML5
    偏移:[0, 0, 0, 0, 11]
    从后往前取,可以获得字符串4Q834
  4. 用上步的秘钥解密后的字符串进行crc32计算出一个字符串,并按表中偏移拼凑字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    解密后的字符串: 3XTP9DRQQE87WVA8UMDN
    CRC32: 15481947021548194702
    偏移: [7, 0, 2, 3, 2]
    s[1] = '3XTP9DRQQE87WVA8UMDN'[7]
    s[3] = '3XTP9DRQQE87WVA8UMDN'[0]
    s[0] = '15481947021548194702'[2]
    s[2] = '15481947021548194702'[3]
    s[4] = '15481947021548194702'[2]
    最后得到字符串4Q834
  5. 将第3步与第4步的得到字符串比较,相等则为合法的序列号。

激活码检查

  1. 使用machine_code生成crc32key。

    1
    2
    machine code:3EAEE402F224
    crc32key: 39865903923986590392
  2. 使用crc32key解密active_code。

    1
    3KMW40SW5KEA -> 3GEKME48J422
  3. 使用serial解密上一步结果。

    1
    3GEKME48J422 -> 30G6Q2E0RS8O
  4. 使用crc32key解密上一步结果。

    1
    30G6Q2E0RS8O -> 3U8SAGOA7CUG
  5. 使用serial加密active_code。

    1
    3EAEE402F224 -> 3U8SAGOA7CUG
  6. 比较第4步与第5步的结果,相等则表明激活码正确.

激活码生成过程

  1. 用serial加密machine_code。
  2. 用原始machine_code生产crc32key, 用生成的crc32key加密上一步生成的结果。
  3. 用serial再次加密上一步的结果。
  4. 用crc32key再次加密上步生成的结果,得到激活码。

image-20201216100528387