Only 2011

This commit is contained in:
lightbulblighter 2022-08-02 13:49:00 -07:00
parent e1068bb39c
commit dce47e283a
No known key found for this signature in database
GPG Key ID: 58D6EDC2C38C9B3B
20 changed files with 22 additions and 380 deletions

View File

@ -1,33 +0,0 @@
#include "pch.h"
#include "Patches.h"
#include "Util.h"
#include "Hooks/Application.h"
#if defined(ARBITERBUILD) && defined(PLAYER2012)
Application__ParseArguments_t Application__ParseArguments = (Application__ParseArguments_t)ADDRESS_APPLICATION__PARSEARGUMENTS;
BOOL __fastcall Application__ParseArguments_hook(int _this, void*, int a2, const char* argv)
{
std::map<std::string, std::string> argslist = Util::parseArgs(argv);
if (argslist.count("-jobId"))
{
/*
Erase everything that comes after the -jobId argument.
Dirty quick hack that *shouldn't* matter in production
since the Arbiter starts up the player with arguments in
such an order that this won't affect anything.
*/
char* pch = (char*)strstr(argv, " -jobId");
if (pch != NULL)
strncpy_s(pch, strlen(pch) + 1, "", 0);
}
return Application__ParseArguments(_this, a2, argv);
}
#endif

View File

@ -2,8 +2,6 @@
#include "Hooks/CRoblox.h"
#if defined(MFC2010) || defined(MFC2011)
static bool hasAuthUrlArg = false;
static bool hasAuthTicketArg = false;
static bool hasJoinArg = false;
@ -27,29 +25,16 @@ BOOL __fastcall CRobloxApp__InitInstance_hook(CRobloxApp* _this)
CApp__RobloxAuthenticate(app, nullptr, authenticationUrl.c_str(), authenticationTicket.c_str());
}
// DataModel* datamodel = reinterpret_cast<DataModel*>(CLASSLOCATION_CAPP);
// printf("Attempting to create DataModel...\n");
// char* v27;
// DataModel__createDataModel((int)&v27, 1);
#ifdef PLAYERBUILD
if (hasJoinArg && !joinScriptUrl.empty())
{
try
{
// so... i would've wanted to just use CApp::CreateGame instead but there's a few issues
// in the typelib, CreateGame is exposed as being IApp::CreateGame(string p) - 'p' is "44340105256"
// however internally the function is actually CApp::CreateGame(int something, LPCWSTR p)
// it's obvious that 'something' is a pointer to a class but i have no clue what the class is
// until i figure out wtf its supposed to be we've gotta stick to doing CRobloxApp::CreateDocument for now
CRobloxDoc* document = CRobloxApp__CreateDocument(_this);
CWorkspace__ExecUrlScript(document->workspace, joinScriptUrl.c_str(), VARIANTARG(), VARIANTARG(), VARIANTARG(), VARIANTARG(), nullptr);
}
catch (std::runtime_error)// & exception)
catch (std::runtime_error)
{
// MessageBoxA(nullptr, exception.what(), nullptr, MB_ICONERROR);
return FALSE;
}
}
@ -118,6 +103,4 @@ void __fastcall CRobloxCommandLineInfo__ParseParam_hook(CRobloxCommandLineInfo*
#endif
CRobloxCommandLineInfo__ParseParam(_this, pszParam, bFlag, bLast);
}
#endif
}

View File

@ -14,9 +14,13 @@ void __fastcall Context__requirePermission_hook(void* _this, void*, int permissi
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) + ")");
}
}
}

View File

@ -132,10 +132,6 @@ void __fastcall Crypt__verifySignatureBase64_hook(HCRYPTPROV* _this, void*, int
// Verify signature
if (!Crypt().verifySignatureBase64(message, signatureBase64, CALG_SHA_256))
{
// Backwards compatibility for sha1 signatures
if (!Crypt().verifySignatureBase64(message, signatureBase64, CALG_SHA1))
{
throw std::runtime_error("");
}
throw std::runtime_error("");
}
}

