From 0c194bc8046cb3ecb4e4d0577f36a1d3bde58d11 Mon Sep 17 00:00:00 2001 From: boris Date: Thu, 27 Dec 2018 22:42:05 +1300 Subject: bap --- csgo-loader/csgo-client/Client.cpp | 91 ++++++-------------- csgo-loader/csgo-client/Client.hpp | 41 +++++++++ csgo-loader/csgo-client/Login/RemoteLogin.cpp | 28 ++----- csgo-loader/csgo-client/Login/RemoteLogin.hpp | 5 +- .../csgo-client/RemoteCode/RemoteCodeClient.cpp | 37 -------- .../csgo-client/RemoteCode/RemoteCodeClient.hpp | 21 ----- .../RemoteCode/RemoteInjectionClient.cpp | 42 ---------- .../RemoteCode/RemoteInjectionClient.hpp | 18 ---- .../csgo-client/RemoteCode/RemoteProcess.cpp | 22 +++-- .../csgo-client/Security/RuntimeSecurity.cpp | 29 +++++++ .../csgo-client/Security/RuntimeSecurity.hpp | 88 +++++++++++++++++++ .../csgo-client/UserExperience/MoneybotShared/ui.h | 3 - .../csgo-client/UserExperience/UserInterface.cpp | 98 +++++++++++----------- csgo-loader/csgo-client/csgo-client.vcxproj | 16 ++-- .../csgo-client/csgo-client.vcxproj.filters | 7 ++ 15 files changed, 278 insertions(+), 268 deletions(-) create mode 100644 csgo-loader/csgo-client/Client.hpp create mode 100644 csgo-loader/csgo-client/Security/RuntimeSecurity.cpp create mode 100644 csgo-loader/csgo-client/Security/RuntimeSecurity.hpp (limited to 'csgo-loader/csgo-client') diff --git a/csgo-loader/csgo-client/Client.cpp b/csgo-loader/csgo-client/Client.cpp index dc08da2..0f29f29 100644 --- a/csgo-loader/csgo-client/Client.cpp +++ b/csgo-loader/csgo-client/Client.cpp @@ -1,95 +1,58 @@ -#include -#include -#include -#include -#include -#include - -#define LOCAL_IP 0x0100007F // '127.0.0.1' -#define SERVER_IP 0xE53CA523 // Hexadecimal representation of the server IP, obtained by inet_addr() -#define SERVER_PORT 0xF2C // Hexadecimal representation of the server port. - -// hey nave just wanna let u know u r epic -// yea -#if 0 -void hhahahaha() -{ - std::thread WindowThread([] - { - if(!UserInterface->Start()) - ERROR_ASSERT("[000F:00001B00] Failed to initialize. Please contact an administrator."); - - UserInterface->RunUiFrame(); - }); WindowThread.detach(); - - UserInterface->m_Data.m_ExecutionState = UserExperience::EXECUTION_LOG_IN; - - while(UserInterface->m_Data.m_ExecutionState != UserExperience::EXECUTION_WAITING) - Sleep(1); - - Login::RemoteLoginTransaction Transaction; - Transaction.Start(UserInterface->m_Data.m_Username, UserInterface->m_Data.m_Password); - - ByteArray RawLoginHeader = Transaction.GetHeader(); - Client.SendBytes(RawLoginHeader); - - ByteArray RawServerResponse = Client.ReceiveBytes(); - if(!Transaction.TranslateResponse(RawServerResponse)) - { - UserInterface->m_Data.m_ExecutionState = UserExperience::EXECUTION_ERROR; - } - else - { - UserInterface->m_Data.m_ExecutionState = UserExperience::EXECUTION_CHOOSE; - } -} -#endif - -// is this loss/ -__forceinline void OpenConsole() -{ -#ifdef DEBUG - // ;ddDDDDdDDDd - AllocConsole(); - - // yo dude - // get this handles - FILE *file; - freopen_s(&file, "CONOUT$", "w", stdout); -#endif // DEBUG -} +#include int __stdcall WinMain(HINSTANCE inst, HINSTANCE prev, char* str, int cmdshow) { - OpenConsole(); + WRAP_IF_DEBUG(Utils::OpenConsole()); - Networking::TCPClient Client; + WRAP_IF_RELEASE(VM_DOLPHIN_BLACK_START); + WRAP_IF_RELEASE(STR_ENCRYPT_START); + + // Initialize the runtime protection system. + if(!Protection->Start()) + ERROR_ASSERT("[000F:00001A00] Failed to initialize. Please contact an administrator."); // Initialize the syscall manager. if(!Syscalls->Start()) ERROR_ASSERT("[000F:00001A00] Failed to initialize. Please contact an administrator."); - + + WRAP_IF_RELEASE(STR_ENCRYPT_END); + WRAP_IF_RELEASE(VM_DOLPHIN_BLACK_END); + // Wait for connection. UserInterface->m_Data.m_ExecutionState = UserExperience::EXECUTION_WAITING; // Create a thread to handle UI. std::thread WindowThread([] { + WRAP_IF_RELEASE(VM_SHARK_BLACK_START); + WRAP_IF_RELEASE(STR_ENCRYPT_START); + // Create a window, initialise DirectX context. if(!UserInterface->Start()) ERROR_ASSERT("[000F:00001B00] Failed to initialize. Please contact an administrator."); + WRAP_IF_RELEASE(STR_ENCRYPT_END); + WRAP_IF_RELEASE(VM_SHARK_BLACK_END); + // Create a loop to draw our UI. UserInterface->RunUiFrame(); }); WindowThread.detach(); + WRAP_IF_RELEASE(VM_EAGLE_BLACK_START); + // Attempt to connect to the remote server. + Networking::TCPClient Client; if(!Client.Start(LOCAL_IP, SERVER_PORT)) ERROR_ASSERT("[000F:0002A000] Server did not accept the connection."); + + WRAP_IF_RELEASE(VM_EAGLE_BLACK_END); + // Allow the user to input their log-in data. UserInterface->m_Data.m_ExecutionState = UserExperience::EXECUTION_LOG_IN; - // TODO: Add game selection. + while(UserInterface->m_Data.m_ExecutionState != UserExperience::EXECUTION_WAITING) + Sleep(1); + // TODO: Add game selection. while(1) { if(GetAsyncKeyState(VK_END) & 0x8000) break; Sleep(1); } } \ No newline at end of file diff --git a/csgo-loader/csgo-client/Client.hpp b/csgo-loader/csgo-client/Client.hpp new file mode 100644 index 0000000..fb1f623 --- /dev/null +++ b/csgo-loader/csgo-client/Client.hpp @@ -0,0 +1,41 @@ +#pragma once + +// NOTE: +// THE FOLLOWING MACROS ARE USED ONLY IN CLIENT.CPP +// PLEASE UPDATE THEM ACCORDINGLY. +#define LOCAL_IP 0x0100007F // '127.0.0.1' +#define SERVER_IP 0xE53CA523 // Hexadecimal representation of the server IP, obtained by inet_addr() +#define SERVER_PORT 0xF2C // Hexadecimal representation of the server port. + +// Security features (these will be initialised and ran +// first, failure will terminate loader execution). +#include +#include + +// Core functionality +#include +#include + +// Loader functionality +#include + +#include +#include +#include + +// It looked nasty in Client.cpp, so I'm putting it here. +namespace Utils +{ + inline void OpenConsole() + { + // Create instance of console. + AllocConsole(); + + // Allow console to access output stream. + FILE *file; + freopen_s(&file, "CONOUT$", "w", stdout); + + // :^) + SetConsoleTitleA("moneyclient $"); + } +} \ No newline at end of file diff --git a/csgo-loader/csgo-client/Login/RemoteLogin.cpp b/csgo-loader/csgo-client/Login/RemoteLogin.cpp index b6912d8..a725a6b 100644 --- a/csgo-loader/csgo-client/Login/RemoteLogin.cpp +++ b/csgo-loader/csgo-client/Login/RemoteLogin.cpp @@ -3,7 +3,7 @@ // Change this whenever a major client update is made. // NOTE: You must change this on the server as well. -#define CURRENT_CLIENT_HEADER 0xDEADBEEF +#define CURRENT_CLIENT_HEADER 0x62746324 namespace Login { @@ -17,10 +17,11 @@ namespace Login strcpy_s< 128 >(m_Header.m_Password, Password); // Initialise the header with the Hardware ID. - m_Header.m_HardwareId = GetHardwareId(); + m_Header.m_HardwareId = 0xFFFFFFFF; // TODO: Verify integrity of system. - m_Header.m_IntegrityBit1 = 0; // 0 for integrity passed, random bit for failure + // 0 for integrity passed, random bit for failure + m_Header.m_IntegrityBit1 = 0; m_Header.m_IntegrityBit2 = 0; m_Header.m_IntegrityBit3 = 0; @@ -31,21 +32,10 @@ namespace Login } // TODO: Hardware ID check. - ByteArray RemoteLoginTransaction::DoWmiQuery(const char *Query) - { - ByteArray Response{}; - - return Response; - } - - uint32_t RemoteLoginTransaction::GetHardwareId() - { - return 123456789; - } bool RemoteLoginTransaction::TranslateResponse(ByteArray &RawResponse) { - RemoteLoginResponse ServerResponse = *reinterpret_cast(&RawResponse[0]); + RemoteLoginResponse ServerResponse = *(RemoteLoginResponse *)&RawResponse[0]; switch(ServerResponse) { @@ -55,20 +45,20 @@ namespace Login case RemoteLoginResponse::ACCESS_AUTHORISED: return true; case RemoteLoginResponse::OUTDATED_CLIENT: - INFO_ASSERT("[000A:%08x] Your client is outdated.\nPlease download the latest client at 'moneybot.cc'.", m_Header.m_HardwareId); + INFO_ASSERT("[000A:%08x] Your client is outdated.\nPlease download the latest client at 'moneybot.cc'.", m_Header.m_HardwareId ^ ServerResponse); break; case RemoteLoginResponse::USER_BANNED: - INFO_ASSERT("[000D:%08x] Your account is banned.\nPlease contact 'admin@moneybot.cc' for additional information.", m_Header.m_HardwareId); + INFO_ASSERT("[000D:%08x] Your account is banned.\nPlease contact 'admin@moneybot.cc' for additional information.", m_Header.m_HardwareId ^ ServerResponse); break; case RemoteLoginResponse::INVALID_HARDWARE: UserInterface->m_Data.m_Error = UserExperience::ERROR_INVALID_HWID; break; case RemoteLoginResponse::INVALID_CREDENTIALS: - INFO_ASSERT("[000C:%08x] Your credentials are invalid. Please check your spelling and try again.", m_Header.m_HardwareId); + INFO_ASSERT("[000C:%08x] Your credentials are invalid. Please check your spelling and try again.", m_Header.m_HardwareId ^ ServerResponse); break; case RemoteLoginResponse::INTEGRITY_FAILURE: case RemoteLoginResponse::NO_SUBSCRIPTION: - INFO_ASSERT("[000G:%08x] No active subscription found.", m_Header.m_HardwareId); + INFO_ASSERT("[0005:%08x] No active subscription found.", m_Header.m_HardwareId ^ ServerResponse); break; } diff --git a/csgo-loader/csgo-client/Login/RemoteLogin.hpp b/csgo-loader/csgo-client/Login/RemoteLogin.hpp index 31649c6..8e819fe 100644 --- a/csgo-loader/csgo-client/Login/RemoteLogin.hpp +++ b/csgo-loader/csgo-client/Login/RemoteLogin.hpp @@ -56,10 +56,7 @@ namespace Login void Start(const char *Username, const char *Password); // Obtains the hardware ID of the current machine in use. - uint32_t GetHardwareId(); - - // Queries the WMI for data. - ByteArray DoWmiQuery(const char *Query); + // TODO: HWID // Translates server response, determines whether or not the // user can access the client. NOTE: Server will drop the client if diff --git a/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.cpp b/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.cpp index c62812b..5a42b6c 100644 --- a/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.cpp +++ b/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.cpp @@ -1,43 +1,6 @@ #include -// i kinda stopped caring at this point - namespace RemoteCode { - RemoteCodeParameters RemoteCodeClient::Start(RemoteProcess &Process) - { - // Copy over process. - m_Process = Process; - - // PSA: If the loader crashes CS:GO, this is most definitely the reason. - HANDLE ShaderApi = Process.FindModule("shaderapidx9.dll"); - void *D3D_DevicePtr = (void *)((uintptr_t)ShaderApi + 0xA3FC0); - - // Read the VTable. - // TODO: Check if process is 32-bit or 64-bit.... nah fuck that lol - void *D3D_VtablePtr = Process.Read(D3D_DevicePtr); - m_DirectX = Process.Read((void *)((uintptr_t)D3D_VtablePtr + 42 * 4)); - - RemoteCodeParameters Parameters{ - (uintptr_t)D3D_VtablePtr, - m_DirectX, - 0x00000000, - 0x00000000, - (uintptr_t)VirtualProtect - }; - - m_DirectX = (uintptr_t)D3D_VtablePtr; - - return Parameters; - } - - void RemoteCodeClient::Dispatch(ByteArray &Shellcode) - { - // Allocate and set-up shellcode. - void *AllocationBase = m_Process.Allocate(Shellcode.size()); - m_Process.Write(AllocationBase, Shellcode.data(), Shellcode.size()); - // Hijack D3D thread. - m_Process.Write((void *)(m_DirectX + 42 * 4), (uintptr_t)AllocationBase); - } } \ No newline at end of file diff --git a/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.hpp b/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.hpp index 6794403..964d055 100644 --- a/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.hpp +++ b/csgo-loader/csgo-client/RemoteCode/RemoteCodeClient.hpp @@ -4,29 +4,8 @@ namespace RemoteCode { - struct RemoteCodeParameters - { - uintptr_t m_EndSceneVmt; // client - uintptr_t m_OriginalEndScene; // client - uintptr_t m_EntryPoint; // server - uintptr_t m_CheatHeader; // server (this can also be constant but hey..) - uintptr_t m_VirtualProtect; // client - }; - class RemoteCodeClient { - ByteArray m_Code; - RemoteProcess m_Process; - uintptr_t m_DirectX; - - public: - RemoteCodeClient() = default; - - // Send server the allocation address. - // This will also send the original and vmt address of endscene. - RemoteCodeParameters Start(RemoteProcess &Process); - // Allocate, write and then dispatch the shellcode. - void Dispatch(ByteArray &Shellcode); }; } \ No newline at end of file diff --git a/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.cpp b/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.cpp index b8ff03d..01f52be 100644 --- a/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.cpp +++ b/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.cpp @@ -2,47 +2,5 @@ namespace RemoteCode { - // Select a game to inject the cheat for - bool RemoteInjectionClient::Start(UserExperience::SelectedGame Game) - { - if(Game >= UserExperience::SelectedGame::GAME_MAX) - return false; - // TODO: Add any other games :-) - switch(Game) - { - case UserExperience::SelectedGame::GAME_CSGO: - case UserExperience::SelectedGame::GAME_CSGO_BETA: - strcpy_s(m_ProcessName, "csgo.exe"); - break; - } - - return true; - } - - // Allocates a page in the game memory, which will be used to - // write and execute the DLL. - uintptr_t RemoteInjectionClient::AllocateImagePage(size_t SizeOfImage) - { - if(!m_Process) - return uintptr_t{}; - - // Allocate enough space to map the image - m_AllocationBase = m_Process.Allocate(SizeOfImage); - - return (uintptr_t)m_AllocationBase; - } - - // Initializes m_Process with the game process. - bool RemoteInjectionClient::OpenGameHandle() - { - return m_Process.Start(m_ProcessName); - } - - // Writes the cheat binary to the allocated page. - void RemoteInjectionClient::WriteToMap(ByteArray &CheatBin) - { - // is this loss? - m_Process.Write(m_AllocationBase, CheatBin.data(), CheatBin.size()); - } } \ No newline at end of file diff --git a/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.hpp b/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.hpp index 5880174..6699a9e 100644 --- a/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.hpp +++ b/csgo-loader/csgo-client/RemoteCode/RemoteInjectionClient.hpp @@ -7,24 +7,6 @@ namespace RemoteCode { class RemoteInjectionClient { - ByteArray m_Data; - RemoteProcess m_Process; - char m_ProcessName[64]; - void *m_AllocationBase; - public: - RemoteInjectionClient() = default; - - // Select a game to inject the cheat for - bool Start(UserExperience::SelectedGame Game); - - // Allocates a page in the game memory, which will be used to - // write and execute the DLL. - uintptr_t AllocateImagePage(size_t SizeOfImage); - - // Initializes m_Process with the game process. - bool OpenGameHandle(); - - void WriteToMap(ByteArray &CheatBin); }; } \ No newline at end of file diff --git a/csgo-loader/csgo-client/RemoteCode/RemoteProcess.cpp b/csgo-loader/csgo-client/RemoteCode/RemoteProcess.cpp index 8d2509f..6893498 100644 --- a/csgo-loader/csgo-client/RemoteCode/RemoteProcess.cpp +++ b/csgo-loader/csgo-client/RemoteCode/RemoteProcess.cpp @@ -29,6 +29,10 @@ namespace RemoteCode // swoo m_ProcessId = ProcessEntry.th32ProcessID; m_Process = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessEntry.th32ProcessID); + + if(!m_Process) + ERROR_ASSERT("[000G:%08x] There was an error with accessing a process.", GetLastError()); + return true; } } @@ -40,13 +44,19 @@ namespace RemoteCode void RemoteProcess::ReadMemoryWrapper_Internal(void *Address, void *Data, size_t SizeOfData) { static auto ZwReadVirtualMemory = Syscalls->Find(FNV("ZwReadVirtualMemory")); - ZwReadVirtualMemory(m_Process, Address, Data, SizeOfData, nullptr); + NTSTATUS Status = ZwReadVirtualMemory(m_Process, Address, Data, SizeOfData, nullptr); + + if(NT_ERROR(Status)) + ERROR_ASSERT("[00DF:%08x] There was an error with accessing a process.", Status); } void RemoteProcess::WriteMemoryWrapper_Internal(void *Address, void *Data, size_t SizeOfData) { static auto ZwWriteVirtualMemory = Syscalls->Find(FNV("ZwWriteVirtualMemory")); - ZwWriteVirtualMemory(m_Process, Address, Data, SizeOfData, nullptr); + NTSTATUS Status = ZwWriteVirtualMemory(m_Process, Address, Data, SizeOfData, nullptr); + + if(NT_ERROR(Status)) + ERROR_ASSERT("[00DF:%08x] There was an error with accessing a process.", Status); } void *RemoteProcess::Allocate(size_t AllocationSize) @@ -64,8 +74,8 @@ namespace RemoteCode PAGE_EXECUTE_READWRITE ); - if(!NT_SUCCESS(Status)) - return nullptr; + if(NT_ERROR(Status)) + ERROR_ASSERT("[00DF:%08x] There was an error with accessing a process.", Status); return AllocationAddress; } @@ -85,9 +95,11 @@ namespace RemoteCode while(Module32Next(Toolhelp, &ModuleEntry)) { - //printf("%s\n", ModuleEntry.szModule); if(strstr(ModuleEntry.szModule, ModuleName)) { + if(!ModuleEntry.hModule) + ERROR_ASSERT("[00DF:00001C00] An integrity check failed."); + CloseHandle(Toolhelp); return RemoteModule(ModuleEntry.hModule); } diff --git a/csgo-loader/csgo-client/Security/RuntimeSecurity.cpp b/csgo-loader/csgo-client/Security/RuntimeSecurity.cpp new file mode 100644 index 0000000..305a44f --- /dev/null +++ b/csgo-loader/csgo-client/Security/RuntimeSecurity.cpp @@ -0,0 +1,29 @@ +#include +#include + +// Global accessor to security instance. +Security::RuntimeSecurityPtr Protection = std::make_unique(); + +namespace Security +{ + decltype(&MessageBoxA) oMessageBox; + int __stdcall Hooked_MessageBox(HWND Window, char *Message, char *Caption, uint32_t Type) + { + MEMORY_BASIC_INFORMATION Query; + if(!VirtualQuery(_ReturnAddress(), &Query, sizeof MEMORY_BASIC_INFORMATION)) + ERROR_ASSERT("[00DF:00002C00] An integrity check failed."); + + return oMessageBox(Window, Message, Caption, Type); + } + + bool RuntimeSecurity::Start() + { + if(MH_Initialize() != MH_OK) + return false; + + MH_CreateHook(&MessageBoxA, Hooked_MessageBox, (void **)&oMessageBox); + MH_EnableHook(&MessageBoxA); + + return true; + } +} \ No newline at end of file diff --git a/csgo-loader/csgo-client/Security/RuntimeSecurity.hpp b/csgo-loader/csgo-client/Security/RuntimeSecurity.hpp new file mode 100644 index 0000000..77ec94c --- /dev/null +++ b/csgo-loader/csgo-client/Security/RuntimeSecurity.hpp @@ -0,0 +1,88 @@ +#pragma once + +// std::unique_ptr +#include + +// Intrinsics (_ReturnAddress) +#include + +// Required for the SDK from Themida which offers multiple +// virtual machines and string encryption, as well as debug/VM checks. +#include + +// Required for MinHook. +#include +#pragma comment(lib, "MinHook.lib") + +// Used for wrapping Themida's macros along with some other things. +// e.g: WRAP_IF_RELEASE( VM_SHARK_BLACK_START ) will only trigger in Release mode. +// Likewise, WRAP_IF_DEBUG( printf( "Error: %08x", GetLastError() ) ) will only +// trigger in Debug mode. +// Just a neat little feature that I decided to implement :-) +#ifdef DEBUG + #define WRAP_IF_RELEASE( s ) + #define WRAP_IF_DEBUG( s ) { s; } +#else + #define WRAP_IF_RELEASE( s ) { s; } + #define WRAP_IF_DEBUG( s ) + + // Link against Themida's SecureEngine. + #pragma comment(lib, "SecureEngine.lib") +#endif + +namespace Security +{ + // Hardware ID structure (this is hashed and sent to server, but it's easier to use it + // this way internally) + struct HardwareIdentifier + { + // Generic CPU information. + uint16_t m_CpuArchitecture; + uint32_t m_CpuCount; + + // String-literal - contains list of CPU features. + char m_CpuFeatures[64]; + + // Hash of the hard disk serial identifier. + uint32_t m_HardDiskSerialHash; + }; + + // This class implements the runtime security system. + // In short, upon initialization, the system applies detours to numerous API functions + // which will be checked for integrity every time they are called. + // Also, a few threads are dispatched in the process in order to ensure that there are no + // forbidden programs/conditions being triggered. + // The class has an (inlined) security callback which can be used to phone home and infract/ban + // any potentially malicious actions from users. + class RuntimeSecurity + { + protected: + // Applies necessary API hooks. + void ApplyApiHooks_Internal(); + + // Patches common debugging functions to crash the program. + void PatchDebugFunctions_Internal(); + + // Dispatches security threads. + void DispatchSecurityThreads_Internal(); + + // The following functions are used in security threads to run checks. + bool CheckForVirtualMachine_Internal(); + + bool CheckForDebugger_Internal(); + + bool CheckForApiHooks_Internal(); + + public: + // Initializes the runtime security system. + bool Start(); + + // Retrieves the current Hardware ID for the system. + + }; + + // Readability + using RuntimeSecurityPtr = std::unique_ptr; +} + +extern Security::RuntimeSecurityPtr Protection; \ No newline at end of file diff --git a/csgo-loader/csgo-client/UserExperience/MoneybotShared/ui.h b/csgo-loader/csgo-client/UserExperience/MoneybotShared/ui.h index b061cd5..4d89936 100644 --- a/csgo-loader/csgo-client/UserExperience/MoneybotShared/ui.h +++ b/csgo-loader/csgo-client/UserExperience/MoneybotShared/ui.h @@ -42,9 +42,6 @@ namespace ui { auto error_form = menu->add_item(std::make_shared(120, 20, 190, 115, "error")); { - error_form->add_item(std::make_shared(25, 15, "contact an administrator."))->set_cond([] { - return UserInterface->m_Data.m_Error == UserExperience::ERROR_SHADOW_BAN; - }); error_form->add_item(std::make_shared(30, 15, "hardware id mismatch."))->set_cond([] { return UserInterface->m_Data.m_Error == UserExperience::ERROR_INVALID_HWID; }); diff --git a/csgo-loader/csgo-client/UserExperience/UserInterface.cpp b/csgo-loader/csgo-client/UserExperience/UserInterface.cpp index af1b384..75b79b2 100644 --- a/csgo-loader/csgo-client/UserExperience/UserInterface.cpp +++ b/csgo-loader/csgo-client/UserExperience/UserInterface.cpp @@ -11,65 +11,65 @@ namespace UserExperience { void OnDirectXFrame() { - if(g_d3d.run_frame(g_window.m_d3d_device)) - { - g_d3d.begin(); - for(auto& it : d3d::sprites) - { - it->begin(g_window.m_d3d_device); - } - - static auto last_time = GetTickCount() * 0.001f; - auto cur_time = GetTickCount() * 0.001f; - - auto deltatime = cur_time - last_time; - - last_time = cur_time; - - constexpr float anim_step = 1.0f / 15.f; - static float anim_time = 0.f; - static bool flip = false; - if(anim_time == 1.0f) - { - flip = true; - } - if(anim_time == 0.f) - { - flip = false; - } - - if(flip) anim_time = std::clamp(anim_time - anim_step * deltatime, 0.f, 1.0f); - else anim_time = std::clamp(anim_time + anim_step * deltatime, 0.f, 1.0f); - - ui::set_animtime(anim_time); - ui::render(); - - RECT cur_rect{ }; - GetWindowRect(g_window.get_hwnd(), &cur_rect); - - g_d3d.end(); - for(auto& it : d3d::sprites) - { - it->end(); - } + if(g_d3d.run_frame(g_window.m_d3d_device)) + { + g_d3d.begin(); + for(auto& it : d3d::sprites) + { + it->begin(g_window.m_d3d_device); + } + + static auto last_time = GetTickCount() * 0.001f; + auto cur_time = GetTickCount() * 0.001f; + + auto deltatime = cur_time - last_time; + + last_time = cur_time; + + constexpr float anim_step = 1.0f / 15.f; + static float anim_time = 0.f; + static bool flip = false; + if(anim_time == 1.0f) + { + flip = true; + } + if(anim_time == 0.f) + { + flip = false; + } + + if(flip) anim_time = std::clamp(anim_time - anim_step * deltatime, 0.f, 1.0f); + else anim_time = std::clamp(anim_time + anim_step * deltatime, 0.f, 1.0f); + + ui::set_animtime(anim_time); + ui::render(); + + RECT cur_rect{ }; + GetWindowRect(g_window.get_hwnd(), &cur_rect); + + g_d3d.end(); + for(auto& it : d3d::sprites) + { + it->end(); + } } } bool UserInterface::Start() { - bool result = g_window.create(); - - if(result) - { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - g_window.add_on_frame(&OnDirectXFrame); + bool result = g_window.create(); + + if(result) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + g_window.add_on_frame(&OnDirectXFrame); } return result; } - void UserInterface::RunUiFrame() - { + void UserInterface::RunUiFrame() + { g_window.on_frame(); } } \ No newline at end of file diff --git a/csgo-loader/csgo-client/csgo-client.vcxproj b/csgo-loader/csgo-client/csgo-client.vcxproj index 5c839dc..f3fa98f 100644 --- a/csgo-loader/csgo-client/csgo-client.vcxproj +++ b/csgo-loader/csgo-client/csgo-client.vcxproj @@ -26,6 +26,7 @@ + @@ -35,6 +36,7 @@ + @@ -42,6 +44,7 @@ + @@ -124,15 +127,15 @@ $(SolutionDir)bin\$(Configuration)\ $(SolutionDir)build\$(Configuration)\Client\ $(ExecutablePath) - $(SolutionDir)themida-sdk\include;$(DXSDK_DIR)\Include;$(ProjectDir);$(VC_IncludePath);$(WindowsSDK_IncludePath); - $(SolutionDir)themida-sdk\lib;$(DXSDK_DIR)\Lib\x64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 + $(SolutionDir)shared\include;$(DXSDK_DIR)\Include;$(ProjectDir);$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(SolutionDir)shared\lib;$(DXSDK_DIR)\Lib\x64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 $(SolutionDir)bin\$(Configuration)\ $(SolutionDir)build\$(Configuration)\Client\ $(ExecutablePath) - $(SolutionDir)themida-sdk\include;$(DXSDK_DIR)\Include;$(ProjectDir);$(VC_IncludePath);$(WindowsSDK_IncludePath); - $(SolutionDir)themida-sdk\lib;$(DXSDK_DIR)\Lib\x64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 + $(SolutionDir)shared\include;$(DXSDK_DIR)\Include;$(ProjectDir);$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(SolutionDir)shared\lib;$(DXSDK_DIR)\Lib\x64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 @@ -151,7 +154,8 @@ _WINSOCK_DEPRECATED_NO_WARNINGS;WIN32_LEAN_AND_MEAN;NOMINMAX;DEBUG;_MBCS;%(PreprocessorDefinitions) true stdcpp17 - 4100;4189;4244;4267;4522;4714;4838; + 4100;4189;4244;4267;4522;4714;4838;4307;4706;4702 + MultiThreadedDLL RequireAdministrator @@ -184,7 +188,7 @@ _WINSOCK_DEPRECATED_NO_WARNINGS;WIN32_LEAN_AND_MEAN;NOMINMAX;_MBCS;%(PreprocessorDefinitions) true stdcpp17 - 4100;4189;4244;4267;4522;4714;4838; + 4100;4189;4244;4267;4522;4714;4838;4307;4706;4702 true diff --git a/csgo-loader/csgo-client/csgo-client.vcxproj.filters b/csgo-loader/csgo-client/csgo-client.vcxproj.filters index 049be28..d6bb0c4 100644 --- a/csgo-loader/csgo-client/csgo-client.vcxproj.filters +++ b/csgo-loader/csgo-client/csgo-client.vcxproj.filters @@ -61,6 +61,9 @@ RemoteCode + + Security + @@ -162,5 +165,9 @@ RemoteCode + + + Security + \ No newline at end of file -- cgit v1.2.3