diff options
| author | auth12 <[email protected]> | 2020-08-28 17:02:54 +0100 |
|---|---|---|
| committer | auth12 <[email protected]> | 2020-08-28 17:02:54 +0100 |
| commit | 1b7783f8e0b864d81c8ab7bb4d83cd2f789b0d48 (patch) | |
| tree | da0324fe611754ac7a816c9a96eafa84a8cf5e4b | |
| parent | Improved CPU usage drastically. (diff) | |
| download | loader-1b7783f8e0b864d81c8ab7bb4d83cd2f789b0d48.tar.xz loader-1b7783f8e0b864d81c8ab7bb4d83cd2f789b0d48.zip | |
Added version checks on server.
Changed main thread behaviour.
Fixed events bug where packet seq would get corrupted.
Changed session packet behaviour.
| -rw-r--r-- | client/client.sln | 10 | ||||
| -rw-r--r-- | client/client.vcxproj | 82 | ||||
| -rw-r--r-- | client/client.vcxproj.filters | 12 | ||||
| -rw-r--r-- | client/src/client/client.h | 17 | ||||
| -rw-r--r-- | client/src/client/packet.h | 1 | ||||
| -rw-r--r-- | client/src/main.cpp | 105 | ||||
| -rw-r--r-- | client/src/security/security.cpp | 34 | ||||
| -rw-r--r-- | client/src/ui/ui.cpp | 4 | ||||
| -rw-r--r-- | client/src/util/events.h | 4 | ||||
| -rw-r--r-- | client/src/util/io.cpp | 2 | ||||
| -rw-r--r-- | client/src/util/io.h | 13 | ||||
| -rw-r--r-- | client/src/util/util.cpp | 5 | ||||
| m--------- | client/wolfssl | 0 | ||||
| -rw-r--r-- | server/src/client/client.h | 8 | ||||
| -rw-r--r-- | server/src/main.cpp | 108 | ||||
| -rw-r--r-- | server/src/server/packet.h | 1 | ||||
| -rw-r--r-- | server/src/server/server.cpp | 2 |
17 files changed, 285 insertions, 123 deletions
diff --git a/client/client.sln b/client/client.sln index f4f8604..54dd02b 100644 --- a/client/client.sln +++ b/client/client.sln @@ -18,6 +18,8 @@ Global DLL Debug|x86 = DLL Debug|x86 DLL Release|x64 = DLL Release|x64 DLL Release|x86 = DLL Release|x86 + Production|x64 = Production|x64 + Production|x86 = Production|x86 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection @@ -34,6 +36,10 @@ Global {AB29EDA2-1C4F-4476-945B-AC08756EED67}.DLL Release|x64.Build.0 = Release|x64 {AB29EDA2-1C4F-4476-945B-AC08756EED67}.DLL Release|x86.ActiveCfg = Release|Win32 {AB29EDA2-1C4F-4476-945B-AC08756EED67}.DLL Release|x86.Build.0 = Release|Win32 + {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Production|x64.ActiveCfg = Production|x64 + {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Production|x64.Build.0 = Production|x64 + {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Production|x86.ActiveCfg = Production|Win32 + {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Production|x86.Build.0 = Production|Win32 {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Release|x64.ActiveCfg = Release|x64 {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Release|x64.Build.0 = Release|x64 {AB29EDA2-1C4F-4476-945B-AC08756EED67}.Release|x86.ActiveCfg = Release|Win32 @@ -50,6 +56,10 @@ Global {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.Build.0 = DLL Release|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x86.ActiveCfg = DLL Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x86.Build.0 = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Production|x64.ActiveCfg = Production|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Production|x64.Build.0 = Production|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Production|x86.ActiveCfg = Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Production|x86.Build.0 = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.ActiveCfg = Release|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.Build.0 = Release|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x86.ActiveCfg = Release|Win32 diff --git a/client/client.vcxproj b/client/client.vcxproj index ac79152..d891f0d 100644 --- a/client/client.vcxproj +++ b/client/client.vcxproj @@ -5,6 +5,14 @@ <Configuration>Debug</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> + <ProjectConfiguration Include="Production|Win32"> + <Configuration>Production</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Production|x64"> + <Configuration>Production</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> <ProjectConfiguration Include="Release|Win32"> <Configuration>Release</Configuration> <Platform>Win32</Platform> @@ -39,6 +47,13 @@ <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v142</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> @@ -52,6 +67,13 @@ <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>MultiByte</CharacterSet> </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v142</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <ImportGroup Label="ExtensionSettings"> </ImportGroup> @@ -63,12 +85,18 @@ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> </ImportGroup> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> @@ -76,6 +104,9 @@ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> </PropertyGroup> @@ -85,6 +116,12 @@ <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir> <GenerateManifest>false</GenerateManifest> </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir> + <GenerateManifest>false</GenerateManifest> + </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <WarningLevel>Level3</WarningLevel> @@ -113,6 +150,22 @@ <GenerateDebugInformation>true</GenerateDebugInformation> </Link> </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> <WarningLevel>Level3</WarningLevel> @@ -152,6 +205,35 @@ </SectionAlignment> </Link> </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Production|x64'"> + <ClCompile> + <WarningLevel>TurnOffAllWarnings</WarningLevel> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>NDEBUG;_CONSOLE;NOMINMAX;WIN32_LEAN_AND_MEAN;_WINSOCK_DEPRECATED_NO_WARNINGS;FMT_HEADER_ONLY;IMGUI_DISABLE_INCLUDE_IMCONFIG_H;_REL;JM_XORSTR_DISABLE_AVX_INTRINSICS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <LanguageStandard>stdcpplatest</LanguageStandard> + <AdditionalIncludeDirectories>$(DXSDK_DIR)include\;$(SolutionDir);$(SolutionDir)wolfssl;$(SolutionDir)..\shared;$(SolutionDir)..\shared\spdlog\include;$(IncludePath)</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>Sync</ExceptionHandling> + <Optimization>Full</Optimization> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>false</GenerateDebugInformation> + <AdditionalDependencies>wolfssl.lib;ws2_32.lib;d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\x64\;$(SolutionDir)lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <UACExecutionLevel>RequireAdministrator</UACExecutionLevel> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <SectionAlignment> + </SectionAlignment> + </Link> + </ItemDefinitionGroup> <ItemGroup> <ClInclude Include="src\client\ca.h" /> <ClInclude Include="src\hwid\hwid.h" /> diff --git a/client/client.vcxproj.filters b/client/client.vcxproj.filters index 8b22397..3fd52a6 100644 --- a/client/client.vcxproj.filters +++ b/client/client.vcxproj.filters @@ -51,9 +51,6 @@ <ClInclude Include="src\client\packet.h"> <Filter>src\client</Filter> </ClInclude> - <ClInclude Include="src\util\events.h"> - <Filter>src\util</Filter> - </ClInclude> <ClInclude Include="src\injection\mapper.h"> <Filter>src\injection</Filter> </ClInclude> @@ -114,6 +111,9 @@ <ClInclude Include="src\ui\imgui\imgui_impl_dx9.h"> <Filter>src\ui\imgui</Filter> </ClInclude> + <ClInclude Include="src\util\events.h"> + <Filter>src\util</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="src\main.cpp"> @@ -140,9 +140,6 @@ <ClCompile Include="src\util\apiset.cpp"> <Filter>src\util\apiset</Filter> </ClCompile> - <ClCompile Include="src\security\security.cpp"> - <Filter>src\security</Filter> - </ClCompile> <ClCompile Include="src\ui\imgui\imgui_impl_win32.cpp"> <Filter>src\ui\imgui</Filter> </ClCompile> @@ -164,5 +161,8 @@ <ClCompile Include="src\ui\imgui\imgui_impl_dx9.cpp"> <Filter>src\ui\imgui</Filter> </ClCompile> + <ClCompile Include="src\security\security.cpp"> + <Filter>src\security</Filter> + </ClCompile> </ItemGroup> </Project>
\ No newline at end of file diff --git a/client/src/client/client.h b/client/src/client/client.h index 372affc..bc87414 100644 --- a/client/src/client/client.h +++ b/client/src/client/client.h @@ -24,7 +24,7 @@ struct game_data_t { namespace tcp { enum client_state { - connecting = 0, idle, logging_in, logged_in, imports_ready, waiting, image_ready, injected + connecting = 0, idle, logging_in, logged_in, imports_ready, waiting, image_ready, injected, blacklisted }; enum login_result { @@ -35,10 +35,11 @@ namespace tcp { server_error = 98679 }; - enum session_result { - hwid_fail = 4567, + enum hwid_result { + hwid_fail = 5671, + hwid_blacklisted = 4567, version_mismatch = 5472, - session_ok = 3247 + ok = 3247 }; class client { @@ -47,13 +48,10 @@ namespace tcp { WOLFSSL* m_server_ssl; WOLFSSL_CTX* m_ssl_ctx; - - std::mutex write_lock; - public: int state; int login_result; - int session_result; + int hwid_result; mapper_data_t mapper_data; std::vector<game_data_t> games; game_data_t selected_game; @@ -64,7 +62,7 @@ namespace tcp { uint16_t ver = 4672; - client() : m_socket{ -1 }, m_active{ false }, state{ client_state::connecting }, m_server_ssl{ nullptr }, m_ssl_ctx{ nullptr }, login_result{ -1 }, session_result{ -1 } {} + client() : m_socket{ -1 }, m_active{ false }, state{ client_state::connecting }, m_server_ssl{ nullptr }, m_ssl_ctx{ nullptr }, login_result{ -1 }, hwid_result{ -1 } {} void start(const std::string_view server_ip, const uint16_t port); @@ -74,7 +72,6 @@ namespace tcp { } __forceinline int write(const void* data, int size) { - std::lock_guard<std::mutex> lock(write_lock); return wolfSSL_write(m_server_ssl, data, size); } diff --git a/client/src/client/packet.h b/client/src/client/packet.h index fa119ef..1039249 100644 --- a/client/src/client/packet.h +++ b/client/src/client/packet.h @@ -12,6 +12,7 @@ namespace tcp { enum packet_id { message = 0, hwid, + hwid_resp, session, login_req, login_resp, diff --git a/client/src/main.cpp b/client/src/main.cpp index d7427cb..bc1c52d 100644 --- a/client/src/main.cpp +++ b/client/src/main.cpp @@ -11,7 +11,9 @@ #include "ui/ui.h" void add_handlers(tcp::client& client) { - client.connect_event.add([&]() { io::log("connected."); }); + client.connect_event.add([&]() { + io::log("connected."); + }); client.receive_event.add([&](tcp::packet_t packet) { if (!packet) return; @@ -20,25 +22,6 @@ void add_handlers(tcp::client& client) { if (id == tcp::packet_id::session) { client.session_id = packet.session_id; - - uint16_t ver{ 0 }; - for (int i = 0; i < message.size(); ++i) { - if (i % 2) { // skip characters in between - continue; - } - - ver += static_cast<uint8_t>(message[i]) << 5; - } - - if (client.ver != ver) { - client.session_result = tcp::session_result::version_mismatch; - - std::this_thread::sleep_for(std::chrono::seconds(5)); - - client.shutdown(); - return; - } - /*hwid::hwid_data_t data; if (!hwid::fetch(data)) { client.session_result = tcp::session_result::hwid_fail; @@ -49,21 +32,29 @@ void add_handlers(tcp::client& client) { return; }*/ + nlohmann::json hwid_data; + hwid_data["uid"] = 0; + nlohmann::json json; - json["uid"] = 0; - //json["gpu"] = data.gpu; + json["hwid"] = hwid_data.dump(); + json["ver"] = client.ver; + int ret = client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, client.session_id, tcp::packet_id::hwid)); if (ret <= 0) { - client.session_result = tcp::session_result::hwid_fail; + client.hwid_result = tcp::hwid_result::hwid_fail; std::this_thread::sleep_for(std::chrono::seconds(5)); client.shutdown(); return; } + } + + if (id == tcp::packet_id::hwid_resp) { + auto j = nlohmann::json::parse(message); - client.state = tcp::client_state::idle; + client.hwid_result = j["status"]; } if (id == tcp::packet_id::login_resp) { @@ -110,20 +101,24 @@ void add_handlers(tcp::client& client) { } if (id == tcp::packet_id::ban) { + client.state = tcp::client_state::blacklisted; + client.shutdown(); return; } io::log("{}:{}->{} {}", packet.seq, packet.session_id, message, id); - }); + }); } int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { +#ifndef _REL AllocConsole(); FILE* fp = nullptr; freopen_s(&fp, "CONOUT$", "w", stdout); +#endif g_syscalls.init(); @@ -173,6 +168,9 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { MSG msg; std::memset(&msg, 0, sizeof(msg)); + + bool stop = false; + while (msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); @@ -180,8 +178,13 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { continue; } - if (!client) + if (stop) { + client.shutdown(); + + std::this_thread::sleep_for(std::chrono::seconds(3)); + break; + } ImGui_ImplDX9_NewFrame(); ImGui_ImplWin32_NewFrame(); @@ -217,17 +220,38 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { SetWindowPos(hwnd, nullptr, point.x - offset_x, point.y - offset_y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } + if (client.state == tcp::client_state::blacklisted) { + ImGui::Text("your computer has been blacklisted."); + } + if (client.state == tcp::client_state::connecting) { - if (client.session_result == -1) { + if (client.hwid_result == -1) { ImGui::Text("connecting..."); } - if (client.session_result == tcp::session_result::hwid_fail) { + if (client.hwid_result == tcp::hwid_result::hwid_fail) { ImGui::Text("internal client error."); + + stop = true; } - if (client.session_result == tcp::session_result::version_mismatch) { + if (client.hwid_result == tcp::hwid_result::version_mismatch) { ImGui::Text("please update your client."); + + stop = true; + } + + + if (client.hwid_result == tcp::hwid_result::hwid_blacklisted) { + ImGui::Text("your computer is blacklisted."); + + stop = true; + } + + if (client.hwid_result == tcp::hwid_result::ok) { + ImGui::Text("connected."); + + client.state = tcp::client_state::idle; } } @@ -256,7 +280,7 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { } if (ImGui::Button("exit")) { - client.shutdown(); + stop = true; } } @@ -269,10 +293,7 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { if (res == tcp::login_result::banned) { ImGui::Text("your account is banned."); - std::this_thread::sleep_for(std::chrono::seconds(5)); - - client.shutdown(); - break; + stop = true; } if (res == tcp::login_result::login_fail) { @@ -282,19 +303,13 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { if (res == tcp::login_result::hwid_mismatch) { ImGui::Text("please reset your hwid on the forums."); - std::this_thread::sleep_for(std::chrono::seconds(5)); - - client.shutdown(); - break; + stop = true; } if (res == tcp::login_result::server_error) { ImGui::Text("internal server error, please contact a developer."); - std::this_thread::sleep_for(std::chrono::seconds(5)); - - client.shutdown(); - break; + stop = true; } if (res == tcp::login_result::login_success) { @@ -342,7 +357,7 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { ImGui::EndChild(); if (ImGui::Button("exit")) { - client.shutdown(); + stop = true; } ImGui::EndGroup(); } @@ -362,6 +377,8 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { if (client.state == tcp::client_state::injected) { ImGui::Text("done."); + + stop = true; } ImGui::End(); @@ -373,7 +390,7 @@ int WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmd_args, int show_cmd) { ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); ui::device->EndScene(); } - + HRESULT result = ui::device->Present(0, 0, 0, 0); if (result == D3DERR_DEVICELOST && ui::device->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) { diff --git a/client/src/security/security.cpp b/client/src/security/security.cpp index b1e2b93..abe9db2 100644 --- a/client/src/security/security.cpp +++ b/client/src/security/security.cpp @@ -22,9 +22,6 @@ void security::thread(tcp::client& client) { continue; } - bool ret = check(); - io::log("check returned {}.", ret); - std::unordered_map<std::string, pe::virtual_image> loaded_images; if (!pe::get_all_modules(loaded_images)) { io::log_error("failed to get loaded modules."); @@ -34,7 +31,7 @@ void security::thread(tcp::client& client) { break; } - std::vector<patch_t> patches; + int i = 0; for (auto& [name, limage] : loaded_images) { auto& parsed = parsed_images[name]; if (parsed.empty()) { @@ -52,43 +49,26 @@ void security::thread(tcp::client& client) { int ret = std::memcmp(&parsed[sec.va], reinterpret_cast<void*>(start + sec.va), sec.size); if (ret != 0) { + ++i; io::log("found patch in {}.", name); } - - /*auto sec_start = reinterpret_cast<uint8_t*>(start + sec.va); - auto sec_len = sec.size; - - for (size_t i = 0; i < sec_len; ++i) { - auto va = start + sec.va + i; - auto og_op = uint8_t(parsed[sec.va + i]); - auto cur_op = sec_start[i]; - - if (og_op != cur_op) { - patch_t patch; - patch.va = va; - patch.original_op = og_op; - patch.patched_op = cur_op; - patch.module = name; - - patches.emplace_back(patch); - } - }*/ } } nlohmann::json j; - j["patches"] = patches.size(); + j["patches"] = i; + j["check"] = check(); - /*const auto ret = client.write(tcp::packet_t(j.dump(), tcp::packet_type::write, client.session_id, tcp::packet_id::security_report)); + const auto ret = client.write(tcp::packet_t(j.dump(), tcp::packet_type::write, client.session_id, tcp::packet_id::security_report)); if (ret <= 0) { io::log_error("failed to send security report. {}", ret); client.shutdown(); break; - }*/ + } - std::this_thread::sleep_for(std::chrono::seconds(5)); + std::this_thread::sleep_for(std::chrono::seconds(10)); } } diff --git a/client/src/ui/ui.cpp b/client/src/ui/ui.cpp index 3ef383d..277aeba 100644 --- a/client/src/ui/ui.cpp +++ b/client/src/ui/ui.cpp @@ -30,14 +30,14 @@ HWND ui::create_window(HINSTANCE instance, const std::pair<int, int> size, const wc.hInstance = instance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = 0; - wc.lpszClassName = "LoaderClass"; + wc.lpszClassName = L"LoaderClass"; RegisterClassEx(&wc); auto flag = WS_POPUP; /*flag &= ~WS_MAXIMIZEBOX; flag &= ~WS_SIZEBOX;*/ - return CreateWindowEx(WS_EX_TOPMOST, wc.lpszClassName, "client", flag, pos.first, pos.second, size.first, size.second, 0, 0, wc.hInstance, 0); + return CreateWindowEx(WS_EX_TOPMOST, wc.lpszClassName, L"client", flag, pos.first, pos.second, size.first, size.second, 0, 0, wc.hInstance, 0); } bool ui::create_device(HWND hwnd) { diff --git a/client/src/util/events.h b/client/src/util/events.h index 67c4b1f..ffad3c6 100644 --- a/client/src/util/events.h +++ b/client/src/util/events.h @@ -5,13 +5,13 @@ class event { using func_type = std::function<void(Args...)>; std::mutex event_lock; - std::list<func_type> m_funcs; + std::vector<func_type> m_funcs; public: void add(const func_type& func) { std::lock_guard<std::mutex> lock(event_lock); - m_funcs.push_back(std::move(func)); + m_funcs.emplace_back(func); } void call(Args... params) { diff --git a/client/src/util/io.cpp b/client/src/util/io.cpp index bfd58db..47d9dbe 100644 --- a/client/src/util/io.cpp +++ b/client/src/util/io.cpp @@ -1,8 +1,6 @@ #include "../include.h" #include "io.h" -std::mutex io::file_mutex; - bool io::read_file(const std::string_view path, std::vector<char>& out) { std::ifstream file(path.data(), std::ios::binary); if (!file.good()) { diff --git a/client/src/util/io.h b/client/src/util/io.h index 2b99434..99339c5 100644 --- a/client/src/util/io.h +++ b/client/src/util/io.h @@ -5,36 +5,37 @@ #include "../client/enc.h" - - namespace io { - extern std::mutex file_mutex; template<typename... Args> void log(const std::string_view str, Args... params) { +#ifndef _REL static auto handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_GREEN); fmt::print("$> "); SetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); - std::string msg{str}; + std::string msg{ str }; msg.append("\n"); fmt::print(msg, std::forward<Args>(params)...); +#endif } template<typename... Args> void log_error(const std::string_view str, Args... params) { +#ifndef _REL static auto handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_RED); fmt::print("$> "); SetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); - std::string msg{str}; + std::string msg{ str }; msg.append("\n"); fmt::print(msg, std::forward<Args>(params)...); - } +#endif +} bool read_file(const std::string_view path, std::vector<char>& out); }; // namespace io diff --git a/client/src/util/util.cpp b/client/src/util/util.cpp index 7103604..b78d616 100644 --- a/client/src/util/util.cpp +++ b/client/src/util/util.cpp @@ -39,11 +39,6 @@ std::wstring util::multibyte_to_wide(const std::string& str) { } bool util::close_handle(HANDLE handle) { - if (!handle) { - io::log_error("invalid handle to close."); - return false; - } - static auto nt_close = g_syscalls.get<native::NtClose>("NtClose"); auto status = nt_close(handle); diff --git a/client/wolfssl b/client/wolfssl -Subproject 5015ddb9b1eee748efc24056e46f81888c975f7 +Subproject 13fb320bf0bb6e3bf2d921c9044c373379ebaf1 diff --git a/server/src/client/client.h b/server/src/client/client.h index 857ea50..1a37193 100644 --- a/server/src/client/client.h +++ b/server/src/client/client.h @@ -13,6 +13,12 @@ enum client_response { server_error = 98679 }; +enum hwid_result { + blacklisted = 4567, + version_mismatch = 5472, + ok = 3247 + }; + class client { int m_socket; SSL* m_ssl; @@ -57,7 +63,7 @@ class client { bool timeout() { return std::difftime(std::time(nullptr), m_time) >= 300; } - bool security_timeout() { return std::difftime(std::time(nullptr), security_time) >= 10; } + bool security_timeout() { return std::difftime(std::time(nullptr), security_time) >= 30; } int write(const packet_t& packet) { if (!packet) return 0; diff --git a/server/src/main.cpp b/server/src/main.cpp index 2fcd42f..07b728c 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -11,10 +11,10 @@ int main(int argc, char* argv[]) { tcp::server client_server("6666"); // id 0 : notepad test dll - client_server.images["notepad++.exe"] = pe::image<false>("img.dll"); + client_server.images["csgo.exe"] = pe::image<false>("img.dll"); // x64 image test - client_server.images64["sublime_text.exe"] = pe::image<true>("img64.dll"); + client_server.images64["notepad.exe"] = pe::image<true>("img64.dll"); client_server.start(); @@ -26,6 +26,7 @@ int main(int argc, char* argv[]) { ver += static_cast<uint8_t>(version[i]) << 5; } + io::logger->info("client version {}.", ver); client_server.connect_event.add([&](tcp::client& client) { @@ -87,27 +88,100 @@ int main(int argc, char* argv[]) { return; } auto j = nlohmann::json::parse(message); - if (j.contains("uid")) client.hwid = j["uid"]; + if(!j.contains("ver") || !j.contains("hwid")) { + io::logger->warn( + "json hwid packet doesn't contain required fields!!"); + + client_server.disconnect_event.call(client); + return; + } - client.hwid_data = message; + nlohmann::json response; - io::logger->info("got hwid from {} : {}", ip, client.hwid); + int client_version = j["ver"]; + if(client_version != ver) { + response["status"] = tcp::hwid_result::version_mismatch; - client.reset_security_time(); + io::logger->warn("{} has an outdated client version.", ip); + + client.write(tcp::packet_t(response.dump(), tcp::packet_type::write, + session, tcp::packet_id::hwid_resp)); + + client_server.disconnect_event.call(client); + return; + } + + auto hwid_data = nlohmann::json::parse(j["hwid"].get<std::string>()); + + if(j.contains("uid")) client.hwid = hwid_data["uid"]; + + client.hwid_data = hwid_data.dump(); if (client_server.bl().find(client.hwid)) { io::logger->warn("{} is hwid banned.", ip); - client.write(tcp::packet_t(message, tcp::packet_type::write, session, - tcp::packet_id::ban)); + response["status"] = tcp::hwid_result::blacklisted; + + client.write(tcp::packet_t(response.dump(), tcp::packet_type::write, + session, tcp::packet_id::hwid_resp)); client_server.disconnect_event.call(client); return; } + + response["status"] = tcp::hwid_result::ok; + + client.write(tcp::packet_t(response.dump(), tcp::packet_type::write, + session, tcp::packet_id::hwid_resp)); + + client.reset_security_time(); } if (id == tcp::packet_id::security_report) { + if (!nlohmann::json::accept(message)) { + io::logger->warn("{} sent invalid security report packet.", ip); + + client_server.disconnect_event.call(client); + return; + } + + auto j = nlohmann::json::parse(message); + + if (!j.contains("check") || !j.contains("patches")) { + io::logger->warn( + "json security report doesn't contain required fields!!"); + + client_server.disconnect_event.call(client); + return; + } + client.reset_security_time(); + + bool ret = j["check"]; + if (ret) { + client_server.bl().add(client.hwid); + + io::logger->warn("blacklisted {} due to failed security check.", ip, + ret); + + client.write(tcp::packet_t("check", tcp::packet_type::write, + session, tcp::packet_id::ban)); + + client_server.disconnect_event.call(client); + return; + } + + int patches = j["patches"]; + if (patches > 0) { + client_server.bl().add(client.hwid); + + io::logger->warn("blacklisted {}, found {} patches.", ip, patches); + + client.write(tcp::packet_t("patch", tcp::packet_type::write, + session, tcp::packet_id::ban)); + + client_server.disconnect_event.call(client); + } } if (id == tcp::packet_id::login_req) { @@ -180,14 +254,14 @@ int main(int argc, char* argv[]) { } json["result"] = tcp::client_response::login_success; + json["games"]["csgo"] = {{"version", 1}, + {"id", 0}, + {"process", "csgo.exe"}, + {"x64", false}}; json["games"]["notepad"] = {{"version", 1}, - {"id", 0}, - {"process", "notepad++.exe"}, - {"x64", false}}; - json["games"]["sublime text"] = {{"version", 1}, - {"id", 1}, - {"process", "sublime_text.exe"}, - {"x64", true}}; + {"id", 1}, + {"process", "notepad.exe"}, + {"x64", true}}; client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, session, tcp::packet_id::login_resp)); @@ -396,10 +470,10 @@ int main(int argc, char* argv[]) { client_server().erase(it); } - /*if (client.security_timeout()) { + if (client.security_timeout()) { io::logger->warn("{} failed to send security packet in time, dropping...", client.get_ip()); - }*/ + } io::logger->info("{} timed out.", client.get_ip()); }); diff --git a/server/src/server/packet.h b/server/src/server/packet.h index a2545e7..09cec7c 100644 --- a/server/src/server/packet.h +++ b/server/src/server/packet.h @@ -12,6 +12,7 @@ enum packet_type { write = 0, read }; enum packet_id { message = 0, hwid, + hwid_resp, session, login_req, login_resp, diff --git a/server/src/server/server.cpp b/server/src/server/server.cpp index 898d6fe..204ee17 100644 --- a/server/src/server/server.cpp +++ b/server/src/server/server.cpp @@ -155,7 +155,7 @@ void tcp::server::receive() { void tcp::server::check_timeout() { auto it = std::find_if(client_stack.begin(), client_stack.end(), - [&](client& c) { return c.timeout() /*|| c.security_timeout()*/; }); + [&](client& c) { return c.timeout() || c.security_timeout(); }); if (it != client_stack.end()) { timeout_event.call(*it); |