aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorauth12 <[email protected]>2020-08-28 17:02:54 +0100
committerauth12 <[email protected]>2020-08-28 17:02:54 +0100
commit1b7783f8e0b864d81c8ab7bb4d83cd2f789b0d48 (patch)
treeda0324fe611754ac7a816c9a96eafa84a8cf5e4b
parentImproved CPU usage drastically. (diff)
downloadloader-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.sln10
-rw-r--r--client/client.vcxproj82
-rw-r--r--client/client.vcxproj.filters12
-rw-r--r--client/src/client/client.h17
-rw-r--r--client/src/client/packet.h1
-rw-r--r--client/src/main.cpp105
-rw-r--r--client/src/security/security.cpp34
-rw-r--r--client/src/ui/ui.cpp4
-rw-r--r--client/src/util/events.h4
-rw-r--r--client/src/util/io.cpp2
-rw-r--r--client/src/util/io.h13
-rw-r--r--client/src/util/util.cpp5
m---------client/wolfssl0
-rw-r--r--server/src/client/client.h8
-rw-r--r--server/src/main.cpp108
-rw-r--r--server/src/server/packet.h1
-rw-r--r--server/src/server/server.cpp2
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);