12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #include "PatchSolutions.hpp"
- #undef NKG_CURRENT_SOURCE_FILE
- #undef NKG_CURRENT_SOURCE_LINE
- #define NKG_CURRENT_SOURCE_FILE() TEXT(".\\navicat-patcher\\PatchSolution4-generic.cpp")
- #define NKG_CURRENT_SOURCE_LINE() __LINE__
- namespace nkg {
- bool PatchSolution4::CheckKey(const RSACipher& Cipher) const noexcept {
- auto szPublicKey = Cipher.ExportKeyString<RSAKeyType::PublicKey, RSAKeyFormat::PEM>();
- for (auto pos = szPublicKey.find("-----BEGIN PUBLIC KEY-----"); pos != std::string::npos; pos = szPublicKey.find("-----BEGIN PUBLIC KEY-----", pos)) {
- szPublicKey.erase(pos, literal_length("-----BEGIN PUBLIC KEY-----"));
- }
- for (auto pos = szPublicKey.find("-----END PUBLIC KEY-----"); pos != std::string::npos; pos = szPublicKey.find("-----END PUBLIC KEY-----", pos)) {
- szPublicKey.erase(pos, literal_length("-----END PUBLIC KEY-----"));
- }
- for (auto pos = szPublicKey.find("\n"); pos != std::string::npos; pos = szPublicKey.find("\n", pos)) {
- szPublicKey.erase(pos, literal_length("\n"));
- }
- return szPublicKey.length() == 0x188;
- }
- void PatchSolution4::MakePatch(const RSACipher& Cipher) const {
- if (_pbPatchMachineCode == nullptr || _pbPatchNewPublicKey == nullptr || _NewMachineCode.empty()) {
- throw Exception(NKG_CURRENT_SOURCE_FILE(), NKG_CURRENT_SOURCE_LINE(), TEXT("PatchSolution4 has not been ready yet."));
- }
- auto szPublicKey = Cipher.ExportKeyString<RSAKeyType::PublicKey, RSAKeyFormat::PEM>();
- for (auto pos = szPublicKey.find("-----BEGIN PUBLIC KEY-----"); pos != std::string::npos; pos = szPublicKey.find("-----BEGIN PUBLIC KEY-----", pos)) {
- szPublicKey.erase(pos, literal_length("-----BEGIN PUBLIC KEY-----"));
- }
- for (auto pos = szPublicKey.find("-----END PUBLIC KEY-----"); pos != std::string::npos; pos = szPublicKey.find("-----END PUBLIC KEY-----", pos)) {
- szPublicKey.erase(pos, literal_length("-----END PUBLIC KEY-----"));
- }
- for (auto pos = szPublicKey.find("\n"); pos != std::string::npos; pos = szPublicKey.find("\n", pos)) {
- szPublicKey.erase(pos, literal_length("\n"));
- }
- _putts(TEXT("*******************************************************"));
- _putts(TEXT("* PatchSolution4 *"));
- _putts(TEXT("*******************************************************"));
- LOG_HINT(0, "Previous:");
- PrintMemory(_pbPatchMachineCode, _NewMachineCode.size(), _Image.ImageBase());
- memcpy(_pbPatchMachineCode, _NewMachineCode.data(), _NewMachineCode.size());
- LOG_HINT(0, "After:");
- PrintMemory(_pbPatchMachineCode, _NewMachineCode.size(), _Image.ImageBase());
- _putts(TEXT(""));
- LOG_HINT(0, "Previous:");
- PrintMemory(_pbPatchNewPublicKey, szPublicKey.size(), _Image.ImageBase());
- memcpy(_pbPatchNewPublicKey, szPublicKey.data(), szPublicKey.size());
- LOG_HINT(0, "After:");
- PrintMemory(_pbPatchNewPublicKey, szPublicKey.size(), _Image.ImageBase());
- _putts(TEXT(""));
- }
- }
|