前言
本人之前一直是用DataGrip,昨天使用DataGrip时除了一些小Bug。今天试着使用Navicat Premium。
正文
1. 下载
先去官网下载最新的Navicat Premium,点击立即试用
即可下载。
2. 安装
“傻瓜式”安装没啥好说的
3. 破解
开始时候,找了一些破解方法,都太老了。
最后,在GitHub上找了一个开源工具,一看就知道有戏。
- 开源项目navicat-keygen
- 项目有两个分支,注意切换到mac分支,支持的是mac开发
- 查看
README.zh-CN.md
文件,查看完整的教程。

破解步骤
- 克隆项目
$ git clone git@github.com:DoubleLabyrinth/navicat-keygen.git
- 进入项目目录,切换mac分支
$ cd navicat-keygen
$ git checkout Mac
- 编译navicat-keygen目录
$ cd navicat-keygen
$ make release
// 编译输出
g++ -std=c++11 main.cpp -lcrypto -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib -o navicat-keygen
main.cpp:116:47: warning: '&' within '|' [-Wbitwise-op-parentheses]
SnKey[6] = EncodeTable[temp_snKey[3] << 3 & 0x1F | temp_snKey[4] >> 5];
~~~~~~~~~~~~~~~~~~~^~~~~~ ~
main.cpp:116:47: note: place parentheses around the '&' expression to silence
this warning
SnKey[6] = EncodeTable[temp_snKey[3] << 3 & 0x1F | temp_snKey[4] >> 5];
^
( )
main.cpp:125:48: warning: '&' within '|' [-Wbitwise-op-parentheses]
SnKey[14] = EncodeTable[temp_snKey[8] << 3 & 0x1F | temp_snKey[9] >> 5];
~~~~~~~~~~~~~~~~~~~^~~~~~ ~
main.cpp:125:48: note: place parentheses around the '&' expression to silence
this warning
SnKey[14] = EncodeTable[temp_snKey[8] << 3 & 0x1F | temp_snKey[9] >> 5];
^
( )
2 warnings generated.
- 编译navicat-patcher目录
$ cd navicat-patcher
$ make release
// 编译输出
gcc main.c -o navicat-patcher
main.c:45:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[0]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:48:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[1]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:51:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[2]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:54:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[3]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:57:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[4]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:60:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[5]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:63:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[6]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:66:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[7]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:69:12: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter
of type 'char *' converts between pointers to integer types with different
sign [-Wpointer-sign]
strcpy(pFileContent + offset, pubkey[8]);
^~~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:83:27: note: expanded from macro 'strcpy'
__builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~
main.c:98:53: warning: format specifies type 'size_t' (aka 'unsigned long') but
the argument has type 'off_t' (aka 'long long') [-Wformat]
printf("Get file size successfully: %zu\n", fd_stat.st_size);
~~~ ^~~~~~~~~~~~~~~
%lld
main.c:117:36: warning: format specifies type 'unsigned long long' but the
argument has type 'size_t' (aka 'unsigned long') [-Wformat]
printf("offset = 0x%016llx\n", offset);
~~~~~~~ ^~~~~~
%016zx
11 warnings generated.
- 备份好Navicat Premium.app/Contents/MacOS/Navicat Premium文件,以及Navicat中所有的数据库连接配置信息(包括密码)。删掉Keychain.app中所有由Navicat保存的密码。
- 运行patcher
$ cd navicat-patcher
$ ./navicat-patcher /Applications/Navicat\ Premium.app/Contents/MacOS/Navicat\ Premium
// 运行输出
Open file successfully.
Get file size successfully: 82679552
Map file successfully.
offset = 0x00000000025b7c2c
Success!
- 生成一个自签名的代码签名证书。
1. 打开钥匙访问串
2. 选择创建证书
3. 输入名称“navicat”,身份类型,证书类型,如下图所示
4. 点击创建


- 然后使用codesign命令对Navicat Premium.app进行重签名。这一步非常重要。
$ codesign -f -s "navicat" /Applications/Navicat\ Premium.app
- 打开Terminal.app,并定位到navicat-keygen文件夹
$ ./navicat-keygen 2048key.pem
接下来你会被要求输入Navicat的语言版本,然后得到一个 序列号,同时keygen会要求你输入用户名和组织名。
直接填写,之后你会被要求填写你得到的 请求码。注意此时 不要关闭Terminal.
Which is your Navicat language?
0. English
1. Simplified Chinese
2. Traditional Chinese
3. Japanese
4. Polish
5. Spanish
6. French
7. German
8. Korean
9. Russian
10. Portuguese
(input index)>1
SnKey:
XXXX-XXXX-XXXX-XXXX
Your name: children
Yout organization: greens
Input Request Code (in Base64), empty line to return:
-
断网
, 打开Navicat Premium。找到注册按钮并点击,在弹出的窗口中填入keygen给你的 序列号。然后点击激活
按钮. -
一般来说在线激活肯定会失败,这时候Navicat会询问你是否
手动激活
,直接选吧。 -
在手动激活窗口你会得到一个请求码,复制它并把它粘贴到keygen里。最后别忘了连按
至少两下回车
结束输入。
BmwG6a3HsaKsUvIHWJo/WlxVqT2QU9v5SXO6RX6UJ27BlEZouI0mH0rjajr1QtGzKPvwVlINqTcg
Q5tLh69deKE73aLtL5RddQ8shYIcS44EHt+6BH8bwn+MP2U35y/XoPMto4HN9dBBquJlsB5zGqko
EXPdprPDXpANjHrZvIKLshSSRDWSOvIBUDvDW4bR8P2U89AliAa317UGRdYwCKCbd4ZxVz9nSgbC
ttPbO/vThQ1A4zbVQRa9UlvzDET4FnUsB/kSpX6iAtBt87V3mk1uEVDxDpZj7SUeigI1Es6dHa7I
MGXG/BFGPt819mxflQwA1f4kiZtcLrUgkJvwkA==
Activation Code:
UoAh10ECUfcOAgCOWY60w+WWQ+qWpxgg5gteoHOvIcAnk+7RIW/xkz03UzZyGSlzqFZOxcJVXqafsO9Y45oNii0DtF68U1LJvmKWd68Gt8Vhx/EAygWQtbjH79kNgYg7R4EFJ2y9E4PNwn59wgIqLEs+PAjway9NoqnZGbGFJVT7oVLTnPE/im7kynRNV1vk6M+Yk7aO/mF0nzu5x2gkCNXtIfQrxEBwJqmaq1QAQhB3GZQu2ZELO9rLVSP5xNL/q73l2laR9AOI/17actfJ/qDIWSDx3a9x1RuRW4istEZg27rztstx5a9G2lg+/FendBiSygwpZwjBYIYd8SA34A==
11 .如果不出意外,你会得到一个看似用Base64编码的 激活码。直接复制它,并把它粘贴到Navicat的手动激活窗口,最后点激活按钮。如果没什么意外的话应该能成功激活。
谢谢,有问题可以咨询我。喜欢可以点赞,打赏。
网友评论