Navicat Keygen - 註冊機是怎麼工作的? 1. 關鍵詞解釋. Navicat激活公鑰 這是一個2048位的RSA公鑰,Navicat使用這個公鑰來完成相關激活信息的加密和解密。 這個公鑰被作為 RCData 類型的資源儲存在 navicat.exe 當中。資源名為"ACTIVATION ...
Navicat Keygen - 註冊機是怎麼工作的?
1. 關鍵詞解釋.
-
Navicat激活公鑰
這是一個2048位的RSA公鑰,Navicat使用這個公鑰來完成相關激活信息的加密和解密。
這個公鑰被作為 RCData 類型的資源儲存在 navicat.exe 當中。資源名為
"ACTIVATIONPUBKEY"
。你可以使用一個叫Resource Hacker的軟體來查看它。這個公鑰的具體內容為:-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw1dqF3SkCaAAmMzs889I qdW9M2dIdh3jG9yPcmLnmJiGpBF4E9VHSMGe8oPAy2kJDmdNt4BcEygvssEfginv a5t5jm352UAoDosUJkTXGQhpAWMF4fBmBpO3EedG62rOsqMBgmSdAyxCSPBRJIOF R0QgZFbRnU0frj34fiVmgYiLuZSAmIbs8ZxiHPdp1oD4tUpvsFci4QJtYNjNnGU2 WPH6rvChGl1IRKrxMtqLielsvajUjyrgOC6NmymYMvZNER3htFEtL1eQbCyTfDmt YyQ1Wt4Ot12lxf0wVIR5mcGN7XCXJRHOFHSf1gzXWabRSvmt1nrl7sW6cjxljuuQ awIDAQAB -----END PUBLIC KEY-----
如果您有相應的私鑰並樂意公開的話歡迎聯繫我,我將非常感謝您的慷慨。
註意:
從 Navicat Premium 12.0.25 開始,Navicat不再從
navicat.exe
的資源中載入私鑰。事實上,公鑰轉為從libcc.dll
中載入,並且已經被加密。與此同時,為了防止被輕鬆地替換,加密的公鑰被分到5個地方儲存:以下內容是從 Navicat Premium x64 12.0.25 簡體中文版 的
libcc.dll
中發現的,libcc.dll
的SHA256值為607e0a84c75966b00f3d12fa833e91d159e4f51ac51b6ba66f98d0c3cbefdce0
。我不保證在Navicat的其他版本中相關偏移量和下述的相同,但相關的 字元串 以及 立即數 是很可能找得到的。-
在
libcc.dll
中,文件偏移量+0x01A12090
的地方,儲存了加密公鑰的第一部分,以 字元串 的形式儲存:"D75125B70767B94145B47C1CB3C0755E 7CCB8825C5DCE0C58ACF944E08280140 9A02472FAFFD1CD77864BB821AE36766 FEEDE6A24F12662954168BFA314BD950 32B9D82445355ED7BC0B880887D650F5"
-
在
libcc.dll
中,文件偏移量+0x0059D799
的地方,儲存了加密公鑰的第二部分,以 立即數 的形式儲存在一條指令中:0xFE 0xEA 0xBC 0x01
相應的十進位值為:
29158142
-
在
libcc.dll
中,文件偏移量+0x01A11DA0
的地方,儲存了加密公鑰的第三部分,以 字元串 的形式儲存:"E1CED09B9C2186BF71A70C0FE2F1E0AE F3BD6B75277AAB20DFAF3D110F75912B FB63AC50EC4C48689D1502715243A79F 39FF2DE2BF15CE438FF885745ED54573 850E8A9F40EE2FF505EB7476F95ADB78 3B28CA374FAC4632892AB82FB3BF4715 FCFE6E82D03731FC3762B6AAC3DF1C3B C646FE9CD3C62663A97EE72DB932A301 312B4A7633100C8CC357262C39A2B3A6 4B224F5276D5EDBDF0804DC3AC4B8351 62BB1969EAEBADC43D2511D6E0239287 81B167A48273B953378D3D2080CC0677 7E8A2364F0234B81064C5C739A8DA28D C5889072BF37685CBC94C2D31D0179AD 86D8E3AA8090D4F0B281BE37E0143746 E6049CCC06899401264FA471C016A96C 79815B55BBC26B43052609D9D175FBCD E455392F10E51EC162F51CF732E6BB39 1F56BBFD8D957DF3D4C55B71CEFD54B1 9C16D458757373E698D7E693A8FC3981 5A8BF03BA05EA8C8778D38F9873D62B4 460F41ACF997C30E7C3AF025FA171B5F 5AD4D6B15E95C27F6B35AD61875E5505 449B4E"
-
在
libcc.dll
中,文件偏移量+0x0059D77F
的地方,儲存了加密公鑰的第四部分,以 立即數 的形式儲存在一條指令中:0x59 0x08 0x01 0x00
相應的十進位值為:
67673
-
在
libcc.dll
中,文件偏移量+0x01A11D8C
的地方,儲存了加密公鑰的第五部分,以 字元串 的形式儲存:"92933"
這五部分按照
"%s%d%s%d%s"
的形式輸出則為加密的公鑰,順序和上述的順序相同,具體的輸出為:D75125B70767B94145B47C1CB3C0755E7CCB8825C5DCE0C58ACF944E082801409A02472FAFFD1CD77864BB821AE36766FEEDE6A24F12662954168BFA314BD95032B9D82445355ED7BC0B880887D650F529158142E1CED09B9C2186BF71A70C0FE2F1E0AEF3BD6B75277AAB20DFAF3D110F75912BFB63AC50EC4C48689D1502715243A79F39FF2DE2BF15CE438FF885745ED54573850E8A9F40EE2FF505EB7476F95ADB783B28CA374FAC4632892AB82FB3BF4715FCFE6E82D03731FC3762B6AAC3DF1C3BC646FE9CD3C62663A97EE72DB932A301312B4A7633100C8CC357262C39A2B3A64B224F5276D5EDBDF0804DC3AC4B835162BB1969EAEBADC43D2511D6E023928781B167A48273B953378D3D2080CC06777E8A2364F0234B81064C5C739A8DA28DC5889072BF37685CBC94C2D31D0179AD86D8E3AA8090D4F0B281BE37E0143746E6049CCC06899401264FA471C016A96C79815B55BBC26B43052609D9D175FBCDE455392F10E51EC162F51CF732E6BB391F56BBFD8D957DF3D4C55B71CEFD54B19C16D458757373E698D7E693A8FC39815A8BF03BA05EA8C8778D38F9873D62B4460F41ACF997C30E7C3AF025FA171B5F5AD4D6B15E95C27F6B35AD61875E5505449B4E6767392933
這個加密的公鑰可以用我的另外一個repo(how-does-navicat-encrypt-password)解密,其中密鑰為
b'23970790'
。例如:
E:\GitHub>git clone https://github.com/DoubleLabyrinth/how-does-navicat-encrypt-password.git ... E:\GitHub>cd how-does-navicat-encrypt-password\python3 E:\GitHub\how-does-navicat-encrypt-password\python3>python Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from NavicatCrypto import * >>> cipher = Navicat11Crypto(b'23970790') >>> print(cipher.DecryptString('D75125B70767B94145B47C1CB3C0755E7CCB8825C5DCE0C58ACF944E082801409A02472FAFFD1CD77864BB821AE36766FEEDE6A24F12662954168BFA314BD95032B9D82445355ED7BC0B880887D650F529158142E1CED09B9C2186BF71A70C0FE2F1E0AEF3BD6B75277AAB20DFAF3D110F75912BFB63AC50EC4C48689D1502715243A79F39FF2DE2BF15CE438FF885745ED54573850E8A9F40EE2FF505EB7476F95ADB783B28CA374FAC4632892AB82FB3BF4715FCFE6E82D03731FC3762B6AAC3DF1C3BC646FE9CD3C62663A97EE72DB932A301312B4A7633100C8CC357262C39A2B3A64B224F5276D5EDBDF0804DC3AC4B835162BB1969EAEBADC43D2511D6E023928781B167A48273B953378D3D2080CC06777E8A2364F0234B81064C5C739A8DA28DC5889072BF37685CBC94C2D31D0179AD86D8E3AA8090D4F0B281BE37E0143746E6049CCC06899401264FA471C016A96C79815B55BBC26B43052609D9D175FBCDE455392F10E51EC162F51CF732E6BB391F56BBFD8D957DF3D4C55B71CEFD54B19C16D458757373E698D7E693A8FC39815A8BF03BA05EA8C8778D38F9873D62B4460F41ACF997C30E7C3AF025FA171B5F5AD4D6B15E95C27F6B35AD61875E5505449B4E6767392933')) -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw1dqF3SkCaAAmMzs889I qdW9M2dIdh3jG9yPcmLnmJiGpBF4E9VHSMGe8oPAy2kJDmdNt4BcEygvssEfginv a5t5jm352UAoDosUJkTXGQhpAWMF4fBmBpO3EedG62rOsqMBgmSdAyxCSPBRJIOF R0QgZFbRnU0frj34fiVmgYiLuZSAmIbs8ZxiHPdp1oD4tUpvsFci4QJtYNjNnGU2 WPH6rvChGl1IRKrxMtqLielsvajUjyrgOC6NmymYMvZNER3htFEtL1eQbCyTfDmt YyQ1Wt4Ot12lxf0wVIR5mcGN7XCXJRHOFHSf1gzXWabRSvmt1nrl7sW6cjxljuuQ awIDAQAB -----END PUBLIC KEY-----
註意:
從 Navicat Premium 12.1.11 開始,Navicat不再用上面說的方法載入密鑰。當然密鑰還是儲存在
libcc.dll
文件中。當Navicat啟動時,它會用8位元組長的XOR密鑰來加密公鑰,並儲存到一個靜態數據區中。當驗證 激活碼 時,Navicat會重新生成一樣的8位元組XOR密鑰,並解密在靜態儲存區中的密文,從而獲取公鑰。在
libcc.dll
,x64版本中,你會看到如下的幾條指令:xoreax,'M' mov byte_xxxxxx,al ... xoreax,'I' mov byte_xxxxxx,al ... xoreax,'I' mov byte_xxxxxx,al ... xoreax,'B' mov byte_xxxxxx,al ... xoreax,'I' mov byte_xxxxxx,al ... xoreax,'j' mov byte_xxxxxx,al ... ...
-
-
請求碼
這是一個Base64編碼的字元串,代表的是長度為256位元組的數據。這256位元組的數據是 離線激活信息 用 Navicat激活公鑰 加密的密文。
-
離線激活請求信息
這是一個JSON風格的字元串。它包含了3個Key:
"K"
、"DI"
和"P"
,分別代表 序列號、設備識別碼(與你的電腦硬體信息相關)和 平臺 (其實就是操作系統類型)。例如:
{"K": "xxxxxxxxxxxxxxxx", "DI": "yyyyyyyyyyyyy", "P": "WIN8"}
-
激活碼
這是一個Base64編碼的字元串,代表的是長度為256位元組的數據。這256位元組的數據是 離線激活回覆信息 用 Navicat激活私鑰 加密的密文。目前我們不知道官方的 Navicat激活私鑰,所以我們得替換掉軟體里的公鑰。
-
離線激活回覆信息
和 離線激活請求信息 一樣,它也是一個JSON風格的字元串。但是它包含5個Key,分別為
"K"
、"N"
、"O"
、"T"
和"DI"
."K"
和"DI"
的意義與 離線激活請求信息 中的相同,且Value必須與 離線激活請求信息 中的相同。"N"
、"O"
、"T"
分別代表 註冊名、組織、授權時間。註冊名 和 組織 的值類型為UTF-8編碼的字元串。授權時間 的值類型可以為字元串或整數(感謝@Wizr在issue #10中的報告)。
"T"
可以被省略。 -
序列號
這是一個被分為了4個部分的字元串,其中每個部分都是4個字元長。
序列號 是通過10個位元組的數據來生成的。為了表達方便,我用 uint8_t data[10] 來表示這10個位元組。
-
data[0] 和 data[1] 必須分別為
0x68
和0x2A
。這兩個位元組為Navicat的標誌數。
-
data[2]、data[3] 和 data[4] 可以是任意位元組,你想設成什麼都行。
-
data[5] 和 data[6] 是Navicat的語言標誌,值如下:
語言類型 data[5] data[6] 發現者 English 0xAC 0x88 簡體中文 0xCE 0x32 繁體中文 0xAA 0x99 日本語 0xAD 0x82 @dragonflylee Polski 0xBB 0x55 @dragonflylee Español 0xAE 0x10 @dragonflylee Français 0xFA 0x20 @Deltafox79 Deutsch 0xB1 0x60 @dragonflylee 한국어 0xB5 0x60 @dragonflylee Русский 0xEE 0x16 @dragonflylee Português 0xCD 0x49 @dragonflylee -
data[7] 是Navicat產品ID。(感謝 @dragonflylee 和 @Deltafox79提供的數據)
產品名 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 -
data[8] 的高4位代表 版本號。低4位未知,但可以用來延長激活期限,可取的值有
0000
和0001
。例如:
對於 Navicat 12: 高4位必須是
1100
,為12
的二進位形式。
對於 Navicat 11: 高4位必須是1011
,為11
的二進位形式。 -
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編碼 data[10],其中編碼表改為:
char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
編碼之後你應該會得到一個16位元組長的字元串,並且以"NAV"打頭。
將16位元組的字元串分成4個4位元組的小塊,然後用
"-"
連接就可以得到 序列號。 -
2. 激活過程
-
檢查用戶輸入的 序列號 是否合法。
-
在用戶點擊了
激活
按鈕之後,Navicat會先嘗試線上激活。如果失敗,用戶可以選擇離線激活。 -
Navicat會使用用戶輸入的 序列號 以及從用戶電腦收集來的信息生成 離線激活請求信息,然後用 Navicat激活公鑰 加密,並將密文用Base64編碼,最後得到 請求碼。
-
正常流程下,請求碼 應該通過可聯網的電腦發送給Navicat的官方激活伺服器。之後Navicat的官方激活伺服器會返回一個合法的 激活碼。
但現在我們使用註冊機來扮演官方激活伺服器的角色,只是Navicat軟體里的激活公鑰得換成自己的公鑰:
-
根據 請求碼, 獲得
"DI"
值和"K"
值。 -
用
"K"
值、用戶名、組織名和"DI"
值填寫 離線激活回覆信息。 -
用自己的2048位RSA私鑰加密 離線激活回覆信息,你將會得到256位元組的密文。
-
用Base64編碼這256位元組的密文,就可以得到 激活碼。
-
在Navicat軟體中填入 激活碼 即可完成離線激活。
-