navicat激活公钥
这是一个2048位的rsa公钥,navicat使用这个公钥来完成相关激活信息的加密和解密。
这个公钥被作为 rcdata 类型的资源储存在 navicat.exe 当中。资源名为"activationpubkey"
。你可以使用一个叫的软件来查看它。这个公钥的具体内容为:
-----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字节的小块,然后用"-"
连接就可以得到 序列号。
检查用户输入的 序列号 是否合法。
在用户点击了激活
按钮之后,navicat会先尝试在线激活。如果失败,用户可以选择离线激活。
navicat会使用用户输入的 序列号 以及从用户电脑收集来的信息生成 离线激活请求信息,然后用 navicat激活公钥 加密,并将密文用base64编码,最后得到 请求码。
正常流程下,请求码 应该通过可联网的电脑发送给navicat的官方激活服务器。之后navicat的官方激活服务器会返回一个合法的 激活码。
但现在我们使用注册机来扮演官方激活服务器的角色,只是navicat软件里的激活公钥得换成自己的公钥:
根据 请求码, 获得"di"
值和"k"
值。
用"k"
值、用户名、组织名和"di"
值填写 离线激活回复信息。
用自己的2048位rsa私钥加密 离线激活回复信息,你将会得到256字节的密文。
用base64编码这256字节的密文,就可以得到 激活码。
在navicat软件中填入 激活码 即可完成离线激活。
如对本文有疑问, 点击进行留言回复!!
MySQL-关系代数-并、交、差、等值连接、自然连接、左连接。。。
【MySQL牛客】10.获取所有非manager的员工emp_no
网友评论