• 某数据库管理软件离线注册分析


    序列号 

    libcc.dll sub_1818810F0

    4x4=16字节

    通过10个字节的数据来生成的。

    1. data[0] 和 data[1]必须分别为 `0x68` 和 `0x2A`。这两个字节为Navicat的标志数。

    2. data[2]、data[3]和 data[4]可以是任意字节,你想设成什么都行。

    3. data[5]和 data[6]是Navicat的语言标志,值如下:

    | 语言类型 | data[5] | data[6] |
    |------------|:---------:|:---------:|
    | English | 0xAC | 0x88 | 
    | 简体中文 | 0xCE | 0x32 | 
    | 繁體中文 | 0xAA | 0x99 | 
    | 日本語 | 0xAD | 0x82 | 
    | Polski | 0xBB | 0x55 | 
    | Español | 0xAE | 0x10 | 
    | Français | 0xFA | 0x20 | 
    | Deutsch | 0xB1 | 0x60 | 
    | 한국어 | 0xB5 | 0x60 | 
    | Русский | 0xEE | 0x16 | 
    | Português | 0xCD | 0x49 | 

    4. data[7] 是Navicat产品ID。

    |产品名 |Enterprise|Standard|Educational|Essentials|
    |----------------------|:--------:|:------:|:---------:|:--------:|
    |Navicat Report Viewer |0x0B | | | |
    |Navicat Data Modeler 3| |0x84 |0x85 | |
    |Navicat Premium |0x65 | |0x66 |0x67 |
    |Navicat MySQL |0x68 |0x69 |0x6A |0x6B |
    |Navicat PostgreSQL |0x6C |0x6D |0x6E |0x6F |
    |Navicat Oracle |0x70 |0x71 |0x72 |0x73 |
    |Navicat SQL Server |0x74 |0x75 |0x76 |0x77 |
    |Navicat SQLite |0x78 |0x79 |0x7A |0x7B |
    |Navicat MariaDB |0x7C |0x7D |0x7E |0x7F |
    |Navicat MongoDB |0x80 |0x81 |0x82 | |

    5. data[8] 的高4位代表 版本号。低4位未知,但可以用来延长激活期限,可取的值有`0000`和`0001`。

    例如:

    navicat15 :1111   f0

    对于 Navicat 12: 高4位必须是`1100`,为`12`的二进制形式。
    对于 Navicat 11: 高4位必须是`1011`,为`11`的二进制形式。

    6. data[9]目前暂未知,但如果你想要 not-for-resale license 的话可以设成`0xFD`、`0xFC`或`0xFB`。

    根据 Navicat 12 for Mac x64版本残留的符号信息可知:

    * `0xFB`是 __Not-For-Resale-30-days__ license.
    * `0xFC`是 __Not-For-Resale-90-days__ license.
    * `0xFD`是 __Not-For-Resale-365-days__ license.
    * `0xFE`是 __Not-For-Resale__ license.
    * `0xFF`是 __Site__ license.

    之后Navicat使用 ECB 模式的 DES算法来加密 data[10]的后8字节,也就是 data[2]到 data[9]的部分。

    相应的DES密钥为:

    unsigned char DESKey = { 0x64, 0xAD, 0xF3, 0x2F, 0xAE, 0xF2, 0x1A, 0x27 };

    之后使用Base32编码

    编码之后你应该会得到一个16字节长的字符串,并且以"NAV"打头。


    请求码

    请求码数据例如:{"K":"NAVDGCLU799LPHHH", "DI":"9DACE501FEE3822FA7D5", "P":"WIN"}

    K:序列号

    DI:机器码

    P:操作系统

    请求码数据使用navicat的公钥加密


    激活码

    激活码数据例如:{"K":"NAVDGCLU799LPHHH", "DI":"9DACE501FEE3822FA7D5", "N":"popk", "O":"test", "T":1616371200}

    K、DI值与请求码数据中的值对应,

    N:注册名

    O:组织

    T:激活时间戳

    激活码为私钥加密,激活时通过公钥验证。


    分析记录

    Serial

    Navicat.Exe-->check_2175B90

    Libcc

    __int64 __fastcall sub_1818810F0   

     

    Request

     

     

    验证激活码

    sub_1818808E0

     

     

    启动时验证

    00000000029B84FB

     

    .text:00000000029B83A0 start

     

     

    Libcc

    .text:00000001806AA220 public: bool CCNavicat::setupContext(bool)

    Libcc

    .text:0000000181884670 CSRegistrationCenter_ICSRegistrationCenter_181884670

     

    解密公钥:

     

    CSRegistrationCenter_ICSRegistrationCenter_181884670-->sub_181884E60验证

     

    Libcc rva 14C5020

     

    读注册表,调用AES_CBC解密

     

     

    公钥解密激活码

     

    验证激活码

    sub_1818808E0

    验证序列号

    sub_1818852F0àsub_1818852F0-->serial_check_18187F510


  • 相关阅读:
    [LeetCode] Substring with Concatenation of All Words 解题报告
    [LeetCode] Symmetric Tree 解题报告
    [LeetCode] Unique Paths II 解题报告
    [LeetCode] Triangle 解题报告
    [LeetCode] Trapping Rain Water 解题报告
    [LeetCode] Text Justification 解题报告
    [LeetCode] Valid Sudoku 解题报告
    [LeetCode] Valid Parentheses 解题报告
    C++文件的批处理
    C++中两个类中互相包含对方对象的指针问题
  • 原文地址:https://www.cnblogs.com/DirWang/p/14586307.html
Copyright © 2020-2023  润新知