Add debug hooks for ServerReplicator::processPacket on 2010

This commit is contained in:
pizzaboxer 2022-01-29 13:40:11 +00:00
parent 53be4250a4
commit a4e02a8807
7 changed files with 147 additions and 42 deletions

View File

@ -4,6 +4,9 @@
#define PLAYERBUILD
#define ARBITERBUILD
// when PLAYERBUILD is defined, the following changes occur for 2010 and 2012 only:
// the -jobId arg is parsed
// when ARBITERBUILD is defined, the following changes occur:
// DataModel->getJobId is hooked
// StandardOut->print is hooked
@ -21,6 +24,9 @@
#define ADDRESS_HTTP__TRUSTCHECK 0x005A2680
#define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 0x0079ECF0
#define ADDRESS_SERVERREPLICATOR__PROCESSPACKET 0x00507420
#define ADDRESS_RAKNET__BITSTREAM 0x004DBF00
// MFC specific definitions
#define CLASSLOCATION_CROBLOXAPP 0x00BFF898
#define CLASSLOCATION_CAPP 0x00405D20
@ -34,6 +40,10 @@
#define ADDRESS_CWORKSPACE__EXECURLSCRIPT 0x0047EC10
#define ADDRESS_CROBLOXCOMMANDLINEINFO__PARSEPARAM 0x00450AC0
#define ADDRESS_CCOMMANDLINEINFO__PARSELAST 0x007A80A0
// RakNet packet definitions
#define ID_REQUEST_CHARACTER 96
#define ID_SUBMIT_TICKET 104
#endif
// RobloxApp (2011)
@ -59,6 +69,9 @@
#define ADDRESS_CWORKSPACE__EXECURLSCRIPT 0x0049FC90
#define ADDRESS_CROBLOXCOMMANDLINEINFO__PARSEPARAM 0x0045EE50
#define ADDRESS_CCOMMANDLINEINFO__PARSELAST 0x0081354A
#define ID_DATA 129
#define ID_SUBMIT_TICKET 135
#endif
// RobloxApp/RobloxPlayer (2012)
@ -105,7 +118,41 @@
// some of these probably dont even exist in 2010 and 2011
// i'll check later
#define ID_TEACH_DESCRIPTOR_DICTIONARIES 130
// TODO: move all of these to an enum (2012 and newer are offset by +2)
// Stock RakNet definitions
// #define ID_CONNECTION_REQUEST_ACCEPTED 14
// #define ID_CONNECTION_ATTEMPT_FAILED 15
// #define ID_ALREADY_CONNECTED 16
// #define ID_NEW_INCOMING_CONNECTION 17
// #define ID_NO_FREE_INCOMING_CONNECTIONS 18
// #define ID_DISCONNECTION_NOTIFICATION 19
// #define ID_CONNECTION_LOST 20
// #define ID_CONNECTION_BANNED 21
// #define ID_INVALID_PASSWORD 22
// #define ID_INCOMPATIBLE_PROTOCOL_VERSION 23
// #define ID_TIMESTAMP 27
// ROBLOX-specific RakNet definitions
// #define ID_SET_GLOBALS 127
// #define ID_TEACH_DESCRIPTOR_DICTIONARIES 128
// #define ID_DATA 129
// #define ID_REQUEST_MARKER 130
// #define ID_SUBMIT_TICKET 135
// according to the 2016 source, here's all the enums that practically do the same thing in Replicator.cpp:
// ID_PHYSICS_TOUCHES
// ID_SCHEMA_SYNC
// ID_TEACH_DESCRIPTOR_DICTIONARIES
// ID_DATA
// ID_CLUSTER
// ID_SET_GLOBALS
// in the 2016 source there's an extra enum between ID_SUBMIT_TICKET and ID_REQUEST_MARKER
// in 2011, ID_REQUEST_MARKER is 130 and ID_SUBMIT_TICKET is 135
// but in the 2016 source, ID_REQUEST_MARKER is 132 and ID_SUBMIT_TICKET is 138
/* #define ID_TEACH_DESCRIPTOR_DICTIONARIES 130
#define ID_DATA 131
#define ID_REQUEST_MARKER 132
#define ID_PHYSICS 133
@ -125,7 +172,7 @@
#define ID_DICTIONARY_FORMAT 147
#define ID_HASH_MISMATCH 148
#define ID_SECURITYKEY_MISMATCH 149
#define ID_REQUEST_STATS 150
#define ID_REQUEST_STATS 150 */
#define RR_STOP_PROCESSING_AND_DEALLOCATE 0
#define RR_CONTINUE_PROCESSING 1

