Navicat 17 破解教程

查看 108|回复 1
作者:iwolf   
Navicat作为查看、管理数据库的工具,使用广泛,本教程针对版本17.1.3进行破解。此版本的下载地址请自行搜索,官网已有新版本,可能直接找不到旧版地址,网上的一些历史版本官方下载地址可能没有17的。
8.19更新:我电脑中的这个软件被莫名其妙卸载了??当初安装的时候不知道怎么就安装到了 ‘%temp%’目录下,一直没管它,最近也没清理系统,而且几个月都好好的在那里,现在突然路径下的程序目录消失了,回收站没有,注册表的键值都在。不知道什么原因。有清楚的大佬、小伙伴知道的在评论里告诉一下。不确定是否软件有检测机制给自动卸载的。不放心的小伙伴还是给它禁止联网吧。
相关工具
x64dbg、IDA、ProcessHacker、ToolsFx、CheatEngine
关于装载基址说明
注册激活逻辑涉及的代码都在libcc.dll和libcf.dll中,经常是两个文件之间相互通过虚函数调用,需动态调试分析进入到函数中。
libcc.dll的Imagebase:0x180000000.  libcf.dll的Imagebase:0x180000000.
因x64dbg加载程序时的基址不同,所以本文中的地址基于IDA的装载基址,若与文中不同,需自行计算调整。本文中出现的函数、提取的字符、密钥等,是通过大量的断点、CE内存搜索、堆栈回溯,动态分析出的,对于函数的功能解析,少不了AI的辅助加成。尤其是各种加解密算法,对密码学不了解的话,动态分析容易跟进到底层实现,却又不知道函数是在干什么。如果AI能识别出密码算法,再通过输入输出验证,能解决很大问题。
时间相关的逻辑
在程序与时间日期、过期日期等有关的逻辑中,相应的时间戳写在注册表中,路径位于HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration17XCS和HKEY_USERS\S-1-…-1000\Software\PremiumSoft\NavicatPremium\Registration17XCS,项名称的最后5个字符不确定是随机字符还是带版本号的字符,这两项的键值数据是一样的。
在libcc.dll中,函数sub_181C15DB0生成AES加密中使用到的IV偏移量,在函数返回值+8字节偏移的内存地址处,长度是16字节。从代码中可以看到,该IV值为:66E088B70FC0431F8751A0954ED211AA。


Snipaste_2025-08-05_20-25-45.png (24.8 KB, 下载次数: 5)
下载附件
2025-8-13 09:42 上传



Snipaste_2025-05-13_17-09-04.png (114.58 KB, 下载次数: 5)
下载附件
2025-8-13 09:42 上传

在libcc.dll中,函数sub_181C17AC0生成AES的KEY,第三个参数是与本机MAC地址相关的字符串指针。比如, MAC地址是“12-AB-34-56-22-9A”,那么该处的字符串就是“42413231-3433-3635-3232-3941FFFFFFFF”。该函数对包括‘-’的整个字符串进行MD5加密,函数返回值是KEY的指针的指针。有了初始的KEY和IV就可以解密过期日期的生成逻辑。在上面Registration17XCS的注册表项中,键值都是加密的,无法直接获取。找到数据中最长的那一处键值,该处的键值可能与IV偏移量有关。取前64个字符(即第1个逗号前的内容),将其前后分开作为2个16字节的HEX数据对待。


Snipaste_2025-08-06_15-24-14.png (79.96 KB, 下载次数: 2)
下载附件
2025-8-13 09:44 上传

下面进行时间戳的解密,本文用到的加解密工具为“密码学工具箱ToolsFx”,论坛爱盘中的工具,也可使用在线加解密网站。在“对称加密”标签页中,选择AES算法、CBC模式、NoPadding填充,KEY和IV是前面函数获取的内容(注意,连同密文一样都是HEX格式),密文为注册表键值的前32个字符(即16字节),解密得到一串HEX数据,可以看到前半部分是“NAVICAT”的HEX内容。解密出的数据取后8字节备用。


