This commit is contained in:
watrabi
2025-12-18 16:59:29 -05:00
parent c93494f795
commit ff95483b22
54 changed files with 60469 additions and 509 deletions
+12 -15
View File
@@ -78,7 +78,7 @@ FASTFLAG(PlaceLauncherUsePOST)
namespace RBX {
Application::Application()
: logManager("Roblox", ".Client.dmp", ".Client.crashevent")
: logManager("watrbx", ".Client.dmp", ".Client.crashevent")
, crashReportEnabled(true)
, hideChat(false)
, mapFileForWnd(NULL)
@@ -437,8 +437,8 @@ void Application::UploadSessionLogs()
"Warning", MB_OK | MB_ICONWARNING);
} else {
MessageBoxA(mainWindow,
"Logfiles will be uploaded next time you start Roblox. Please restart roblox now.",
"ROBLOX", MB_OK);
"Logfiles will be uploaded next time you start watrbx. Please restart watrbx now.",
"watrbx", MB_OK);
}
}
@@ -447,7 +447,7 @@ void Application::OnHelp()
if (!DFFlag::DontOpenWikiOnClient)
{
ShellExecute(mainWindow, "open", "rundll32.exe",
"url.dll,FileProtocolHandler http://wiki.roblox.com", NULL, SW_SHOWDEFAULT);
"url.dll,FileProtocolHandler https://discord.gg/kwX8wvEFw6", NULL, SW_SHOWDEFAULT);
}
}
@@ -506,7 +506,7 @@ static void doMachineIdCheck(Application* app, FunctionMarshaller* marshaller, H
marshaller->Execute(boost::bind(&Application::AboutToShutdown, app));
marshaller->Execute(boost::bind(&Application::Shutdown, app));
MessageBoxA(hWnd, MachineIdUploader::kBannedMachineMessage, "ROBLOX", MB_OK);
MessageBoxA(hWnd, MachineIdUploader::kBannedMachineMessage, "watrbx", MB_OK);
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
}
@@ -611,8 +611,6 @@ bool Application::Initialize(HWND hWnd, HINSTANCE hInstance)
initialProgramHash = ProgramMemoryChecker().getLastCompletedHash();
RBX::pmcHash.nonce = initialProgramHash;
LuaSecureDouble::initDouble();
// make our code have no rwx sections (this might not work on some computers?)
unsigned int sizeDiff = protectVmpSections();
@@ -652,7 +650,6 @@ bool Application::Initialize(HWND hWnd, HINSTANCE hInstance)
}
#if !defined(RBX_STUDIO_BUILD)
hookApi();
RBX::vehHookLocationHv = reinterpret_cast<uintptr_t>(vehHookLocation);
RBX::vehStubLocationHv = reinterpret_cast<uintptr_t>(&RtlDispatchExceptionHook);
setupCeLogWatcher();
@@ -994,7 +991,7 @@ bool Application::ParseArguments(const char* argv)
{
std::basic_stringstream<char> options;
desc.print(options);
MessageBoxA(NULL, options.str().c_str(), "Roblox", MB_OK);
MessageBoxA(NULL, options.str().c_str(), "watrbx", MB_OK);
return false;
}
@@ -1160,7 +1157,7 @@ void Application::uploadCrashData(bool userRequested)
const int MAX_LOADSTRING = 400;
TCHAR message[MAX_LOADSTRING];
LoadString(GetModuleHandle(NULL), IDS_ERROR_REPORT_PROMPT, message, MAX_LOADSTRING);
if (MessageBoxA(mainWindow, message, "ROBLOX", MB_YESNO)==IDYES)
if (MessageBoxA(mainWindow, message, "watrbx", MB_YESNO)==IDYES)
dumpErrorUploader->Upload(dmpHandlerUrl);
else
logManager.gatherCrashLogs();
@@ -1179,14 +1176,14 @@ void Application::handleError(const std::exception& e)
OutputDebugString(message.c_str());
LogManager::ReportException(e);
if (!RobloxCrashReporter::silent) {
MessageBoxA(NULL, e.what(), "Roblox", MB_OK | MB_ICONSTOP);
MessageBoxA(NULL, e.what(), "watrbx", MB_OK | MB_ICONSTOP);
}
}
void Application::waitForNewPlayerProcess(HWND hWnd)
{
static const char kPreventMultipleRobloxPlayersEventName[] = "ROBLOX_singletonEvent";
static const char kPreventMultipleRobloxPlayersMutexName[] = "ROBLOX_singletonMutex";
static const char kPreventMultipleRobloxPlayersEventName[] = "watrbx_singletonEvent";
static const char kPreventMultipleRobloxPlayersMutexName[] = "watrbx_singletonMutex";
// Create (or open if already created) named event
HANDLE event = CreateEventA(NULL, FALSE, FALSE, kPreventMultipleRobloxPlayersEventName);
@@ -1340,7 +1337,7 @@ void Application::validateBootstrapperVersion()
if (pos == std::string::npos)
return;
// from www.roblox.com or www.gametest1.pizzaboxer.fun to setup.roblox.com or setup.gametest1.pizzaboxer.fun, etc...
// from www.roblox.com or www.gametest1.watrbx.local to setup.roblox.com or setup.gametest1.watrbx.local, etc...
installHost = "http://setup" + baseUrl.substr(pos+3);
{
@@ -1554,7 +1551,7 @@ void Application::doOpenUrl(const std::string url)
if (HWND dialog = webView->Create( mainWindow, SW_SHOWNORMAL))
::ShowWindowAsync(dialog, SW_SHOWNORMAL);
else
MessageBox( mainWindow, "There was a problem opening the in-game browser.", "Roblox", MB_OK | MB_ICONSTOP);
MessageBox( mainWindow, "There was a problem opening the in-game browser.", "watrbx", MB_OK | MB_ICONSTOP);
}
void Application::openUrlInBrowserApp(const std::string url)
+2 -2
View File
@@ -277,7 +277,7 @@ bool VerifyCryptSignature(const std::wstring& fileName)
// signer info structure.
if (GetProgAndPublisherInfo(pSignerInfo, &ProgPubInfo))
{
if (StrCmpW(ProgPubInfo.lpszProgramName, L"Roblox Application") != 0)
if (StrCmpW(ProgPubInfo.lpszProgramName, L"watrbx application") != 0)
{
result = false;
__leave;
@@ -289,7 +289,7 @@ bool VerifyCryptSignature(const std::wstring& fileName)
// wprintf(L"Publisher Link : %s\n", ProgPubInfo.lpszPublisherLink);
//}
if (StrCmpW(ProgPubInfo.lpszMoreInfoLink, L"http://www.roblox.com ") != 0)
if (StrCmpW(ProgPubInfo.lpszMoreInfoLink, L"http://www.watrbx.wtf ") != 0)
{
result = false;
__leave;
+1 -1
View File
@@ -2,7 +2,7 @@
namespace RBX
{
typedef BOOLEAN (NTAPI *RtlDispatchExceptionPfn)(PEXCEPTION_RECORD exRec, PCONTEXT ctx);
typedef BOOLEAN(NTAPI* RtlDispatchExceptionPfn)(PEXCEPTION_RECORD exRec, PCONTEXT ctx);
// extern RtlDispatchExceptionPfn vehHookContinue; // moved to App because this needs to be checked.
extern DWORD* vehHookLocation;
BOOLEAN RtlDispatchExceptionHook(PEXCEPTION_RECORD exRec, PCONTEXT ctx);
+7 -7
View File
@@ -101,7 +101,7 @@ UserInput::UserInput(HWND wnd, shared_ptr<RBX::Game> game, View* view)
(VOID**)&diPtr,
NULL ) ) )
{
MessageBoxA(NULL, "ROBLOX could not initialize input. Please make sure you have a mouse and keyboard plugged in.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "watrbx could not initialize input. Please make sure you have a mouse and keyboard plugged in.", "watrbx", MB_OK);
return;
}
@@ -172,13 +172,13 @@ void UserInput::createMouse()
HRESULT hr;
if (FAILED(hr = diPtr->CreateDevice( GUID_SysMouse, &diMousePtr, NULL)))
{
MessageBoxA(NULL, "Could not find a mouse! ROBLOX requires a mouse.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "Could not find a mouse! watrbx requires a mouse.", "watrbx", MB_OK);
return;
}
if (FAILED(hr = diMousePtr->SetDataFormat(&c_dfDIMouse2)))
{
MessageBoxA(NULL, "Could not find a mouse (data format failed)! ROBLOX requires a mouse.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "Could not find a mouse (data format failed)! watrbx requires a mouse.", "watrbx", MB_OK);
return;
}
@@ -186,7 +186,7 @@ void UserInput::createMouse()
getDiProp(dipdw);
if (FAILED(hr = diMousePtr->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph)))
{
MessageBoxA(NULL, "Could not find a mouse (set property failed)! ROBLOX requires a mouse.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "Could not find a mouse (set property failed)! watrbx requires a mouse.", "watrbx", MB_OK);
return;
}
}
@@ -197,13 +197,13 @@ void UserInput::createKeyboard()
if (FAILED(hr = diPtr->CreateDevice(GUID_SysKeyboard, &diKeyboardPtr, NULL)))
{
MessageBoxA(NULL, "Could not find a keyboard! ROBLOX requires a keyboard.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "Could not find a keyboard! watrbx requires a keyboard.", "watrbx", MB_OK);
return;
}
if (FAILED(hr = diKeyboardPtr->SetDataFormat(&c_dfDIKeyboard)))
{
MessageBoxA(NULL, "Could not find a keyboard (data format failed)! ROBLOX requires a keyboard.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "Could not find a keyboard (data format failed)! watrbx requires a keyboard.", "watrbx", MB_OK);
return;
}
@@ -211,7 +211,7 @@ void UserInput::createKeyboard()
getDiProp(dipdw);
if (FAILED(hr = diKeyboardPtr->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph)))
{
MessageBoxA(NULL, "Could not find a keyboard (set property failed)! ROBLOX requires a keyboard.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "Could not find a keyboard (set property failed)! watrbx requires a keyboard.", "watrbx", MB_OK);
return;
}
}
+5 -5
View File
@@ -302,12 +302,12 @@ DWORD ThreadDoUploadVideo(shared_ptr<RBX::DataModel> dataModel, bool siteSEO, st
"<media:title type=\"plain\">" + videoTitle + "</media:title>\r\n"
"<media:description type=\"plain\">\r\n"
"" + videoSEOInfo + "\r\n"
"For more games visit http://www.roblox.com\r\n"
"For more games visit http://www.watrbx.wtf\r\n"
"</media:description>\r\n"
"<media:category\r\n"
"scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">Games\r\n"
"</media:category>\r\n"
"<media:keywords>ROBLOX, video, free game, online virtual world</media:keywords>\r\n"
"<media:keywords>watrbx, video, free game, online virtual world</media:keywords>\r\n"
"</media:group>\r\n"
"</entry>\r\n"
"--f93dcbA3\r\n"
@@ -361,7 +361,7 @@ DWORD ThreadDoUploadVideo(shared_ptr<RBX::DataModel> dataModel, bool siteSEO, st
http.additionalHeaders["Authorization"] = "AuthSub token=\"" + youtubeToken + "\"";
http.additionalHeaders["GData-Version"] = "2";
http.additionalHeaders["X-GData-Key"] = "key=AI39si5sZKe6qAobFgnT9UFGXq9bBO7mUCsK3_cWy_LJmgKDtl-GOMHNNV_Bh7Jk7KqDX7vI8D30jFHwnu8RJcDmcJN47yPW7A";
http.additionalHeaders["Slug"] = "roblox.avi";
http.additionalHeaders["Slug"] = "watrbx.avi";
http.additionalHeaders["Connection"] = "close";
http.additionalHeaders["Content-Length"] = RBX::format("%d", buffer.str().length());
@@ -398,7 +398,7 @@ void WebBrowserAxDialog::DoUploadVideo(std::string token, std::string title, std
siteSEO = false;
if (placeId > 0)
{
videoSEOInfo = format_string("To play this game, please visit: http://www.roblox.com/item.aspx?id=%d&amp;rbx_source=youtube&amp;rbx_medium=uservideo", placeId);
videoSEOInfo = format_string("To play this game, please visit: http://www.watrbx.wtf/item.aspx?id=%d&amp;rbx_source=youtube&amp;rbx_medium=uservideo", placeId);
} else {
videoSEOInfo = seostr;
}
@@ -411,7 +411,7 @@ void WebBrowserAxDialog::DoUploadVideo(std::string token, std::string title, std
videoTitle = titelString;
if (videoTitle.length() == 0)
videoTitle = "ROBLOX ROCKS!";
videoTitle = "watrbx is nice.";
youtubeToken = token;
+2 -1
View File
@@ -65,7 +65,7 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v110</PlatformToolset>
<PlatformToolset>v110_xp</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
@@ -313,6 +313,7 @@
<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
<FloatingPointModel>Fast</FloatingPointModel>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
</ClCompile>
<Link>
<AdditionalDependencies>$(CONTRIB_PATH)\SDL2\VisualC\Win32\Release\SDL2.lib;strmbase.lib;sensapi.lib;wmvcore.lib;DxErr9.lib;Urlmon.lib;zlib.lib;libcurl_a.lib;fmod_vc.lib;%(AdditionalDependencies);</AdditionalDependencies>
+2 -2
View File
@@ -95,7 +95,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
// will cause issues.
if (!G3D::System::hasSSE2())
{
MessageBoxA(NULL, "This platform lacks SSE2 support.", "ROBLOX", MB_OK);
MessageBoxA(NULL, "This platform lacks SSE2 support.", "watrbx", MB_OK);
return false;
}
@@ -143,7 +143,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
{
const char* const errorMessage = e.what();
FASTLOGS(FLog::RobloxWndInit, "Error during initialization. User message = %s", errorMessage);
MessageBoxA(hWnd, errorMessage, "ROBLOX", MB_OK);
MessageBoxA(hWnd, errorMessage, "watrbx", MB_OK);
app.AboutToShutdown();
app.Shutdown();
return FALSE;
+69 -69
View File
@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "functionHooks.h"
#include "robloxHooks.h"
#include "v8datamodel/HackDefines.h"
@@ -12,88 +12,88 @@
namespace
{
size_t moduleStart = 0;
size_t moduleSize = 0xFFFFFFFF;
size_t moduleStart = 0;
size_t moduleSize = 0xFFFFFFFF;
typedef HWND (WINAPI *FindWindowSplice)(LPCTSTR, LPCSTR);
typedef HWND(WINAPI* FindWindowSplice)(LPCTSTR, LPCSTR);
// Can call this function.
FindWindowSplice resumeFindWindow = 0;
// Can call this function.
FindWindowSplice resumeFindWindow = 0;
// asm stub to run when findWindowA is called.
HWND WINAPI findWindowHook(LPCTSTR className, LPCSTR windowName)
{
size_t returnAddress;
size_t argDiff;
static const size_t kHalf = 1 << 23;
static const size_t kFull = 1 << 24;
VMProtectBeginMutation("35");
returnAddress = reinterpret_cast<size_t>(_ReturnAddress());
argDiff = (reinterpret_cast<size_t>(windowName) - returnAddress);
// This is an attempt at a very conservative check for the window. It looks for
// DLLs that called out ROBLOX by name inside their code and not from some scan.
if (windowName // user passed a windowName
&& ((returnAddress - moduleStart) > moduleSize) // but not us
&& ((argDiff+kHalf) < kFull) // Argument is +-8MB from call location, probably .rdata.
&& (_strnicmp(windowName, "ROBLOX", 6) == 0)) // with roblox as argument
// asm stub to run when findWindowA is called.
HWND WINAPI findWindowHook(LPCTSTR className, LPCSTR windowName)
{
RBX::hotpatchUnhook(resumeFindWindow);
RBX::Tokens::simpleToken |= HATE_DLL_INJECTION;
}
VMProtectEnd();
return resumeFindWindow(className,windowName);
}
size_t returnAddress;
size_t argDiff;
static const size_t kHalf = 1 << 23;
static const size_t kFull = 1 << 24;
VMProtectBeginMutation("35");
returnAddress = reinterpret_cast<size_t>(_ReturnAddress());
argDiff = (reinterpret_cast<size_t>(windowName) - returnAddress);
// This will request a kick if a possible access violation hook is found. This will set
// a flag and allow normal exception handling to occur. If the user was not hacking,
// there will be a crash.
void RtlDispatchExceptionCheck(PEXCEPTION_RECORD exRec, PCONTEXT ctx)
{
const DWORD code = exRec->ExceptionCode;
const DWORD codeStart = RBX::Security::rbxTextBase;
const DWORD codeSize = RBX::Security::rbxTextSize;
if( code == EXCEPTION_ACCESS_VIOLATION)
{
const DWORD avAddr = exRec->ExceptionInformation[1];
if ((avAddr - codeStart) <= codeSize)
// This is an attempt at a very conservative check for the window. It looks for
// DLLs that called out ROBLOX by name inside their code and not from some scan.
if (windowName // user passed a windowName
&& ((returnAddress - moduleStart) > moduleSize) // but not us
&& ((argDiff + kHalf) < kFull) // Argument is +-8MB from call location, probably .rdata.
&& (_strnicmp(windowName, "ROBLOX", 6) == 0)) // with roblox as argument
{
RBX::Security::setHackFlagVs<LINE_RAND1>(RBX::Security::hackFlag6, HATE_VEH_HOOK);
RBX::Tokens::sendStatsToken.addFlagFast(HATE_VEH_HOOK);
RBX::hotpatchUnhook(resumeFindWindow);
RBX::Tokens::simpleToken |= HATE_DLL_INJECTION;
}
VMProtectEnd();
return resumeFindWindow(className, windowName);
}
// This will request a kick if a possible access violation hook is found. This will set
// a flag and allow normal exception handling to occur. If the user was not hacking,
// there will be a crash.
void RtlDispatchExceptionCheck(PEXCEPTION_RECORD exRec, PCONTEXT ctx)
{
const DWORD code = exRec->ExceptionCode;
const DWORD codeStart = RBX::Security::rbxTextBase;
const DWORD codeSize = RBX::Security::rbxTextSize;
if (code == EXCEPTION_ACCESS_VIOLATION)
{
const DWORD avAddr = exRec->ExceptionInformation[1];
if ((avAddr - codeStart) <= codeSize)
{
RBX::Security::setHackFlagVs<LINE_RAND1>(RBX::Security::hackFlag6, HATE_VEH_HOOK);
RBX::Tokens::sendStatsToken.addFlagFast(HATE_VEH_HOOK);
}
}
else if ((code == EXCEPTION_BREAKPOINT) ||
(code == EXCEPTION_SINGLE_STEP) ||
(code == EXCEPTION_ILLEGAL_INSTRUCTION) ||
(code == EXCEPTION_PRIV_INSTRUCTION))
{
const DWORD addr = reinterpret_cast<DWORD>(exRec->ExceptionAddress);
if ((addr - codeStart) <= codeSize)
{
RBX::Security::setHackFlagVs<LINE_RAND1>(RBX::Security::hackFlag6, HATE_VEH_HOOK);
RBX::Tokens::sendStatsToken.addFlagFast(HATE_VEH_HOOK);
}
}
}
else if ((code == EXCEPTION_BREAKPOINT) ||
(code == EXCEPTION_SINGLE_STEP) ||
(code == EXCEPTION_ILLEGAL_INSTRUCTION) ||
(code == EXCEPTION_PRIV_INSTRUCTION))
bool cmpKiUserExceptionDispatcher(const char* inString)
{
const DWORD addr = reinterpret_cast<DWORD>(exRec->ExceptionAddress);
if ((addr - codeStart) <= codeSize)
const unsigned char cmpString[26] = { 129, 254, 37, 162, 27, 133, 129, 157, 225, 138, 46, 157, 191, 244, 244, 153, 75, 12, 70, 220, 152, 104, 186, 244, 94, 43 };
if (!inString) return false;
for (int i = 0; i < 26; ++i)
{
RBX::Security::setHackFlagVs<LINE_RAND1>(RBX::Security::hackFlag6, HATE_VEH_HOOK);
RBX::Tokens::sendStatsToken.addFlagFast(HATE_VEH_HOOK);
}
if ((unsigned char)((inString[i] + i) * 227) != cmpString[i]) return false;
if (!inString[i]) return (i == 25);
};
return false;
}
}
bool cmpKiUserExceptionDispatcher(const char* inString)
{
const unsigned char cmpString[26] = {129, 254, 37, 162, 27, 133, 129, 157, 225, 138, 46, 157, 191, 244, 244, 153, 75, 12, 70, 220, 152, 104, 186, 244, 94, 43};
if (!inString) return false;
for (int i = 0; i < 26; ++i)
{
if ((unsigned char)((inString[i]+i)*227) != cmpString[i]) return false;
if (!inString[i]) return (i == 25);
};
return false;
}
const unsigned char kiUserExceptionDispatcherProlog[10] =
{0x8B, 0x4C, 0x24, 0x04, // mov ecx,dword ptr [esp+4]
const unsigned char kiUserExceptionDispatcherProlog[10] =
{ 0x8B, 0x4C, 0x24, 0x04, // mov ecx,dword ptr [esp+4]
0x8B, 0x1C, 0x24, // mov ebx,dword ptr [esp]
0x51, // push ecx
0x53, // push ebx
0xE8 /* XX XX XX XX */}; // call ntdll!RtlDisapatchException
0xE8 /* XX XX XX XX */ }; // call ntdll!RtlDisapatchException
}
@@ -187,7 +187,7 @@ namespace RBX
moduleStart = reinterpret_cast<size_t>(info.lpBaseOfDll);
moduleSize = info.SizeOfImage;
}
resumeFindWindow = reinterpret_cast<FindWindowSplice>(hotpatchHook(&FindWindowA,findWindowHook));
resumeFindWindow = reinterpret_cast<FindWindowSplice>(hotpatchHook(&FindWindowA, findWindowHook));
hookPreVeh();
}