Update RLIdentity.cpp
This commit is contained in:
parent
55229222f7
commit
528f864177
112
RLIdentity.cpp
112
RLIdentity.cpp
@ -1,5 +1,5 @@
|
|||||||
// RLIdentity.cpp
|
// RLIdentity.cpp - v2.0.0 Bulletproof
|
||||||
// 1:1 Proven logic with ALL-SAFE JSON parsing (no dynamic allocations).
|
// 1:1 Proven logic with ALL-SAFE JSON parsing and Network Broadcast spoofing.
|
||||||
|
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <MinHook.h>
|
#include <MinHook.h>
|
||||||
@ -12,22 +12,8 @@
|
|||||||
#pragma comment(lib, "shell32.lib")
|
#pragma comment(lib, "shell32.lib")
|
||||||
|
|
||||||
static char g_SpoofedName[256] = "Player";
|
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() {
|
void LoadConfig() {
|
||||||
char path[MAX_PATH];
|
char path[MAX_PATH];
|
||||||
if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, 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**);
|
typedef int(__stdcall* CopyUserInfo_t)(void*, void*, void**);
|
||||||
static CopyUserInfo_t oEOS_UserInfo_CopyUserInfo = nullptr;
|
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) {
|
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);
|
int res = oEOS_UserInfo_CopyUserInfo(p1, p2, p3);
|
||||||
|
|
||||||
if (res == 0 && p2 && p3 && *p3) {
|
if (res == 0 && p3 && *p3) {
|
||||||
void** options = (void**)p2;
|
|
||||||
if (options[1] == options[2]) { // If targeting our own info
|
|
||||||
char** s = (char**)*p3;
|
char** s = (char**)*p3;
|
||||||
__try {
|
__try {
|
||||||
// Offset 24: DisplayName, Offset 40: Nickname
|
// Overwriting pointers directly at the SDK struct offsets
|
||||||
if (s[3]) s[3] = g_SpoofedName;
|
if (s[3]) s[3] = g_SpoofedName; // DisplayName
|
||||||
if (s[5]) s[5] = g_SpoofedName;
|
if (s[5]) s[5] = g_SpoofedName; // Nickname
|
||||||
} __except (EXCEPTION_EXECUTE_HANDLER) {}
|
} __except (EXCEPTION_EXECUTE_HANDLER) {}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return res;
|
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) {
|
DWORD WINAPI HookThread(LPVOID lpParam) {
|
||||||
ClearLog();
|
|
||||||
LoadConfig();
|
LoadConfig();
|
||||||
|
|
||||||
if (MH_Initialize() == MH_OK) {
|
if (MH_Initialize() == MH_OK) {
|
||||||
HMODULE h = NULL;
|
HMODULE h = NULL;
|
||||||
|
// Wait for EOS DLL (standard for RL)
|
||||||
for (int i = 0; i < 100; i++) {
|
for (int i = 0; i < 100; i++) {
|
||||||
h = GetModuleHandleA("EOSSDK-Win64-Shipping.dll");
|
h = GetModuleHandleA("EOSSDK-Win64-Shipping.dll");
|
||||||
if (h) break;
|
if (h) break;
|
||||||
Sleep(100);
|
Sleep(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (h) {
|
if (h) {
|
||||||
|
// Hook 1: Local Visibility
|
||||||
LPVOID f1 = (LPVOID)GetProcAddress(h, "EOS_UserInfo_CopyUserInfo");
|
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);
|
MH_EnableHook(f1);
|
||||||
}
|
}
|
||||||
|
|
||||||
LPVOID f2 = (LPVOID)GetProcAddress(h, "EOS_EpicAccountId_ToString");
|
// Hook 2: Network Broadcast / Offline Revert fix
|
||||||
if (f2 && MH_CreateHook(f2, (LPVOID)&hkEOS_EpicAccountId_ToString, (LPVOID*)&oEOS_EpicAccountId_ToString) == MH_OK) {
|
LPVOID f2 = (LPVOID)GetProcAddress(h, "EOS_Connect_GetExternalAccountMapping");
|
||||||
|
if (f2) {
|
||||||
|
MH_CreateHook(f2, (LPVOID)&hkEOS_Connect_GetExternalAccountMapping, (LPVOID*)&oEOS_Connect_GetExternalAccountMapping);
|
||||||
MH_EnableHook(f2);
|
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;
|
return 0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user