Snipaste_2025-08-06_15-36-08.png (38.87 KB, 下载次数: 4)
下载附件
2025-8-13 09:44 上传

然后,KEY不变,将键值的前32个字符(即刚才的密文)作为IV,将紧邻的后32个字符作为密文,解密,得到一串HEX数据,取前8字节。各取这两次解密后的8字节进行拼接得到16字节(顺序是:第一次的后8字节+第二次的前8字节),将其作为新的KEY,IV仍是初始的由sub_181C15DB0生成的那个。接着是密文的获取。AES加密的时间戳在Registration17XCS的注册表项中,因都是密文,可以将较短的数据依次放在密文输入框中,解密成‘raw’格式,最终能找到解密出的时间戳。AES正确解密后得出时间戳,一个是程序首次使用的日期,一个是进行注册激活的日期(如果有的话,当许可证可用时会有1个月的注册期限,超过期限不注册将显示激活期限过期)。注册表记录的是开始使用的时间戳,程序将该时间戳增加30天,以过期日期的形式最终显示出来。


Snipaste_2025-08-06_16-09-30.png (49.51 KB, 下载次数: 4)
下载附件
2025-8-13 09:44 上传

同时,时间的验证会有一次2次校验。如果只修改一处,那么2次校验出错,程序仍能显示最初的过期时间,也就是需同时修改多处注册表,使之相对应,才能达到修改注册表延长试用日期的目的。2次校验的相关数据在注册表的位置类似于:HKEY_USERS\S-1-…-1000_Classes\CLSID{7E45101F-…-93C34F589041}\Info和临近表项位置。(CLSID下子键不多,看到加密的键值对应该就是)。2次校验分两个步骤,1个是Info内数据的AES解密,1个是CLSID子项名称中包含的时间戳16进制核对。Info内数据的时间戳计算使用到AES加解密,密钥key‘libcckeylibcckey’,IV‘libcciv libcciv ’(包含空格符),CBC模式,PKCS5填充。CLSID另一个子项的名称中末尾8个字符是时间戳的16进制形式,换算成10进制是首次试用的时间戳。2次校验用于程序首次试用30天的情况,对应Info中第一个键值。不确定激活期限是否有2次校验(未进行修改注册表的验证)。


Snipaste_2025-08-05_16-24-56.png (107.37 KB, 下载次数: 4)
下载附件
2025-8-13 09:44 上传

许可证密钥生成
参考论坛里的《XX XX v12.0.23.0 破解教程x86,x64通用,手动破解,不要补丁,无病毒》一文(如果早看到这篇文章能少走很多弯路),文章里是版本12,当前17版本有部分逻辑相同,但也有部分变化。
在libcc.dll中,函数sub_181B7F490是Base32解码,对该函数的调用在0x181B7D5F7地址处。参数2是输入的16个字符许可证密钥的指针,参数1存放Base32解码后的数据,数据应为10个字节,且前两个字节必须为字符“h*”。sub_181B7F490的上层函数是sub_181B7D4C0,其得到解码数据后进行'h*'的比较,若不是则出错,若是则取剩余的8字节。
0x181B7D678地址处进行DES解密函数的调用,密文是刚截取的8字节,ECB模式,无填充,密钥为 “E9 7F B0 60 77 45 90 AE”,此密钥来自于libcc.dll中的固定数据.data: unk_185A6D660,函数返回值是DES解密后的8字节。libcf.dll中的sub_1800F3970函数由AI分析出DES密钥调度算法,ECB模式,无填充。


Snipaste_2025-08-07_15-10-39.png (109.58 KB, 下载次数: 3)
下载附件
2025-8-13 09:44 上传

对DES解密出的8字节进行判断,只有判断通过才说明是正确的许可证密钥格式。倒数第二位的字节取其高4位,加0x10后要大于等于0x11,否则出错。接着判断第4、5位,要为CE32或CE33,否则出错。判断第6位,0x65即可满足。关于各字节代表的含义,参考一文中有具体说明。


Snipaste_2025-08-07_10-15-08.png (47.7 KB, 下载次数: 4)
下载附件
2025-8-13 09:44 上传