View File

@ -44,6 +44,33 @@ void Logger::Log(LogType type, const std::string message)
}
}
void Logger::Print(int type, const std::string message)
{
if (!Logger::handle) return;
switch (type)
{
case 1: // RBX::MESSAGE_OUTPUT:
Logger::Log(LogType::Output, std::string("[MESSAGE_OUTPUT] ") + message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case 0: // RBX::MESSAGE_INFO:
Logger::Log(LogType::Output, std::string("[MESSAGE_INFO] ") + message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
break;
case 2: // RBX::MESSAGE_WARNING:
Logger::Log(LogType::Output, std::string("[MESSAGE_WARNING] ") + message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_GREEN);
break;
case 3: // RBX::MESSAGE_ERROR:
Logger::Log(LogType::Output, std::string("[MESSAGE_ERROR] ") + message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
}
printf("%s\n", message.c_str());
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
std::string Logger::UtcTime()
{
std::stringstream time;

View File

@ -13,5 +13,6 @@ public:
static HANDLE handle;
static void Initialize(const std::string jobId);
static void Log(LogType type, const std::string message);
static void Print(int type, const std::string message);
static std::string UtcTime();
};

View File

@ -10,6 +10,14 @@ struct DataModel
void* padding1[CLASSPADDING_DATAMODEL__JOBID];
std::string jobId;
};
struct Packet
{
void* padding1[7];
unsigned int length;
void* padding2[1];
unsigned char* data;
};
#endif
#if defined(MFC2010) || defined(MFC2011)

View File

@ -34,6 +34,9 @@ Application__ParseArguments_t Application__ParseArguments = (Application__ParseA
CRobloxApp__InitInstance_t CRobloxApp__InitInstance = (CRobloxApp__InitInstance_t)ADDRESS_CROBLOXAPP__INITINSTANCE;
CRobloxCommandLineInfo__ParseParam_t CRobloxCommandLineInfo__ParseParam = (CRobloxCommandLineInfo__ParseParam_t)ADDRESS_CROBLOXCOMMANDLINEINFO__PARSEPARAM;
#endif
#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET
ServerReplicator__processPacket_t ServerReplicator__processPacket = (ServerReplicator__processPacket_t)ADDRESS_SERVERREPLICATOR__PROCESSPACKET;
#endif
// Hook Definitions //
@ -116,27 +119,7 @@ void __fastcall StandardOut__print_hook(int _this, void*, int type, std::string*
std::string* message = reinterpret_cast<std::string*>(messagePtr);
#endif
switch (type)
{
case 1: // RBX::MESSAGE_OUTPUT:
Logger::Log(LogType::Output, std::string("[MESSAGE_OUTPUT] ") + *message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case 0: // RBX::MESSAGE_INFO:
Logger::Log(LogType::Output, std::string("[MESSAGE_INFO] ") + *message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
break;
case 2: // RBX::MESSAGE_WARNING:
Logger::Log(LogType::Output, std::string("[MESSAGE_WARNING] ") + *message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_GREEN);
break;
case 3: // RBX::MESSAGE_ERROR:
Logger::Log(LogType::Output, std::string("[MESSAGE_ERROR] ") + *message);
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
}
printf("%s\n", message->c_str());
SetConsoleTextAttribute(Logger::handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
Logger::Print(type, *message);
}
}
@ -307,4 +290,31 @@ void __fastcall CRobloxCommandLineInfo__ParseParam_hook(CRobloxCommandLineInfo*
CRobloxCommandLineInfo__ParseParam(_this, pszParam, bFlag, bLast);
}
#endif
#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET
INT __fastcall ServerReplicator__processPacket_hook(int _this, void*, Packet* packet)
{
if ((unsigned char)packet->data[0] == ID_SUBMIT_TICKET)
{
printf("ServerReplicator::processPacket received ID_SUBMIT_TICKET\n");
}
/* switch ((unsigned char)packet->data[0])
{
case ID_SUBMIT_TICKET:
// printf("ServerReplicator::processPacket called: ID_SUBMIT_TICKET\n");
return ServerReplicator__processPacket(_this, packet);
default:
if (true)
{
Logger::Print(2, "Player not authenticated s");
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
return ServerReplicator__processPacket(_this, packet);
} */
return ServerReplicator__processPacket(_this, packet);
}
#endif

View File

@ -19,23 +19,8 @@ typedef BOOL(__thiscall* Application__ParseArguments_t)(int _this, int a2, const
typedef BOOL(__thiscall* CRobloxApp__InitInstance_t)(CRobloxApp* _this);
typedef void(__thiscall* CRobloxCommandLineInfo__ParseParam_t)(CRobloxCommandLineInfo* _this, const char* pszParam, BOOL bFlag, BOOL bLast);
#endif
// Externals //
extern Http__trustCheck_t Http__trustCheck;
extern Crypt__verifySignatureBase64_t Crypt__verifySignatureBase64;
#ifdef ARBITERBUILD
extern DataModel__getJobId_t DataModel__getJobId;
extern StandardOut__print_t StandardOut__print;
// extern Network__RakNetAddressToString_t Network__RakNetAddressToString;
#ifdef PLAYER2012
extern Application__ParseArguments_t Application__ParseArguments;
#endif
#endif
#if defined(MFC2010) || defined(MFC2011)
// extern CApp__CreateGame_t CApp__CreateGame;
extern CRobloxApp__InitInstance_t CRobloxApp__InitInstance;
extern CRobloxCommandLineInfo__ParseParam_t CRobloxCommandLineInfo__ParseParam;
#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET
typedef int(__thiscall* ServerReplicator__processPacket_t)(int _this, Packet* packet);
#endif
// Hook Declarations //
@ -54,4 +39,28 @@ BOOL __fastcall Application__ParseArguments_hook(int _this, void*, int a2, const
// INT __fastcall CApp__CreateGame_hook(CApp* _this, void*, int *a2, LPCWSTR a3);
BOOL __fastcall CRobloxApp__InitInstance_hook(CRobloxApp* _this);
void __fastcall CRobloxCommandLineInfo__ParseParam_hook(CRobloxCommandLineInfo* _this, void*, const char* pszParam, BOOL bFlag, BOOL bLast);
#endif
#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET
INT __fastcall ServerReplicator__processPacket_hook(int _this, void*, Packet* packet);
#endif
// Externals //
extern Http__trustCheck_t Http__trustCheck;
extern Crypt__verifySignatureBase64_t Crypt__verifySignatureBase64;
#ifdef ARBITERBUILD
extern DataModel__getJobId_t DataModel__getJobId;
extern StandardOut__print_t StandardOut__print;
// extern Network__RakNetAddressToString_t Network__RakNetAddressToString;
#ifdef PLAYER2012
extern Application__ParseArguments_t Application__ParseArguments;
#endif
#endif
#if defined(MFC2010) || defined(MFC2011)
// extern CApp__CreateGame_t CApp__CreateGame;
extern CRobloxApp__InitInstance_t CRobloxApp__InitInstance;
extern CRobloxCommandLineInfo__ParseParam_t CRobloxCommandLineInfo__ParseParam;
#endif
#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET
extern ServerReplicator__processPacket_t ServerReplicator__processPacket;
#endif

View File

@ -20,13 +20,16 @@ ADD_PATCH(Application__ParseArguments, Application__ParseArguments_hook)
ADD_PATCH(CRobloxApp__InitInstance, CRobloxApp__InitInstance_hook)
ADD_PATCH(CRobloxCommandLineInfo__ParseParam, CRobloxCommandLineInfo__ParseParam_hook)
#endif
#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET
ADD_PATCH(ServerReplicator__processPacket, ServerReplicator__processPacket_hook)
#endif
END_PATCH_LIST()
// DLLs for release will be loaded with VMProtect, so this isn't necessary
// Arbiter will still use Stud_PE for ease in swapping DLLs however
// #ifdef ARBITERBUILD
#ifdef ARBITERBUILD
void __declspec(dllexport) import() {}
// #endif
#endif
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{