rodecomp/Source/Security/NProtectGameGuardMgr.cpp
ragnarok-clanker 7abdc11c4d Maintenance: Remove empty anonymous namespace blocks (no declarations, stray // INLINED markers only); no code change
Batch #18581 by ragnarok-clanker: forced by an admin (0 lower score(s), 0 changed function(s)); checked with 6 compiled unit(s).
2026-11-12 16:18:21 +00:00

238 lines
6.4 KiB
C++

#include "Security/NProtectGameGuardMgr.h"
#include "Security/NProtectGameMon.h"
#include "Client/Application/ApplicationWindow.h"
#include "Client/Application/Launcher.h"
#include "Client/Mode/CGameMode.h"
#include "Client/Session/Session.h"
#include "Contents/Configuration/ServiceConfiguration.h"
#include "Contents/Tables/MessageTable.h"
#include "Utility/Cipher/XorBytes.h"
#include "Utility/Text/FormatString.h"
#include "Utility/Threading/NSyncObject.h"
#include "Utility/Cipher/LocalEncryptedName.h"
#include "Utility/Cipher/CryptName.h"
#include "Utility/Cipher/Obfuscate.h"
#include "Resource/MSGSTRINGID.h"
#include <array>
#include <cstdint>
#include <cstring>
#include <new>
#include <string>
// GLOBAL: gl_24848
CNProtectGameGuardMgr* g_nProtectGameGuardMgr;
// STRING: st_16836
static const char g_devClientTag[] = "Dev";
// STRING: st_02591
static const char g_nprotectSource[] =
"C:\\repositories\\RagnarokClient\\RagnarokClient\\Security Solution\\nProtectGameGuard\\CNProtectGameGuardMgr.cpp";
class CNPGameLib {
public:
// INLINED
explicit CNPGameLib(const char* gameName) {
PreInitNPGameMonA(gameName);
}
// INLINED
int Init() {
return InitNPGameMon();
}
};
// OFFSET: 0x0076C3E0
// FUNCTION: fn_45544
CNProtectGameGuardMgr::~CNProtectGameGuardMgr() {
void* gameLib = this->m_gameLib;
if (gameLib) {
CloseNPGameMon();
::operator delete(gameLib, 1);
this->m_gameLib = nullptr;
}
DeleteCriticalSection(&this->m_lock);
}
// OFFSET: 0x0076C670
// FUNCTION: fn_08205
void CNProtectGameGuardMgr::ProcessAuth(int, int) {
}
// OFFSET: 0x0076C6E0
// FUNCTION: fn_08207
void CNProtectGameGuardMgr::Stop() {
}
// OFFSET: 0x0076C930
// FUNCTION: fn_08208
void CNProtectGameGuardMgr::Tick() {
}
// OFFSET: 0x0076CD60
// FUNCTION: fn_08210
int CNProtectGameGuardMgr::Create() {
return 1;
}
// OFFSET: 0x0076CEA0
// FUNCTION: fn_08212
void CNProtectGameGuardMgr::Destroy() {
if (g_nProtectGameGuardMgr) {
delete g_nProtectGameGuardMgr;
g_nProtectGameGuardMgr = nullptr;
}
}
// OFFSET: 0x0076CEC0
// FUNCTION: fn_08213
int CNProtectGameGuardMgr::HasError() {
return 0;
}
// OFFSET: 0x0076CF30
// FUNCTION: fn_08215
std::string CNProtectGameGuardMgr::ErrorMessage() {
NSyncObject lock(&this->m_lock);
return this->m_errorMessage;
}
// OFFSET: 0x0076CFB0
// FUNCTION: fn_08216
const char* CNProtectGameGuardMgr::GameName() {
switch (g_serviceType) {
case 3: {
return OBFUSCATE_TEXT("ROCN", 0x7321C3814F8799E1ULL);
}
case 0:
if (std::strstr(g_session.clientVersion, g_devClientTag) != nullptr) {
return OBFUSCATE_TEXT("RagnarokKR", 0x7941D76335CFA14FULL);
} else {
return OBFUSCATE_TEXT("RagnarokKR", 0x0F15B16B5BAFD57FULL);
}
case 2: {
return OBFUSCATE_TEXT("RagnarokJP", 0x7DE349D717D7F123ULL);
}
case 12: {
return OBFUSCATE_TEXT("RagnarokBR", 0x9FED7DA189490D5DULL);
}
case 7: {
return OBFUSCATE_TEXT("RagnarokPH", 0x452FEF0D7FC95565ULL);
}
case 4: {
return OBFUSCATE_TEXT("ROTW", 0xF3CB6F7711A71B6DULL);
}
default: {
return OBFUSCATE_TEXT("Ragnarok", 0x839B27DF8F5967B3ULL);
}
}
}
// OFFSET: 0x0076D8A0
// FUNCTION: fn_08217
void CNProtectGameGuardMgr::SetHwnd(HWND) {
}
// OFFSET: 0x0076DF40
// FUNCTION: fn_08220
void CNProtectGameGuardMgr::IncrementCounter() {
}
// OFFSET: 0x0076DFA0
// FUNCTION: fn_08221
void CNProtectGameGuardMgr::SetError(const char*, int, std::string message) {
NSyncObject lock(&this->m_lock);
if (!this->m_hasError) {
this->m_hasError = true;
this->m_errorMessage = message;
}
}
// OFFSET: 0x0076E040
// FUNCTION: fn_08222
void CNProtectGameGuardMgr::Send(const char*) {
}
// OFFSET: 0x0076D910
// FUNCTION: fn_08219
int __stdcall GameGuardCallback(int code, const int* packet) {
switch (code) {
case 0x3F3: {
CNProtectGameGuardMgr* manager = g_nProtectGameGuardMgr;
manager->SetError(g_nprotectSource, 0x136, std::string(FormatString(
[]() {
return OBFUSCATE_TEXT("%s(%d)", 0x0F41EBBDA32D1B17ULL);
}(), LookupMessage(MSI_SPEEDHACK_DETECT), code)));
return 0;
}
case 0x3E9:
case 0x3EA: {
CNProtectGameGuardMgr* manager = g_nProtectGameGuardMgr;
manager->SetError(g_nprotectSource, 0x13B, std::string(FormatString(OBFUSCATE_TEXT("unknown(%d)", 0x2D51E3B7236175EDULL), code)));
return 0;
}
case 0x3F6: {
CNProtectGameGuardMgr* manager = g_nProtectGameGuardMgr;
manager->SetError(g_nprotectSource, 0x13F, std::string(FormatString(
[]() {
return OBFUSCATE_TEXT("%s(%d)", 0x176F138D5DD7F365ULL);
}(), LookupMessage(MSI_INIT_ERROR), code)));
return 0;
}
case 0x3F4:
case 0x3F5: {
CNProtectGameGuardMgr* manager = g_nProtectGameGuardMgr;
manager->SetError(g_nprotectSource, 0x14B, std::string(LookupMessage(MSI_USA_PERSONALINFO_DROP)));
return 0;
}
case 0x3F7: {
CNProtectGameGuardMgr* manager = g_nProtectGameGuardMgr;
manager->SetError(g_nprotectSource, 0x151, std::string(FormatString(
[]() {
return OBFUSCATE_TEXT("%s(%d)", 0xFBD599E117C547C1ULL);
}(), LookupMessage(MSI_GAMEHACK_DOUBT), code)));
return 0;
}
case 0x3FB: {
CNProtectGameGuardMgr* manager = g_nProtectGameGuardMgr;
const unsigned char* data = reinterpret_cast<const unsigned char*>(packet + 2);
CNProtectGameGuardMgr::lcCSAuthToken token(packet[0], std::vector<unsigned char>(data, data + packet[1]));
NSyncObject lock(&manager->m_lock);
manager->m_tokens.push_back(token);
break;
}
default:
break;
}
return 1;
}
// OFFSET: 0x0076C9D0
// FUNCTION: fn_08209
bool CNProtectGameGuardMgr::Initialize() {
CNPGameLib* gameLib = new (std::nothrow) CNPGameLib(GameName());
this->m_gameLib = gameLib;
if (gameLib == nullptr) {
return false;
}
const int status = gameLib->Init();
if (status != 0x755) {
char message[0x400] = {};
StringFormat(message, sizeof(message), static_cast<std::size_t>(-1), OBFUSCATE_ARRAY_TEXT("GameGuard Error: %lu", 0xCFF3899D95AF355FULL, char), status);
char title[0x100] = {};
StringFormat(title, sizeof(title), static_cast<std::size_t>(-1), OBFUSCATE_ARRAY_TEXT("GameGuard Error : %lu", 0xE52DF30DCBAF7125ULL, char), status);
if (std::strstr(g_commandLine, OBFUSCATE_ARRAY_TEXT("ApplyNPGE", 0x4F99DF03C3EF31B7ULL, char)) == nullptr) {
MessageBoxA(hWnd, message, title, 0);
return false;
}
WriteMyLog(g_nprotectSource, 0x284, title);
}
SetCallbackToGameMon(GameGuardCallback);
return true;
}