diff --git a/common/resource_wrapper.hpp b/common/resource_wrapper.hpp index 3a52994..9181c67 100644 --- a/common/resource_wrapper.hpp +++ b/common/resource_wrapper.hpp @@ -67,13 +67,13 @@ namespace nkg { return *this; } - template>> + template, ptr_t> = nullptr> [[nodiscard]] - handle_t operator->() const noexcept { + ptr_t operator->() const noexcept { return m_handle; } - template>> + template [[nodiscard]] as_t as() const noexcept { return reinterpret_cast(m_handle); @@ -165,13 +165,13 @@ namespace nkg { return *this; } - template>> + template, ptr_t> = nullptr> [[nodiscard]] - handle_t operator->() const noexcept { + ptr_t operator->() const noexcept { return m_handle; } - template>> + template [[nodiscard]] as_t as() const noexcept { return reinterpret_cast(m_handle); diff --git a/navicat-keygen/wmain.cpp b/navicat-keygen/wmain.cpp index ba14e3c..5b85d73 100644 --- a/navicat-keygen/wmain.cpp +++ b/navicat-keygen/wmain.cpp @@ -36,13 +36,13 @@ static void help() { _putws(L""); _putws(L" <-bin|-text> Specify \"-bin\" to generate \"license_file\" used by Navicat 11."); _putws(L" Specify \"-text\" to generate base64-encoded activation code."); - _putws(L" This parameter must be specified."); + _putws(L" This parameter is mandatory."); _putws(L""); _putws(L" [-adv] Enable advance mode."); _putws(L" This parameter is optional."); _putws(L""); _putws(L" A path to an RSA-2048 private key file."); - _putws(L" This parameter must be specified."); + _putws(L" This parameter is mandatory."); _putws(L""); _putws(L"Example:"); _putws(L" navicat-keygen.exe -text .\\RegPrivateKey.pem"); @@ -64,15 +64,13 @@ int wmain(int argc, wchar_t* argv[]) { return -1; } - if (argc == 4) { - if (_wcsicmp(argv[2], L"-adv") == 0) { - lpfnCollectInformation = nkg::CollectInformationAdvanced; - } else { - help(); - return -1; - } - } else { + if (argc == 3) { lpfnCollectInformation = nkg::CollectInformationNormal; + } else if (argc == 4 && _wcsicmp(argv[2], L"-adv") == 0) { + lpfnCollectInformation = nkg::CollectInformationAdvanced; + } else { + help(); + return -1; } try { @@ -80,12 +78,11 @@ int wmain(int argc, wchar_t* argv[]) { cipher.import_private_key_file(nkg::cp_converter<-1, CP_UTF8>::convert(argv[argc - 1])); if (cipher.bits() != 2048) { - throw nkg::exception(NKG_CURRENT_SOURCE_FILE(), NKG_CURRENT_SOURCE_LINE(), u8"RSA key length mismatches.") + throw nkg::exception(NKG_CURRENT_SOURCE_FILE(), NKG_CURRENT_SOURCE_LINE(), u8"RSA key length != 2048 bits.") .push_hint(u8"You must provide an RSA key whose modulus length is 2048 bits."); } auto sn_generator = lpfnCollectInformation(); - sn_generator.generate(); _putws(L"[*] Serial number:"); diff --git a/navicat-patcher/wmain.cpp b/navicat-patcher/wmain.cpp index 345460a..c932d4a 100644 --- a/navicat-patcher/wmain.cpp +++ b/navicat-patcher/wmain.cpp @@ -34,21 +34,21 @@ void welcome() { void help() { - _putws(L"usage:"); + _putws(L"Usage:"); _putws(L" navicat-patcher.exe [-dry-run] [RSA-2048 PEM File Path]"); _putws(L""); _putws(L" [-dry-run] Run patcher without applying any patches."); _putws(L" This parameter is optional."); _putws(L""); - _putws(L" The folder path where Navicat is installed."); - _putws(L" This parameter must be specified."); + _putws(L" Path to a directory where Navicat is installed."); + _putws(L" This parameter is mandatory."); _putws(L""); - _putws(L" [RSA-2048 PEM File Path] The path to an RSA-2048 private key file."); - _putws(L" This parameter is optional."); + _putws(L" [RSA-2048 PEM File Path] Path to an RSA-2048 private key file."); _putws(L" If not specified, an RSA-2048 private key file"); - _putws(L" named \"RegPrivateKey.pem\" will be generated."); + _putws(L" named \"RegPrivateKey.pem\" will be generated."); + _putws(L" This parameter is optional."); _putws(L""); - _putws(L"example:"); + _putws(L"Example:"); _putws(L" navicat-patcher.exe \"C:\\Program Files\\PremiumSoft\\Navicat Premium 12\""); _putws(L""); } @@ -109,7 +109,12 @@ void load_rsa_privkey(nkg::rsa_cipher& cipher, std::filesystem::path& rsa_privke } while (solution0 && !solution0->check_rsa_privkey(cipher)); // re-generate RSA key if one of `check_rsa_privkey` returns false } - wprintf_s(L"[*] Your RSA private key:\n%s", nkg::cp_converter::convert(cipher.export_private_key_string()).c_str()); + wprintf_s(L"[*] Your RSA private key:\n%s\n", nkg::cp_converter::convert(cipher.export_private_key_string()).c_str()); +} + +template +bool all_patch_solutions_are_suppressed(args_t&&... args) { + return (!args.is_valid() && ...); } void detect_backup(const std::filesystem::path& file_path) { @@ -174,9 +179,7 @@ int wmain(int argc, wchar_t* argv[]) { nkg::resource_wrapper solution0{ nkg::resource_traits::cxx_object_traits{} }; - // - // Open libcc.dll - // + // open libcc.dll libcc_handle.set(CreateFileW(libcc_filepath.native().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)); if (libcc_handle.is_valid()) { wprintf_s(L"[+] Try to open libcc.dll ... OK!\n"); @@ -206,67 +209,55 @@ int wmain(int argc, wchar_t* argv[]) { _putws(L""); - // - // find patch - // - if (!solution0->find_patch()) { - solution0.release(); + // find patch and decide which solution will be applied + if (solution0.is_valid()) { + auto patch_found = solution0->find_patch(); + _putws(L""); + + if (!patch_found) { + solution0.release(); + } } - _putws(L""); - - // - // decide which solutions will be applied - // select_patch_solutions(solution0); - if (!solution0.is_valid()) { - throw nkg::exception(NKG_CURRENT_SOURCE_FILE(), NKG_CURRENT_SOURCE_LINE(), u8"No patch solution is ready. Patch abort!") + if (all_patch_solutions_are_suppressed(solution0)) { + throw nkg::exception(NKG_CURRENT_SOURCE_FILE(), NKG_CURRENT_SOURCE_LINE(), u8"All patch solutions are suppressed. Patch abort!") .push_hint(u8"Are you sure your navicat has not been patched/modified before?"); } - // // load key - // load_rsa_privkey(cipher, rsa_privkey_filepath, solution0.get()); - _putws(L""); - + // apply patch solutions if (dry_run) { _putws(L"*******************************************************"); _putws(L"* DRY-RUN MODE ENABLE! *"); _putws(L"* NO PATCH WILL BE APPLIED! *"); _putws(L"*******************************************************"); } else { - // // save private key if not given - // if (rsa_privkey_filepath.empty()) { cipher.export_private_key_file(u8"RegPrivateKey.pem"); } - // // detecting backups - // if (solution0.is_valid()) { detect_backup(libcc_filepath); } - // // make backup - // if (solution0.is_valid()) { make_backup(libcc_filepath); } - // // make patch // no way to go back from here :-) - // if (solution0.is_valid()) { solution0->make_patch(cipher); } + // print new key file path if (rsa_privkey_filepath.empty()) { wprintf_s(L"[*] New RSA-2048 private key has been saved to\n"); wprintf_s(L" %s\n", (std::filesystem::current_path() / L"RegPrivateKey.pem").c_str()); @@ -274,7 +265,6 @@ int wmain(int argc, wchar_t* argv[]) { } _putws(L""); - _putws(L"*******************************************************"); _putws(L"* PATCH HAS BEEN DONE SUCCESSFULLY! *"); _putws(L"* HAVE FUN AND ENJOY~ *");