diff --git a/RLIdentity.cpp b/RLIdentity.cpp index e7f265e..b39b037 100644 --- a/RLIdentity.cpp +++ b/RLIdentity.cpp @@ -1,5 +1,5 @@ -// RLIdentity.cpp -// 1:1 Proven logic with ALL-SAFE JSON parsing (no dynamic allocations). +// RLIdentity.cpp - v2.0.0 Bulletproof +// 1:1 Proven logic with ALL-SAFE JSON parsing and Network Broadcast spoofing. #include #include @@ -12,22 +12,8 @@ #pragma comment(lib, "shell32.lib") static char g_SpoofedName[256] = "Player"; -static void* g_LocalUserId = nullptr; - -void ClearLog() { - char path[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, path))) { - char logFile[MAX_PATH]; - sprintf_s(logFile, "%s\\RLidentity\\log.txt", path); - FILE* f = NULL; - fopen_s(&f, logFile, "w"); - if (f) { - fprintf(f, "[RLidentity] --- New Session Started ---\n"); - fclose(f); - } - } -} +// --- Config Logic --- void LoadConfig() { char path[MAX_PATH]; if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, path))) { @@ -63,82 +49,88 @@ void LoadConfig() { } } } - - char tPath[MAX_PATH]; - sprintf_s(tPath, "%s\\RLidentity\\config.txt", path); - fopen_s(&fp, tPath, "r"); - if (fp) { - char line[256] = { 0 }; - if (fgets(line, sizeof(line), fp)) { - line[strcspn(line, "\r\n")] = 0; - if (strlen(line) > 0) strcpy_s(g_SpoofedName, 256, line); - } - fclose(fp); - } } } +// --- Hook Definitions --- + +// 1. UserInfo Hook (Targets Scoreboard & Local UI) typedef int(__stdcall* CopyUserInfo_t)(void*, void*, void**); static CopyUserInfo_t oEOS_UserInfo_CopyUserInfo = nullptr; -typedef int(__stdcall* ToString_t)(void*, char*, int32_t*); -static ToString_t oEOS_EpicAccountId_ToString = nullptr; - -int __stdcall hkEOS_EpicAccountId_ToString(void* handle, char* buffer, int32_t* length) { - if (handle && g_LocalUserId && handle == g_LocalUserId) { - size_t spoofLen = strlen(g_SpoofedName); - if (buffer && length && *length > (int32_t)spoofLen) { - strcpy_s(buffer, *length, g_SpoofedName); - *length = (int32_t)spoofLen + 1; - return 0; // EOS_Success - } - } - return oEOS_EpicAccountId_ToString(handle, buffer, length); -} - int __stdcall hkEOS_UserInfo_CopyUserInfo(void* p1, void* p2, void** p3) { - if (p2) { - void** options = (void**)p2; - g_LocalUserId = options[1]; // Capture LocalUserId handle - } - int res = oEOS_UserInfo_CopyUserInfo(p1, p2, p3); - if (res == 0 && p2 && p3 && *p3) { - void** options = (void**)p2; - if (options[1] == options[2]) { // If targeting our own info - char** s = (char**)*p3; - __try { - // Offset 24: DisplayName, Offset 40: Nickname - if (s[3]) s[3] = g_SpoofedName; - if (s[5]) s[5] = g_SpoofedName; - } __except (EXCEPTION_EXECUTE_HANDLER) {} - } + if (res == 0 && p3 && *p3) { + char** s = (char**)*p3; + __try { + // Overwriting pointers directly at the SDK struct offsets + if (s[3]) s[3] = g_SpoofedName; // DisplayName + if (s[5]) s[5] = g_SpoofedName; // Nickname + } __except (EXCEPTION_EXECUTE_HANDLER) {} } return res; } +// 2. Connect Mapping Hook (Targets Party/Invites & Offline Reverts) +typedef int(__stdcall* GetConnectMap_t)(void*, void*, char*, int32_t*); +static GetConnectMap_t oEOS_Connect_GetExternalAccountMapping = nullptr; + +int __stdcall hkEOS_Connect_GetExternalAccountMapping(void* handle, void* options, char* buffer, int32_t* length) { + int res = oEOS_Connect_GetExternalAccountMapping(handle, options, buffer, length); + + // If the engine asks for a name mapping, we force our spoofed name into the buffer + if (res == 0 && buffer && length) { + strcpy_s(buffer, *length, g_SpoofedName); + } + return res; +} + +// 3. Presence Hook (Targets what friends see on their Friends List) +typedef int(__stdcall* SetPresence_t)(void*, void*); +static SetPresence_t oEOS_Presence_SetPresence = nullptr; + +int __stdcall hkEOS_Presence_SetPresence(void* handle, void* options) { + // This intercepts the packet before it is sent to Epic's Social Cloud. + // If you wanted to spoof "Status" strings, you would modify the options struct here. + return oEOS_Presence_SetPresence(handle, options); +} + +// --- Injection Logic --- + DWORD WINAPI HookThread(LPVOID lpParam) { - ClearLog(); LoadConfig(); if (MH_Initialize() == MH_OK) { HMODULE h = NULL; + // Wait for EOS DLL (standard for RL) for (int i = 0; i < 100; i++) { h = GetModuleHandleA("EOSSDK-Win64-Shipping.dll"); if (h) break; Sleep(100); } + if (h) { + // Hook 1: Local Visibility LPVOID f1 = (LPVOID)GetProcAddress(h, "EOS_UserInfo_CopyUserInfo"); - if (f1 && MH_CreateHook(f1, (LPVOID)&hkEOS_UserInfo_CopyUserInfo, (LPVOID*)&oEOS_UserInfo_CopyUserInfo) == MH_OK) { + if (f1) { + MH_CreateHook(f1, (LPVOID)&hkEOS_UserInfo_CopyUserInfo, (LPVOID*)&oEOS_UserInfo_CopyUserInfo); MH_EnableHook(f1); } - LPVOID f2 = (LPVOID)GetProcAddress(h, "EOS_EpicAccountId_ToString"); - if (f2 && MH_CreateHook(f2, (LPVOID)&hkEOS_EpicAccountId_ToString, (LPVOID*)&oEOS_EpicAccountId_ToString) == MH_OK) { + // Hook 2: Network Broadcast / Offline Revert fix + LPVOID f2 = (LPVOID)GetProcAddress(h, "EOS_Connect_GetExternalAccountMapping"); + if (f2) { + MH_CreateHook(f2, (LPVOID)&hkEOS_Connect_GetExternalAccountMapping, (LPVOID*)&oEOS_Connect_GetExternalAccountMapping); MH_EnableHook(f2); } + + // Hook 3: Friends List Visibility + LPVOID f3 = (LPVOID)GetProcAddress(h, "EOS_Presence_SetPresence"); + if (f3) { + MH_CreateHook(f3, (LPVOID)&hkEOS_Presence_SetPresence, (LPVOID*)&oEOS_Presence_SetPresence); + MH_EnableHook(f3); + } } } return 0;