View File

@ -2,7 +2,7 @@
#include "Hooks/ServerReplicator.h"
#if defined(ARBITERBUILD) && defined(MFC2011)
#if defined(ARBITERBUILD)
static std::map<ServerReplicator*, RakPeerInterface*> rakPeers;
@ -13,12 +13,10 @@ void __fastcall ServerReplicator__sendTop_hook(ServerReplicator* _this, void*, R
{
if (_this->isAuthenticated)
{
// printf("ServerReplicator::sendTop called: player is authenticated\n");
ServerReplicator__sendTop(_this, peer);
}
else if (rakPeers.find(_this) == rakPeers.end())
{
// printf("ServerReplicator::sendTop called: player is not authenticated\n");
rakPeers.insert(std::pair<ServerReplicator*, RakPeerInterface*>(_this, peer));
}
}
@ -27,25 +25,11 @@ void __fastcall ServerReplicator__processTicket_hook(ServerReplicator* _this, vo
{
ServerReplicator__processTicket(_this, packet);
// THIS IS TEMPORARY
// i literally cant find a way to obtain rakpeerinterface from _this, like it's really damn hard
// so i'm cheating on doing that by getting rakpeerinterface from the first sendtop call,
// throwing that into a lookup table and then using that here
auto pos = rakPeers.find(_this);
if (pos == rakPeers.end())
if (_this->isAuthenticated)
{
// printf("ServerReplicator::sendTop called: could not find rakpeer for %08X\n", (int)_this);
}
else if (_this->isAuthenticated)
{
// printf("ServerReplicator::sendTop called: Value of peer: %08X - associated with %08X\n", (int)pos->second, (int)_this);
ServerReplicator__sendTop_hook(_this, nullptr, pos->second);
}
else
{
// printf("ServerReplicator::sendTop called: player is not authenticated\n");
}
}
#endif

View File

@ -12,18 +12,11 @@ void InitializeOutput()
outputHandle = CreateFileA("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, outputHandle);
printf("PolygonDLL v1.0.0\n");
printf("Tadah.DLL v1.0.0\n");
#ifdef _DEBUG
SetConsoleTextAttribute(outputHandle, FOREGROUND_RED | FOREGROUND_GREEN);
printf("Compiled as Debug\n\n");
#endif
// lol
// printf("Access key read: \n");
// printf("Current Access key: \n");
// printf("Service starting...\n");
// printf("Intializing Roblox Web Service\n");
// printf("Service Started on port 64989\n");
}
StandardOut__print_t StandardOut__print = (StandardOut__print_t)ADDRESS_STANDARDOUT__PRINT;
@ -37,35 +30,6 @@ void __fastcall StandardOut__print_hook(int _this, void*, int type, std::string*
message = reinterpret_cast<std::string*>((int)message + 4);
#endif
#ifdef _DEBUG
if (message->compare("NewGame") == 0 || message->compare("NewGame2") == 0)
{
printf("\n");
printf("Attempting to create new Game...\n");
Game* game = new Game();
int result = Game__construct(Game__initializeClass(game, 0));
if (result)
{
printf("Failed to create new Game! (returned %d)\n", result);
}
else
{
printf("Successfully created new Game! (%p)\n", game);
game->dataModel->jobId = "deez nuts";
auto scriptContext = ServiceProvider__createScriptContext(game->dataModel.get());
ScriptContext__execute(scriptContext, 5, "print(\"hi this should be inside the dll's created datamodel i think\")", "hi");
ScriptContext__execute(scriptContext, 5, "print(\"job id: \" .. game.jobId)", "hi");
ScriptContext__execute(scriptContext, 5, "printidentity()", "hi");
printf("\n");
}
}
#endif
switch (type)
{
case RBX__MESSAGE_OUTPUT:

View File

@ -1,29 +0,0 @@
#pragma once
#include <oaidl.h>
#include "Config.h"
// TODO: These need a place
struct DataModel
{
void* padding1[CLASSPADDING_DATAMODEL__JOBID + PADDING_STRUCT];
std::string jobId;
};
struct Game
{
// 2010 has a class size of 104 bytes
void* padding1[8];
std::shared_ptr<DataModel> dataModel;
void* padding2[9];
};
const auto Game__initializeClass = (Game * (__thiscall*)(Game* _this, int a2))0x455D40;
const auto Game__construct = (int(__thiscall*)(Game* _this))0x47DBF0;
const auto ServiceProvider__createScriptContext = (void * (__thiscall*)(void* _this))0x4282E0;
const auto ScriptContext__execute = (void (__thiscall*)(void* _this, int identity, const char* script, const char* name))0x617C80;
// const auto DataModel__createDataModel = (std::shared_ptr<void>(__thiscall*)(bool startHeartbeat))ADDRESS_DATAMODEL__CREATEDATAMODEL;

View File

@ -1,60 +1,7 @@
#pragma once
#define MFC2010
#define PLAYERBUILD
#define ARBITERBUILD
// #define DEBUG_SERVERREPLICATOR__PROCESSPACKET
/*
* PLAYERBUILD (2010 and 2012):
* - The "-jobId" argument is parsed
*
* ARBITERBUILD:
* - DataModel::getJobId is hooked
* - DataModel::~DataModel is hooked
* - StandardOut::print is hooked
* - Network::RakNetAddressToString is hooked
* - The "-jobId" argument becomes available
* - HTTP requests and console output is logged to a file
*/
// RobloxApp (2010)
#ifdef MFC2010
#define CLASSPADDING_DATAMODEL__JOBID 728
#define ADDRESS_STANDARDOUT__PRINT 0x0059F340
#define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 0x0079ECF0
#define ADDRESS_SERVERREPLICATOR__SENDTOP 0x00506910
#define ADDRESS_SERVERREPLICATOR__PROCESSPACKET 0x00507420
#define ADDRESS_SERVERREPLICATOR__PROCESSTICKET 0x0
#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
#define CLASSLOCATION_CAPP 0x00405D20
#define CLASSPADDING_CROBLOXDOC__WORKSPACE 40
#define ADDRESS_CAPP__CREATEGAME 0x00405D20
#define ADDRESS_CAPP__ROBLOXAUTHENTICATE 0x00408060
#define ADDRESS_CROBLOXAPP__INITINSTANCE 0x00452900
#define ADDRESS_CROBLOXAPP__CREATEDOCUMENT 0x0044F6E0
#define ADDRESS_CWORKSPACE__EXECURLSCRIPT 0x0047EC10
#define ADDRESS_CROBLOXCOMMANDLINEINFO__PARSEPARAM 0x00450AC0
#define ADDRESS_CCOMMANDLINEINFO__PARSELAST 0x007A80A0
// Player specific definitions
#define ADDRESS_APPLICATION__PARSEARGUMENTS 0x0
#endif
// RobloxApp (2011)
#ifdef MFC2011
// #define ARBITERBUILD
#define CLASSPADDING_DATAMODEL__JOBID 739
@ -69,7 +16,6 @@
#define ADDRESS_CONTEXT__REQUIREPERMISSION 0x0
#define ADDRESS_CONTEXT__ISINROLE 0x0
// MFC specific definitions
#define CLASSLOCATION_CROBLOXAPP 0x00CBA8A0
#define CLASSLOCATION_CAPP 0x00406D80
@ -83,81 +29,6 @@
#define ADDRESS_CROBLOXCOMMANDLINEINFO__PARSEPARAM 0x0045EE50
#define ADDRESS_CCOMMANDLINEINFO__PARSELAST 0x0081354A
// Player specific definitions
#define ADDRESS_APPLICATION__PARSEARGUMENTS 0x0
#endif
// RobloxApp/RobloxPlayer/RobloxStudio (2012)
#ifdef MFC2012
#define ADDRESS_HTTP__TRUSTCHECK 0x006D5D20
#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.
This causes address definitions (such as the ones below) to look a bit off.
For example, if the beginning of the program is located at 0x00BF1000 and
you have a TrustCheck hook that is at 0x00DF20A0, VMProtect will offset the
memory location from 0x00000000 - 0x00FF0000. Thus, the 0x00BF0000 in
0x00BF1000 is actually an offset.
With that offset, the address you'd have to put for your TrustCheck hook will
be (0x00DF20A0 - 0x00BF0000) = 0x002020A0. Then, you just put that address
into the function.
*/
// MFC specific definitions
#define CLASSLOCATION_CROBLOXAPP 0x0
#define CLASSLOCATION_CAPP 0x0
#define CLASSPADDING_CROBLOXDOC__WORKSPACE 40
#define ADDRESS_CAPP__CREATEGAME 0x0
#define ADDRESS_CAPP__ROBLOXAUTHENTICATE 0x0
#define ADDRESS_CROBLOXAPP__INITINSTANCE 0x0
#define ADDRESS_CROBLOXAPP__CREATEDOCUMENT 0x0
#define ADDRESS_CWORKSPACE__EXECURLSCRIPT 0x0
#define ADDRESS_CROBLOXCOMMANDLINEINFO__PARSEPARAM 0x0
#define ADDRESS_CCOMMANDLINEINFO__PARSELAST 0x0
#define CLASSPADDING_DATAMODEL__JOBID 762
#define ADDRESS_DATAMODEL__GETJOBID Patches::GetAddressByOffset(0x002079A0)
#define ADDRESS_STANDARDOUT__PRINT Patches::GetAddressByOffset(0x0023A8C0)
#define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 Patches::GetAddressByOffset(0x00526330)
#define ADDRESS_SERVERREPLICATOR__SENDTOP 0x0
#define ADDRESS_SERVERREPLICATOR__PROCESSTICKET 0x0
#define ADDRESS_NETWORK__RAKNETADDRESSTOSTRING 0x0
#define ADDRESS_HTTP__TRUSTCHECK Patches::GetAddressByOffset(0x002020A0)
#define ADDRESS_HTTP__HTTPGETPOSTWININET 0x0
// Player specific definitions
#define ADDRESS_APPLICATION__PARSEARGUMENTS Patches::GetAddressByOffset(0x00004E60)
#endif
// RobloxStudioBeta (2012)
#ifdef STUDIO2012
#define ADDRESS_HTTP__TRUSTCHECK Patches::GetAddressByOffset(0x001931A0)
#define ADDRESS_HTTP__HTTPGETPOSTWININET 0x0
#define ADDRESS_CRYPT__VERIFYSIGNATUREBASE64 Patches::GetAddressByOffset(0x004CD250)
#endif
#define RR_STOP_PROCESSING_AND_DEALLOCATE 0
#define RR_CONTINUE_PROCESSING 1
#define RR_STOP_PROCESSING 2
#ifndef _DEBUG
#define PADDING_STRUCT 1
#else

View File

@ -1,11 +0,0 @@
#pragma once
#if defined(ARBITERBUILD) && defined(PLAYER2012)
#include "Classes.h"
typedef BOOL(__thiscall* Application__ParseArguments_t)(int _this, int a2, const char* argv);
BOOL __fastcall Application__ParseArguments_hook(int _this, void*, int a2, const char* argv);
extern Application__ParseArguments_t Application__ParseArguments;
#endif

View File

@ -1,12 +1,6 @@
#pragma once
#include "Classes.h"
#if defined(MFC2010) || defined(MFC2011)
// 2010 struct definitions:
// 0x47E010: CWorkspace->DoExecScript()
// 0x47EC10: CWorkspace->ExecUrlScript()
#include "Config.h"
class CWorkspace;
@ -20,14 +14,8 @@ struct CRobloxDoc
struct CApp;
// const auto CApp__CreateGame = (CWorkspace * (__thiscall*)(CApp * _this, int, LPCWSTR))ADDRESS_CAPP__CREATEGAME;
const auto CApp__RobloxAuthenticate = (void* (__thiscall*)(CApp * _this, LPVOID, LPCWSTR, LPCWSTR))ADDRESS_CAPP__ROBLOXAUTHENTICATE;
// 2010 struct definitions:
// 0x405D20: CRobloxApp->CreateDocument()
// 0x44F6F0: CRobloxApp->ExitInstance()
// 0x452900: CRobloxApp->InitInstance()
struct CRobloxApp;
const auto CRobloxApp__CreateDocument = (CRobloxDoc * (__thiscall*)(CRobloxApp * _this))ADDRESS_CROBLOXAPP__CREATEDOCUMENT;
@ -49,6 +37,4 @@ BOOL __fastcall CRobloxApp__InitInstance_hook(CRobloxApp* _this);
void __fastcall CRobloxCommandLineInfo__ParseParam_hook(CRobloxCommandLineInfo* _this, void*, const char* pszParam, BOOL bFlag, BOOL bLast);
extern CRobloxApp__InitInstance_t CRobloxApp__InitInstance;
extern CRobloxCommandLineInfo__ParseParam_t CRobloxCommandLineInfo__ParseParam;
#endif
extern CRobloxCommandLineInfo__ParseParam_t CRobloxCommandLineInfo__ParseParam;

View File

@ -1,6 +1,6 @@
#pragma once
#include "Classes.h"
#include "Config.h"
#ifdef _DEBUG

View File

@ -2,7 +2,7 @@
#include <wincrypt.h>
#include "Classes.h"
#include "Config.h"
typedef void(__thiscall* Crypt__verifySignatureBase64_t)(HCRYPTPROV* _this, int a2, BYTE* pbData, int a4, int a5, int a6, DWORD dwDataLen, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15);
void __fastcall Crypt__verifySignatureBase64_hook(HCRYPTPROV* _this, void*, int a2, BYTE* pbData, int a4, int a5, int a6, DWORD dwDataLen, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15);

View File

@ -3,7 +3,7 @@
#include <curl/curl.h>
#include <rapidjson/document.h>
#include "Classes.h"
#include "Config.h"
struct Http
{

View File

@ -1,8 +1,8 @@
#pragma once
#include "Classes.h"
#include "Config.h"
#if defined(ARBITERBUILD) && defined(MFC2011)
#if defined(ARBITERBUILD)
struct Packet
{

View File

@ -1,6 +1,6 @@
#pragma once
#include "Classes.h"
#include "Config.h"
void InitializeOutput();

View File

@ -9,8 +9,6 @@ namespace Patches
extern std::vector<Patch> patchList;
LONG Apply();
VOID ResolveOffset();
INT GetAddressByOffset(int address);
}
#define START_PATCH_LIST() std::vector<Patches::Patch> Patches::patchList = {

View File

@ -2,8 +2,6 @@
#include "Patches.h"
int addressOffset;
LONG Patches::Apply()
{
DetourTransactionBegin();
@ -14,48 +12,4 @@ LONG Patches::Apply()
}
return DetourTransactionCommit();
}
VOID Patches::ResolveOffset()
{
// the only surviving fragment of PolygonUtil.dll
// RIP 05/08/2021 - 20/01/2022
MEMORY_BASIC_INFORMATION mbi;
DWORD ProcID = GetCurrentProcessId();
HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcID);
unsigned int Opcode = 0xC7F18B56;
int BaseAddress = 0x00001000;
int Offset = 0x00010000;
int Searches = 0xFFF;
for (int i = 1; i <= Searches; i++)
{
int SearchAddress = Offset * i;
int Address = SearchAddress + BaseAddress;
if (VirtualQuery((LPVOID)Address, &mbi, sizeof(mbi)) == 0) continue;
std::vector<int> buffer(mbi.RegionSize);
if (!ReadProcessMemory(Handle, (LPCVOID)Address, &buffer[0], buffer.size(), NULL)) continue;
if (buffer[0] == Opcode)
{
addressOffset = SearchAddress;
break;
}
if (SearchAddress == Offset * Searches)
{
ExitProcess(EXIT_FAILURE);
}
}
}
INT Patches::GetAddressByOffset(int address)
{
if (!addressOffset) ResolveOffset();
return address + addressOffset;
}

View File

@ -48,7 +48,7 @@
<EnableManagedIncrementalBuild>true</EnableManagedIncrementalBuild>
<TargetName>Tadah</TargetName>
<OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
<IntDir>obj\$(Configuration)</IntDir>
<IntDir>obj\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
@ -126,13 +126,11 @@
<ClInclude Include="Include\Config.h" />
<ClInclude Include="Include\Hooks\Context.h" />
<ClInclude Include="Include\Hooks\CRoblox.h" />
<ClInclude Include="Include\Hooks\Application.h" />
<ClInclude Include="Include\Hooks\StandardOut.h" />
<ClInclude Include="Include\Hooks\ServerReplicator.h" />
<ClInclude Include="Include\Hooks\Http.h" />
<ClInclude Include="Include\Patches.h" />
<ClInclude Include="Include\pch.h" />
<ClInclude Include="Include\Classes.h" />
<ClInclude Include="Include\Util.h" />
<ClInclude Include="Include\Hooks\Crypt.h" />
<ClInclude Include="Include\resource.h" />
@ -146,7 +144,6 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="Hooks\Application.cpp" />
<ClCompile Include="Hooks\StandardOut.cpp" />
<ClCompile Include="Hooks\ServerReplicator.cpp" />
<ClCompile Include="Hooks\Http.cpp" />

View File

@ -39,9 +39,6 @@
<ClInclude Include="Include\Hooks\CRoblox.h">
<Filter>Header Files\Hooks</Filter>
</ClInclude>
<ClInclude Include="Include\Hooks\Application.h">
<Filter>Header Files\Hooks</Filter>
</ClInclude>
<ClInclude Include="Include\Hooks\ServerReplicator.h">
<Filter>Header Files\Hooks</Filter>
</ClInclude>
@ -54,9 +51,6 @@
<ClInclude Include="Include\Hooks\Context.h">
<Filter>Header Files\Hooks</Filter>
</ClInclude>
<ClInclude Include="Include\Classes.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Include\resource.h">
<Filter>Header Files</Filter>
</ClInclude>
@ -80,9 +74,6 @@
<ClCompile Include="Hooks\CRoblox.cpp">
<Filter>Source Files\Hooks</Filter>
</ClCompile>
<ClCompile Include="Hooks\Application.cpp">
<Filter>Source Files\Hooks</Filter>
</ClCompile>
<ClCompile Include="Hooks\ServerReplicator.cpp">
<Filter>Source Files\Hooks</Filter>
</ClCompile>
@ -97,7 +88,7 @@
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="PolygonDLL.rc">
<ResourceCompile Include="Tadah.DLL.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>

View File

@ -11,19 +11,10 @@
#if defined(ARBITERBUILD)
#include "Hooks/StandardOut.h"
#include "Hooks/ServerReplicator.h"
#endif
#if defined(ARBITERBUILD) && defined(MFC2011)
#include "Hooks/ReplicatorSecurity.h"
#endif
#if defined(ARBITERBUILD) && defined(PLAYER2012)
#include "Hooks/Application.h"
#endif
#if defined(MFC2010) || defined(MFC2011)
#include "Hooks/CRoblox.h"
#endif
START_PATCH_LIST()
@ -56,11 +47,7 @@ ADD_PATCH(CRobloxCommandLineInfo__ParseParam, CRobloxCommandLineInfo__ParseParam
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
void __declspec(dllexport) import() {}
// #endif
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{