diff --git a/PolygonClientUtilities/Classes.h b/PolygonClientUtilities/Classes.h index af38489..74a284d 100644 --- a/PolygonClientUtilities/Classes.h +++ b/PolygonClientUtilities/Classes.h @@ -3,6 +3,8 @@ #include "Config.h" #include +// TODO: Split everything here into individual files + struct Tuple { void* padding1[4]; @@ -31,6 +33,8 @@ const auto ServiceProvider__createScriptContext = (void * (__thiscall*)(void* _t // const auto ScriptContext__execute = (void * (__thiscall*)(void* _this, void* a1, int identity, const char* script, const char* name, int arguments))0x617CF0; const auto ScriptContext__execute = (void (__thiscall*)(void* _this, int identity, const char* script, const char* name))0x617C80; +const auto Context__isInRole = (bool (__cdecl*)(int identity, int permission))ADDRESS_CONTEXT__ISINROLE; + struct Http { #if PADDING_STRUCT != 0 diff --git a/PolygonClientUtilities/Config.h b/PolygonClientUtilities/Config.h index 5ee2880..c000aef 100644 --- a/PolygonClientUtilities/Config.h +++ b/PolygonClientUtilities/Config.h @@ -20,19 +20,22 @@ // RobloxApp (2010) #ifdef MFC2010 + #define CLASSPADDING_DATAMODEL__JOBID 728 -#define ADDRESS_DATAMODEL__GETJOBID 0x005CACC0 +// #define ADDRESS_DATAMODEL__GETJOBID 0x005CACC0 #define ADDRESS_STANDARDOUT__PRINT 0x0059F340 // #define ADDRESS_NETWORK__RAKNETADDRESSTOSTRING 0x004FC1A0 #define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 0x0079ECF0 #define ADDRESS_SERVERREPLICATOR__SENDTOP 0x00506910 #define ADDRESS_SERVERREPLICATOR__PROCESSPACKET 0x00507420 #define ADDRESS_SERVERREPLICATOR__PROCESSTICKET 0x0 -#define ADDRESS_DATAMODEL__CREATEDATAMODEL 0x005DC150 +// #define ADDRESS_DATAMODEL__CREATEDATAMODEL 0x005DC150 #define ADDRESS_GAME__CONSTRUCT 0x0047DBF0 #define ADDRESS_HTTP__HTTPGETPOSTWININET 0x006A9210 #define ADDRESS_HTTP__TRUSTCHECK 0x005A2680 +#define ADDRESS_CONTEXT__REQUIREPERMISSION 0x004A2360 +#define ADDRESS_CONTEXT__ISINROLE 0x0065E550 // MFC specific definitions #define CLASSLOCATION_CROBLOXAPP 0x00BFF898 @@ -57,10 +60,12 @@ #define ID_REQUEST_CHARACTER 96 #define ID_DATA 98 #define ID_SUBMIT_TICKET 104 + #endif // RobloxApp (2011) #ifdef MFC2011 + #define CLASSPADDING_DATAMODEL__JOBID 739 #define ADDRESS_DATAMODEL__GETJOBID 0x005E70C0 @@ -99,16 +104,20 @@ #define ID_REPORT_ABUSE 134 #define ID_SUBMIT_TICKET 135 #define ID_CHAT_GAME 136 + #endif -// RobloxApp/RobloxPlayer (2012) +// RobloxApp/RobloxPlayer/RobloxStudio (2012) #ifdef MFC2012 + #define ADDRESS_HTTP__TRUSTCHECK 0x006D5D20 #define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 0x009B1D20 + #endif // RobloxPlayerBeta (2012) #ifdef PLAYER2012 + /* 2012 is a bit different in that the player executable is protected with VMProtect. VMProtect offsets the memory locations randomly on startup. @@ -150,12 +159,15 @@ // Player specific definitions #define ADDRESS_APPLICATION__PARSEARGUMENTS Patches::GetAddressByOffset(0x00004E60) + #endif // RobloxStudioBeta (2012) #ifdef STUDIO2012 + #define ADDRESS_HTTP__TRUSTCHECK Patches::GetAddressByOffset(0x001931A0) #define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 Patches::GetAddressByOffset(0x004CD250) + #endif #define RR_STOP_PROCESSING_AND_DEALLOCATE 0 diff --git a/PolygonClientUtilities/Context.cpp b/PolygonClientUtilities/Context.cpp new file mode 100644 index 0000000..deb5996 --- /dev/null +++ b/PolygonClientUtilities/Context.cpp @@ -0,0 +1,18 @@ +#include "pch.h" +#include "Context.h" +#include "Util.h" + +Context__requirePermission_t Context__requirePermission = (Context__requirePermission_t)ADDRESS_CONTEXT__REQUIREPERMISSION; + +void __fastcall Context__requirePermission_hook(void* _this, void*, int permission, const char* operation) +{ + int identity = *(int*)_this; + + if (!Context__isInRole(identity, permission)) + { + if (operation != 0) + throw std::runtime_error("The current identity (" + std::to_string(identity) + ") cannot " + std::string(operation) + " (requires " + std::to_string(permission) + ")"); + else + throw std::runtime_error("The current identity (" + std::to_string(identity) + ") cannot perform the requested operation (requires " + std::to_string(permission) + ")"); + } +} \ No newline at end of file diff --git a/PolygonClientUtilities/Context.h b/PolygonClientUtilities/Context.h new file mode 100644 index 0000000..08aa688 --- /dev/null +++ b/PolygonClientUtilities/Context.h @@ -0,0 +1,7 @@ +#pragma once + +#include "Classes.h" + +typedef void (__thiscall* Context__requirePermission_t)(void* _this, int permission, const char* operation); +void __fastcall Context__requirePermission_hook(void* _this, void*, int permission, const char* operation); +extern Context__requirePermission_t Context__requirePermission; \ No newline at end of file diff --git a/PolygonClientUtilities/Hooks.cpp b/PolygonClientUtilities/Hooks.cpp deleted file mode 100644 index 1589a54..0000000 --- a/PolygonClientUtilities/Hooks.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "pch.h" -#include "Hooks.h" -#include "Patches.h" -#include "Config.h" -#include "Util.h" - -static bool hasJobId = false; -static bool setJobId = false; - -static std::string jobId; - -// Functions // - -#ifdef ARBITERBUILD -DataModel__getJobId_t DataModel__getJobId = (DataModel__getJobId_t)ADDRESS_DATAMODEL__GETJOBID; -// Network__RakNetAddressToString_t Network__RakNetAddressToString = (Network__RakNetAddressToString_t)ADDRESS_NETWORK__RAKNETADDRESSTOSTRING; -#ifdef MFC2011 - -#endif -#endif -#if defined(MFC2010) || defined(MFC2011) -// CApp__CreateGame_t CApp__CreateGame = (CApp__CreateGame_t)ADDRESS_CAPP__CREATEGAME; -#endif -#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET -ServerReplicator__processPacket_t ServerReplicator__processPacket = (ServerReplicator__processPacket_t)ADDRESS_SERVERREPLICATOR__PROCESSPACKET; -#endif - -// Hook Definitions // - -#ifdef ARBITERBUILD -int __fastcall DataModel__getJobId_hook(DataModel* _this, void*, int a2) -{ - /* - This only sets the job ID when game.jobId is read from Lua. - - Thus, the gameserver script must call game.jobId when it starts - in order for this to take effect. - - This also only applies to the first DataModel that is created. - */ - - if (!setJobId && hasJobId && !jobId.empty()) - { - _this->jobId = jobId; - setJobId = true; - } - - return DataModel__getJobId(_this, a2); -} - -// std::string __fastcall Network__RakNetAddressToString_hook(const int raknetAddress, char portDelineator) -// { -// return Network__RakNetAddressToString(raknetAddress, portDelineator); -// } -#endif - -#if defined(MFC2010) || defined(MFC2011) -/* INT __fastcall CApp__CreateGame_hook(CApp* _this, void*, int* a2, LPCWSTR a3) -{ - printf("CApp::CreateGame called\n"); - // printf("Location of _this: %p\n", _this); - // printf("Location of a2: %p\n", a2); - // printf("Location of a3: %p\n", a3); - - // int result = (int)CApp__CreateGame(_this, a2, a3); - // int result = (int)CApp__CreateGame(_this, a2, L"44340105256"); - int result = (int)CApp__CreateGame(_this, a2, L"44340105256"); - - return result; -} */ -#endif - -#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET -INT __fastcall ServerReplicator__processPacket_hook(int _this, void*, Packet* packet) -{ - switch ((unsigned char)packet->data[0]) - { - case ID_TIMESTAMP: - printf("ServerReplicator::processPacket received ID_TIMESTAMP with length %d\n", packet->length); - break; - - case ID_REQUEST_CHARACTER: - printf("ServerReplicator::processPacket received ID_REQUEST_CHARACTER with length %d\n", packet->length); - break; - - case ID_DATA: - printf("ServerReplicator::processPacket received ID_DATA with length %d\n", packet->length); - break; - - case ID_SUBMIT_TICKET: - printf("ServerReplicator::processPacket received ID_SUBMIT_TICKET with length %d\n", packet->length); - break; - - default: - printf("ServerReplicator::processPacket received packet %d with length %d\n", packet->data[0], packet->length); - break; - } - - /* if ((unsigned char)packet->data[0] == ID_SUBMIT_TICKET) - { - printf("ServerReplicator::processPacket received ID_SUBMIT_TICKET with length %d\n", packet->length); - } - else - { - printf("ServerReplicator::processPacket received packet %d with length %d\n", packet->data[0], packet->length); - } */ - - /* 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) - { - printf("Player not authenticated s"); - // Logger::Print(2, "Player not authenticated s"); - return RR_STOP_PROCESSING_AND_DEALLOCATE; - } - return ServerReplicator__processPacket(_this, packet); - } */ - - return ServerReplicator__processPacket(_this, packet); -} -#endif diff --git a/PolygonClientUtilities/Hooks.h b/PolygonClientUtilities/Hooks.h deleted file mode 100644 index 6333d09..0000000 --- a/PolygonClientUtilities/Hooks.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include "Classes.h" - -// Type Definitions // - -#ifdef ARBITERBUILD -typedef INT(__thiscall* DataModel__getJobId_t)(DataModel* _this, int a2); -// typedef std::string(__thiscall* Network__RakNetAddressToString_t)(const int raknetAddress, char portDelineator); -#ifdef MFC2011 - -#endif -#ifdef PLAYER2012 -#endif -#endif -#if defined(MFC2010) || defined(MFC2011) -// typedef INT(__thiscall* CApp__CreateGame_t)(CApp* _this, int *a2, LPCWSTR a3); -#endif -#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET -typedef int(__thiscall* ServerReplicator__processPacket_t)(int _this, Packet* packet); -#endif - -// Hook Declarations // - -#ifdef ARBITERBUILD -INT __fastcall DataModel__getJobId_hook(DataModel* _this, void*, int a2); -// std::string __fastcall Network__RakNetAddressToString_hook(const int raknetAddress, char portDelineator); -#ifdef MFC2011 - -#endif -#ifdef PLAYER2012 -#endif -#endif -#if defined(MFC2010) || defined(MFC2011) -// INT __fastcall CApp__CreateGame_hook(CApp* _this, void*, int *a2, LPCWSTR a3); -#endif -#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET -INT __fastcall ServerReplicator__processPacket_hook(int _this, void*, Packet* packet); -#endif - -// Externals // - -#ifdef ARBITERBUILD -extern DataModel__getJobId_t DataModel__getJobId; -// extern Network__RakNetAddressToString_t Network__RakNetAddressToString; -#ifdef MFC2011 - -#endif -#ifdef PLAYER2012 -#endif -#endif -#if defined(MFC2010) || defined(MFC2011) -// extern CApp__CreateGame_t CApp__CreateGame; -#endif -#ifdef DEBUG_SERVERREPLICATOR__PROCESSPACKET -extern ServerReplicator__processPacket_t ServerReplicator__processPacket; -#endif \ No newline at end of file diff --git a/PolygonClientUtilities/Http.cpp b/PolygonClientUtilities/Http.cpp index 0fc0983..2d48ae2 100644 --- a/PolygonClientUtilities/Http.cpp +++ b/PolygonClientUtilities/Http.cpp @@ -142,7 +142,7 @@ void __fastcall Http__httpGetPostWinInet_hook(Http* _this, void*, bool isPost, i Http__httpGetPostWinInet(_this, isPost, a3, compressData, additionalHeaders, a6); } -BOOL __fastcall Http__trustCheck_hook(const char* url) +bool __fastcall Http__trustCheck_hook(const char* url) { if (strlen(url) == 7 && !Util::isASCII(url)) { diff --git a/PolygonClientUtilities/Http.h b/PolygonClientUtilities/Http.h index 8cee651..b62cc9d 100644 --- a/PolygonClientUtilities/Http.h +++ b/PolygonClientUtilities/Http.h @@ -5,10 +5,10 @@ #include typedef void (__thiscall* Http__httpGetPostWinInet_t)(Http* _this, bool isPost, int a3, bool compressData, LPCSTR additionalHeaders, int a6); -typedef BOOL(__thiscall* Http__trustCheck_t)(const char* url); +typedef bool(__thiscall* Http__trustCheck_t)(const char* url); void __fastcall Http__httpGetPostWinInet_hook(Http* _this, void*, bool isPost, int a3, bool compressData, LPCSTR additionalHeaders, int a6); -BOOL __fastcall Http__trustCheck_hook(const char* url); +bool __fastcall Http__trustCheck_hook(const char* url); extern Http__httpGetPostWinInet_t Http__httpGetPostWinInet; extern Http__trustCheck_t Http__trustCheck; \ No newline at end of file diff --git a/PolygonClientUtilities/PolygonClientUtilities.vcxproj b/PolygonClientUtilities/PolygonClientUtilities.vcxproj index 6b1a54a..0d0cbdc 100644 --- a/PolygonClientUtilities/PolygonClientUtilities.vcxproj +++ b/PolygonClientUtilities/PolygonClientUtilities.vcxproj @@ -112,6 +112,7 @@ + @@ -121,11 +122,11 @@ - + @@ -139,7 +140,6 @@ - diff --git a/PolygonClientUtilities/PolygonClientUtilities.vcxproj.filters b/PolygonClientUtilities/PolygonClientUtilities.vcxproj.filters index 7c449dc..54cef0f 100644 --- a/PolygonClientUtilities/PolygonClientUtilities.vcxproj.filters +++ b/PolygonClientUtilities/PolygonClientUtilities.vcxproj.filters @@ -24,9 +24,6 @@ Header Files - - Header Files - Header Files @@ -60,6 +57,9 @@ Header Files\Hooks + + Header Files\Hooks + @@ -68,9 +68,6 @@ Source Files - - Source Files - Source Files @@ -98,5 +95,8 @@ Source Files\Hooks + + Source Files\Hooks + \ No newline at end of file diff --git a/PolygonClientUtilities/dllmain.cpp b/PolygonClientUtilities/dllmain.cpp index a6879e0..d8db7dc 100644 --- a/PolygonClientUtilities/dllmain.cpp +++ b/PolygonClientUtilities/dllmain.cpp @@ -6,6 +6,10 @@ #include "Http.h" #include "Crypt.h" +#ifdef _DEBUG +#include "Context.h" +#endif + #ifdef ARBITERBUILD #include "StandardOut.h" @@ -29,6 +33,10 @@ ADD_PATCH(Http__httpGetPostWinInet, Http__httpGetPostWinInet_hook) ADD_PATCH(Http__trustCheck, Http__trustCheck_hook) ADD_PATCH(Crypt__verifySignatureBase64, Crypt__verifySignatureBase64_hook) +#ifdef _DEBUG +ADD_PATCH(Context__requirePermission, Context__requirePermission_hook) +#endif + #ifdef ARBITERBUILD // ADD_PATCH(DataModel__getJobId, DataModel__getJobId_hook) ADD_PATCH(StandardOut__print, StandardOut__print_hook)