Skip to content

Commit 708ceea

Browse files
author
nta
committed
fix(ros): sessionKey offset for RGL signin
SC SDK 2.2.6.9 moved the sessionKey field down a bit, for the first time in a long time. This'd break automatic signin from the RGL in an unusual way (sessionKey would be read as a buffer of NULLs, leading to requests failing). Ideally this'd be paired with an assertion or obtained from a pattern scan somewhere, but for this commit, these offsets have just been factored out in `constexpr`s.
1 parent 6010dc4 commit 708ceea

1 file changed

Lines changed: 20 additions & 13 deletions

File tree

code/components/ros-patches-five/src/AccountID.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@
3838

3939
#include "CfxReleaseInfo.h"
4040

41+
constexpr const auto kROSBlobEmailOffset = 8;
42+
constexpr const auto kROSBlobTicketOffset = 2800;
43+
constexpr const auto kROSBlobSessionTicketOffset = 3312;
44+
constexpr const auto kROSBlobAccountIdOffset = 3816;
45+
constexpr const auto kROSBlobUsernameOffset = 3743;
46+
constexpr const auto kROSBlobSessionKeyOffset = 4360;
47+
4148
template<typename... Ts>
4249
static auto PostAutoLogin(Ts&&... args)
4350
{
@@ -152,7 +159,7 @@ std::string GetROSEmail()
152159
}
153160

154161
auto accountBlob = blob->data;
155-
return (const char*)&accountBlob[8];
162+
return (const char*)&accountBlob[kROSBlobEmailOffset];
156163
}
157164

158165
#if defined(IS_RDR3) || defined(GTA_FIVE) || defined(GTA_NY)
@@ -226,10 +233,10 @@ bool GetMTLSessionInfo(std::string& ticket, std::string& sessionTicket, std::arr
226233
}
227234
}
228235

229-
ticket = std::string((const char*)&accountBlob[2800]);
230-
sessionTicket = std::string((const char*)&accountBlob[3312]);
231-
memcpy(sessionKey.data(), &accountBlob[0x10D8], sessionKey.size());
232-
accountId = *(uint64_t*)&accountBlob[3816];
236+
ticket = std::string((const char*)&accountBlob[kROSBlobTicketOffset]);
237+
sessionTicket = std::string((const char*)&accountBlob[kROSBlobSessionTicketOffset]);
238+
memcpy(sessionKey.data(), &accountBlob[kROSBlobSessionKeyOffset], sessionKey.size());
239+
accountId = *(uint64_t*)&accountBlob[kROSBlobAccountIdOffset];
233240

234241
return true;
235242
}
@@ -261,7 +268,7 @@ static bool InitAccountSteam()
261268
if (blob->valid)
262269
{
263270
accountBlob = blob->data;
264-
trace("External ROS says it's signed in: %s\n", (const char*)&accountBlob[8]);
271+
trace("External ROS says it's signed in: %s\n", (const char*)&accountBlob[kROSBlobEmailOffset]);
265272
}
266273

267274
return blob->valid;
@@ -297,7 +304,7 @@ static bool InitAccountEOS()
297304
if (blob->valid)
298305
{
299306
accountBlob = blob->data;
300-
trace("Epic ROS says it's signed in: %s\n", (const char*)&accountBlob[8]);
307+
trace("Epic ROS says it's signed in: %s\n", (const char*)&accountBlob[kROSBlobEmailOffset]);
301308
}
302309

303310
return blob->valid;
@@ -791,7 +798,7 @@ void ValidateEpic(int parentPid)
791798
*(uint64_t*)&blob->data[3816] = j.value("RockstarId", uint64_t(0));
792799
strcpy((char*)&blob->data[2800], j.value("Ticket", "").c_str());
793800
strcpy((char*)&blob->data[3312], tree.get<std::string>("Response.SessionTicket").c_str());
794-
memcpy(&blob->data[0x10D8], sessionKey.data(), sessionKey.size());
801+
memcpy(&blob->data[kROSBlobSessionKeyOffset], sessionKey.data(), sessionKey.size());
795802
strcpy((char*)&blob->data[8], j.value("Email", "").c_str());
796803
strcpy((char*)&blob->data[0xE9F], j.value("Nickname", "").c_str());
797804

@@ -965,7 +972,7 @@ void ValidateSteam(int parentPid)
965972
*(uint64_t*)&blob->data[3816] = j.value("RockstarId", uint64_t(0));
966973
strcpy((char*)&blob->data[2800], j.value("Ticket", "").c_str());
967974
strcpy((char*)&blob->data[3312], tree.get<std::string>("Response.SessionTicket").c_str());
968-
memcpy(&blob->data[0x10D8], sessionKey.data(), sessionKey.size());
975+
memcpy(&blob->data[kROSBlobSessionKeyOffset], sessionKey.data(), sessionKey.size());
969976
strcpy((char*)&blob->data[8], j.value("Email", "").c_str());
970977
strcpy((char*)&blob->data[0xE9F], j.value("Nickname", "").c_str());
971978

@@ -1124,7 +1131,7 @@ static bool InitAccountMTL()
11241131
return false;
11251132
}
11261133

1127-
trace("MTL says it's signed in: %s\n", (const char*)&accountBlob[8]);
1134+
trace("MTL says it's signed in: %s\n", (const char*)&accountBlob[kROSBlobEmailOffset]);
11281135

11291136
return true;
11301137
#else
@@ -1167,8 +1174,8 @@ static bool InitAccountRemote()
11671174

11681175
static HookFunction hookFunction([]()
11691176
{
1170-
Instance<ICoreGameInit>::Get()->SetData("rosUserName", (const char*)&accountBlob[0xE9F]);
1171-
Instance<ICoreGameInit>::Get()->SetData("rosUserEmail", (const char*)&accountBlob[8]);
1177+
Instance<ICoreGameInit>::Get()->SetData("rosUserName", (const char*)&accountBlob[kROSBlobUsernameOffset]);
1178+
Instance<ICoreGameInit>::Get()->SetData("rosUserEmail", (const char*)&accountBlob[kROSBlobEmailOffset]);
11721179
});
11731180
#endif
11741181
#else
@@ -1188,7 +1195,7 @@ void PreInitGameSpec()
11881195
uint64_t ROSGetDummyAccountID()
11891196
{
11901197
#if defined(IS_RDR3)
1191-
return *(uint64_t*)&accountBlob[3816];
1198+
return *(uint64_t*)&accountBlob[kROSBlobAccountIdOffset];
11921199
#else
11931200
static std::once_flag gotAccountId;
11941201
static uint32_t accountId;

0 commit comments

Comments
 (0)