Snipaste_2025-08-07_10-54-07.png (53.42 KB, 下载次数: 3)
下载附件
2025-8-13 09:44 上传

当许可证密钥验证通过后就可以点击“激活”按钮,但此处的激活方式是联网校验激活,必然不通过。针对此处的破解方法可以是拦截修改响应数据包,前提是逆向出正确的响应数据包格式。软件有“手动激活”离线注册的功能,使用场景是内网环境下的软件激活,由其他机器向注册激活服务器发送本机生成的请求码,填入获取的激活码进行激活。也就是说软件本身具有非联网状态下的激活功能。逆向出手动激活方式的请求码和激活码,就可完成对软件的破解。
程序RSA公钥
“手动激活”的功能要在断网状态下点击“激活”按钮后出现,不过程序在注册界面有个“连接设置”,勾选“验证针对CA的服务器证书”,可以达到程序连接不上服务器的目的,等同于断网状态。
老版本程序中使用的RSA公钥是嵌入在资源中的,很容易找到并进行替换,17版本中仍然有这个资源,但是已经弃用,这也导致即使进行了公钥替换也无法解密出RSA的明文。动态调试查找RSA公钥信息,发现其字符在libcc.dll中是以碎片的形式存在于.rdata区段中,最后组装在一起。程序在启动后不久应该是只运行一次RSA公钥加载函数,将PEM格式(去掉头尾标记,即只有Base64编码)的公钥加载入内存,然后从公钥中提取出加密所需要的大数N,供后续RSA加密使用。该函数为sub_181C190A0,对函数的调用指令位于0x181B81A57,函数返回值是Base64编码格式公钥的指针的指针。后面对RSA加解密的破解只能是替换成我们自己的公私钥对,因此这里需要用到hook的方式替换公钥。(当然也可以手动修改内存,或者制髂诖娌苟≈嗟模ook方法见乱唤凇�


Snipaste_2025-08-07_16-54-30.png (60.4 KB, 下载次数: 6)
下载附件
2025-8-13 09:44 上传

在libcf.dll中的函数sub_1800F2350进行RSA加密,参数[arg1+50h]处的字节流是公钥中大数N的16进制小端序,arg3、arg4分别是明文及长度, arg5将存放加密后的数据。最终将会调用sub_1801027F0执行底层的RSA操作。因使用PKCS1填充方式,明文会被随机数填充,所以每次加密的结果都是不一样的,只能通过私钥解密的方式来查看验证明文数据。这里也基本理解了RSA的核心加密公式:明文M转换为数字后,加密公式为:C≡M^e  mod n. 其蠧为密文,e和n为公钥。以RSA-2048位PKCS1填充模式的加密举例,明文被随机数填充扩充为0x100字节,将其作为2048位的大整数对待。n、e是从公钥中提取的数据,e一般就是0x10001,n也同样作为2048位的大整数对待。加密公式的模幂运算在底层会被其他方式简化实现,生成2048位的大整数即为密文。这些明文、密文、公钥模数n对应于内存中的表现形式就是0x100字节(2048位的运算)。


Snipaste_2025-08-08_10-14-02.png (54.5 KB, 下载次数: 3)
下载附件
2025-8-13 09:45 上传

联网激活的流程是,将16个字符的许可证密钥进行RSA-2048位加密,得到0x100字节(�2048位),向注册激活服务器发送数据,内容为“input:0x100字节密文”,服务器返回响应。libcc.dll中的函数sub_181B7FA80向服务器发送激活数据,参数2是注册激活服务器字符串的指针,参数3是发送HEX字节流数据的指针。
有了自己的RSA公私钥,我们可以对一些密文尝试破解,如果能解出可读明文那说明使用的是RSA加密。其实定位到RSA加密函数后,通过调试也能发现,点击“手动激活”后会进入RSA加密的流程,查看其参数可获取明文,此处密文对应于手动激活窗口中的请求码。对于加密而言,用户方提供的是“{"K":"NAVMIKCHCWNIHS3Q",… "P":"WIN"}”的明文,使用RSA公钥加密得到密文就是请求码。请求码是程序自动生成的。将请求码发送给激活服务器,服务端使用私钥解密得出明文,添加一些字段后再加密生成激活码返回给用户。


Snipaste_2025-08-08_11-27-00.png (132.48 KB, 下载次数: 4)
下载附件
2025-8-13 09:45 上传

在libcf.dll中的sub 18002FBD0是BASE64解码函数,激活码是BASE64格式,需先调用该函数解码得到0x100字节,参数3是激活码数据的指针,返回值是解码数据的指针的指针。解码后,libcc.dll中的sub 181B7C980函数会进行RSA解密,得到实际提供的明文JSON激活字符串,然后获取各字段值。该函数必须返回0才能注册成功。在未看到参考文章之前的调试过程中,一开始不理解为什么激活码的验证还要经过RSA加密?包括之前的联网激活过程中,也是对服务器返回的响应数据进行同样的处理流程。流程分析的结果是对数据进行RSA加密,然后判断密文是否是有效JSON字符串,若无效则出错。后来发现ToolsFx工具中有“私钥加密”一项,一般情况下是公钥加密、私钥解密以及私钥签名、公钥验签,但是私钥也可以用来加密,对应于用公钥解密。经过验证正是如此,在底层汇编中,我的理解是公钥解密和大部分情况的公钥加密是同一套代码逻辑,只是对应于用私钥加密的密文,解密要使用公钥。在程序中,用RSA公钥解密激活码得出明文,而在调试环境下,以为是在公钥“加密”。(这部分可能有些拗口)
用公钥解密出JSON字符串后,会提取字段值进行比较,如果字段缺失或与之前的不一致则出错。调试中可以看出包含K,N,M,O,T,DI,FA字段,其中M、FA字段可以不填。T表示时间戳,为整数,是必填项,下面截图中的字段缺少T,是注册不成功的。依据参考教程中的激活码字段信息说明构造字符串,选择2048位,PKCS1填充,注意勾选“私钥加密”,这样加密生成的BASE64格式数据就是需提供的激活码。将加密内容复制到激活码中,成功激活。


Snipaste_2025-08-08_15-10-16.png (125 KB, 下载次数: 4)
下载附件
2025-8-13 09:45 上传



Snipaste_2025-08-08_19-16-43.png (68.72 KB, 下载次数: 6)
下载附件
2025-8-13 09:45 上传



Snipaste_2025-08-08_19-18-09.png (153.92 KB, 下载次数: 5)
下载附件
2025-8-13 09:45 上传



Snipaste_2025-08-08_19-48-01.png (143.83 KB, 下载次数: 4)
下载附件
2025-8-13 09:45 上传

在我的测试环境下,最后出了个小问题。就是当破解后,再次重新打开程序,会提示“激活期限已过期”,因为在破出许可证密钥到最后逆出激活码用了很长的时间,早过了激活期限,但是更换许可证密钥好像又没有生效。刚才提示激活成功的时候,程序有操作注册表的过程,应该是写入了激活信息,现在又读取出激活期限,猜测是读取超期的逻辑先于读激活信息执行。不确定如果在期限内完成破解的话,是否无此问题。当使用hook公钥的方式启动后,发现程序为破解状态,那么问题就好解决了。如果遇到同样的问题,往下看,如无此问题则可忽略。
制作一个程序启动器即可,以后不直接双击运行原始程序,而是通过启动器来运行。启动器的逻辑也很简单,运行原始程序,在加载后立即挂起,注入hook dll,然后继续运行程序。这么简单的代码交给AI去写就好,比如提示词:

用C语言写一个加载指定程序启动的launch程序,要求加载运行同目录下的指定程序,启动程序后立即挂起,将同目录的指定DLL注入到程序中,然后继续运行

该提示词生成的程序还需要输入参数,有些麻烦,因为是自用,你可以直接将参数写入代码里,最后双击运行该启动器程序即可。
HOOK替换RSA公钥
本文使用MinHook进行hook dll的制作,未作详细使用的研究,只是依照简单例子进行修改。生成公私钥对的时候选择392长度的公钥,与程序中使用的长度保持一致,否则会崩溃。代码如下:
#include "pch.h"
#include
#include
#include
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x64-v120-mdd.lib")
// 函数指针定义
typedef int(__stdcall* TargetFunction_t)(int, int);
TargetFunction_t originalFunction = nullptr;
uintptr_t __fastcall HookedFunction(int param1, int param2) {
    uintptr_t result = originalFunction(param1, param2);
    LONG64* ptr = reinterpret_cast(result);
    char message[64];
    sprintf_s(message, " Address: 0x%p", (LONG64*)*ptr);
    MessageBoxA(NULL, message, "Hook Info", MB_OK | MB_ICONINFORMATION);
    // 替换为自己的公钥,注意长度392要与程序原公钥保持一致,
    memcpy_s((LONG64*)*ptr, 392, "XXXXXXXXX", 392);
    return result; // 修改返回值
}
void Execute()
{
    MH_Initialize();
    HMODULE hModule = GetModuleHandle(L"libcc.dll");
    if (!hModule) {
        printf("Failed to get module handle\n");
        return;
    }
    uintptr_t targetAddress = (uintptr_t)hModule + 0x1C190A0; // 替换为实际 RVA
    MH_CreateHook((LPVOID)targetAddress, &HookedFunction,
        reinterpret_cast(&originalFunction));
    MH_EnableHook((LPVOID)targetAddress);
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        Execute();
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
使用的公钥跟激活状态类似于有一种绑定关系,也就是说,你用一个公钥激活之后,又使用另外的公钥制作了新的dll,注入新dll启动程序将仍是未激活状态。替换什么样的公钥激活,以后就用这个注入启动。有条件的就自己编译代码,使用自己的RSA2048位密钥对。文末附件是生成好的对应V17.1.3版本,注释掉了弹窗信息,对应的密钥对是:
-----BEGINPUBLICKEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAijqbHNPRBmVNQb9KNZu0bPbRW/M/pFOQWoGh4uaPpIsW/LwjTegEBNklw9tuXXeUN4RNheeWaImcHnBxe6gvoYjMBPh2nMCWKhId3ba9JbIjbcRi/O7y6+F6votbqLT05FI25QV4coLeOQyb0NehOdQbah773Q88cJePgLnsoqthGOXmPWv1I/3JyrEf9OqF7JSNvik/2kmoTHHW63uWR/ExQLhOsHx7lIMUh3EwXraxWX/6aXQgS7On2mq2siWyxfKWS6GO93sEVDqFhB7/P358Lpiu/S+2QZNPm0ayu/m02fWI3kxLh+y9b9icoKKN2tLRWZdrbYIpyX3TbJcZOwIDAQAB
-----ENDPUBLICKEY-----
-----BEGINRSAPRIVATEKEY-----
MIIEogIBAAKCAQEAijqbHNPRBmVNQb9KNZu0bPbRW/M/pFOQWoGh4uaPpIsW/LwjTegEBNklw9tuXXeUN4RNheeWaImcHnBxe6gvoYjMBPh2nMCWKhId3ba9JbIjbcRi/O7y6+F6votbqLT05FI25QV4coLeOQyb0NehOdQbah773Q88cJePgLnsoqthGOXmPWv1I/3JyrEf9OqF7JSNvik/2kmoTHHW63uWR/ExQLhOsHx7lIMUh3EwXraxWX/6aXQgS7On2mq2siWyxfKWS6GO93sEVDqFhB7/P358Lpiu/S+2QZNPm0ayu/m02fWI3kxLh+y9b9icoKKN2tLRWZdrbYIpyX3TbJcZOwIDAQABAoIBACm2j9J+NSjJ7yt1D27oAuWTAhDOchkjwn8deX3gd95+vrwcBkdfSb8wzE2zbTW1fTvXqBFNlr0LMdqZshVP5rfHcVHarOiW0Xn2p56do6y5eimIxxpu/U2jaIgRw+JAYVp5WOl54iQkS+1JWcgHGjc6Q9+dZAIMs/+CLSL6eGeJ/vTUzVzcM85InXsjquEh5jTDTo1ADPfWZWnebrWjGWZc2XUeDw0FAaQM8gYWdtMQnNln11YJ+kMcWsfK5j2qnJHvMvUR8gHPH3bPaInUp0Wux/lqwtdWGyMh/Pgcfq1nY8NT3FsmP5TEUEnIWM6Kgq/dPHKXahjkVYkIqoT/93ECgYEA33pnsraA3EbhvWxNnLb3mjkdMH7H3tD6zQxytRnFr7fbGPenaUHX6iLSRoETUuvJO6uYpP/sNAJcMwY/mmNYmD1Z8n3Ct0+WplOshtVnZbsB9CrU33HMnMD4cFmVmQhHBh2UWFPjx08dEND9a3ILOdHOWi1Y1qCJcrlrT2iSrNMCgYEAnlhF6rTjqJC7idddT+T48sk0wvhIRvR51A/88zFb0hDkYMYqkAmV8gixDL1eBYE5s/D447X2kTWEEF2uHqS28JzevBwyp+uaJ2DCMd/MspYaXa8mtwojf3zWJ+LNyasgwkxj4tlB3kMxpjLrDeJe7Uc96I3v5Y5ukVNG1Fo/APkCgYBCoWhRrIB3LNsZczUgyJzCasz9LI/DK2Pbxx5cSLbcUWEN7KkJhQwvTvqK8ukkDBEPrXXxnCx8xUdgHzjPe1dq7L/owP5RUXWFWeVSvkX52uwWNL8LcA6lnhN0zAECg6lJdYBJZZnATyJHZUhpxLL8JkX0NRkLxQm2HvqTzoYM6QKBgGTQkwNSVDg4ng6u/gwmHpKFpIAWD/6NHRv1afl0jZ97fcxXnzXBxKQrAH65+qjKk/CLFgv1CJ1/UywQWRHNkWQ0nGNsGJxtFuLHahzS/sMdaoAHSkDzxZIf60HN13P07pCGjnoaFSPr6CqG9L0MSaAM4c+0vu6K9r60JL6DDuYRAoGAB2YqHtWf1QKetjmn5pQGv8K0GEnLl/KDC+Ko7yWRM3rjxeVGPBv9ioocO+5DE9XlEIUsQct6D6TVzi1SHAk3tNLw0g/HI6f6pbMn7fw+jFSSsVREhSwkpiD59JeNoXKILFQlDaWuL/Jj78tOqnKlbo5PKIanevzOTZykm6ZrrcE=
-----ENDRSAPRIVATEKEY-----
在程序启动后加载制作的dll进行hook,可以使用x64dbg调试的方法,将程序挂起在入口点,打开ProcessHacker,找到进程,点击右键,Miscellaneous->Inject DLL,选择生成的dll即可。注入后继续运行程序,此时应有显示公钥地址的弹窗,说明已找到原公钥,点击“确定”即可成功hook替换为自己的RSA公钥。


Snipaste_2025-08-07_17-20-16.png (38.75 KB, 下载次数: 3)
下载附件
2025-8-13 09:45 上传



Snipaste_2025-08-07_17-26-21.png (67.24 KB, 下载次数: 4)
下载附件
2025-8-13 09:45 上传

总结
1.生成一对2048位的RSA公私钥,制作替换公钥的hook dll,需要hook的函数是libcc.dll中sub_181C190A0。
2.程序启动后中断挂起,注入dll后继续运行。或进行第6步操作。
3.根据文中“许可证密钥生成”一节(或参考教程)选择8字节,进行ECB模式、无填充的DES加密,密钥为 “E9 7F B0 60 77 45 90 AE”,生成8字节。将8字节追加到以0x682A开头的2字节,组成新的10字节。对10字节进行BASE32编码,得到16个字符即为许可证密钥。
4.断网状态下进行手动激活流程。选择RSA-2048位PKCS1填充模式,使用生成的私钥对请求码解密,得到K、DI、P字段的JSON格式字符串。
5.保持原数据内容不变,增加N、O、T字段。提供私钥,选择私钥加密的方式对新字符串加密,得到的密文即为激活码。
6.若激活成功,但仍提示过期则继续本步骤,否则可忽略。制作程序启动器launch,运行程序时以启动器代替原程序。本步骤目的是程序启动时注入替换RSA公钥的hook代码,能实现此目的的方式皆可。
本篇教程的难点是对各种加密算法的分析识别,熟悉密码学的话,破起来会简单点。教程主要针对版本17.1.3,理论上,如果激活逻辑流程不变的话,本文所讲方法是适用的,只不过关键函数地址、密钥值等可能会有变化。
最后关于更新
本文不推荐你一直更新,本来这个教程已经结束,但是出于好奇心我点击了“检查更新”,重启后进入软件你会看到如下界面:


Snipaste_2025-08-12_17-09-34.png (37.31 KB, 下载次数: 4)
下载附件
2025-8-13 09:45 上传

没办法只能尝试launch启动,发现并没有hook到公钥的弹窗。仔细看软件目录,libcc.dll的修改日期发生变化,是连同软件一起更新了,加载公钥的函数地址变化导致不能hook。那么这个时候屏幕前的老铁不要慌,结合之前的分析,对比前后文件,可以找一个公钥碎片字符,在.rdata中搜索,找到后下硬件断点,重新加载程序运行,断点命中后,回溯调用堆栈,可以找出新的函数地址。然后修改hook代码中的函数RVA(V17.1.3对应0x1C190A0,V17.3.2对应0x215B240),制作对应版本的dll。本来以为再次launch启动后还要重新激活,但是不用,现在最新版本已经可用了。还好成功,万一这方法不可行,那么连我都要慌了... 不过这次也证明了教程方法的可用性。如果以后想继续更新软件,那么就要冒此方法失效的风险。若不想更新,也可直接修改本机的hosts文件。


Snipaste_2025-08-12_17-34-39.png (87.08 KB, 下载次数: 2)
下载附件
2025-8-13 09:45 上传

教程仅作技术交流,最后支持使用正版软件。
参考
https://www.52pojie.cn/thread-688820-1-1.html
https://github.com/TsudaKageyu/minhook
https://blog.csdn.net/qq_42468226/article/details/128407995 (MinHook介绍|文档|例子)

公钥, 字节

m_h   

文中密钥 和工具 dll       能解密 加密后 离线激活.成功
软件提供解密后
{"K":"NAVMIKCHCWNIHS3Q", "DI":"2048151B071C3FD721B4", "P":"WIN"}
楼主得出 以及 T 来自 AI解答
{
  "K": "NAVMIKCHCWNIHS3Q",
  "N": "52POJIE",
  "O": "52POJIE.CN",
  "T": 1755217200,
  "DI": "2048151B071C3FD721B4",
  "P": "WIN"
}
加密后结果
VT6IgcykKoD8J0FbUsgRlT87e9JuOd96LzEmnQ6KJpE2hNVvODpqoMzQi9tfJJxSJ+pMx1MJurw5Z8IJciqaVp9jP3F+1jG1dDGhnRxoQr9SpNDgqgoroL/cJdr+2zZ/6uQSEIBCAukSWDcPNxyYy8NDq6N6xWa1AO+Xjot7oQ4wvmkkeVbZykQ5S5sc+Mk7n8D5QBUx81oXCPqBrReMju/ROj0EC68W/ncWFDJxkY3dQDcyO0rb71lyveBbMbGHJ7qfPW5RfyatoblfFQskhJGp+5CwaephUqMgRoYcNnwLzvOTWg7b3R/ot+5XBqqP4L9dfHPFeChvsJrsHl2aYQ==
好吧我马虎了  T 是时间。
(V17.1.3对应0x1C190A0,V17.3.2对应0x215B240) 我把dll改成 215B240 启动navicat.exe 17.3.2.0 直接报错。
[i]
搞定了。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部