From 1c2c7dc3e40b3bd51144144eb7038f8e91c2a0d6 Mon Sep 17 00:00:00 2001 From: JKornev <8bit.dosninja@gmail.com> Date: Fri, 16 Dec 2016 00:09:42 +0300 Subject: [PATCH] Added /config command --- HiddenCLI/Commands.cpp | 104 +++++++++++++++++++++++++++++++++++++++- HiddenCLI/Helper.cpp | 4 +- HiddenCLI/Helper.h | 2 +- HiddenCLI/HiddenCLI.cpp | 2 +- HiddenCLI/vmware.conf | 9 +++- 5 files changed, 114 insertions(+), 7 deletions(-) diff --git a/HiddenCLI/Commands.cpp b/HiddenCLI/Commands.cpp index 22bc352..8525e7a 100644 --- a/HiddenCLI/Commands.cpp +++ b/HiddenCLI/Commands.cpp @@ -4,6 +4,8 @@ #include "Protect.h" #include "Query.h" #include "State.h" +#include +#include using namespace std; @@ -47,7 +49,7 @@ SingleCommand::SingleCommand(Arguments& args) if (!found) throw WException(-2, L"Error, unknown command, please use 'hiddencli /help'"); - if (args.GetNext(arg)) + if (args.SwitchToNext()) throw WException(-2, L"Error, too many arguments"); } @@ -105,9 +107,105 @@ void MultipleCommands::Perform(Connection& connection) // ================= +class ArgsParser +{ +private: + + shared_ptr m_args; + bool m_haveArgs; + +public: + + ArgsParser(wstring& line) : m_haveArgs(false) + { + int argc; + LPWSTR* argv; + + if (line.compare(0, 1, L";") == 0) // comment + return; + + if (all_of(line.begin(), line.end(), isspace)) // whitespace only string + return; + + argv = CommandLineToArgvW(line.c_str(), &argc); + if (!argv) + throw WException(-2, L"Error, invalid command format"); + + try + { + m_args.reset(new Arguments(argc, argv, 0)); + } + catch (WException& e) + { + LocalFree(argv); + throw e; + } + + LocalFree(argv); + m_haveArgs = true; + } + + bool HaveArgs() + { + return m_haveArgs; + } + + Arguments& GetArgs() + { + return *m_args.get(); + } + +}; + MultipleCommandsFromFile::MultipleCommandsFromFile(Arguments& args) { - throw WException(-2, L"Error, /config isn't implemented yet"); + wstring configFile; + + if (!args.GetNext(configFile)) + throw WException(-2, L"Error, no command, please use 'hiddencli /help'"); + + if (args.SwitchToNext()) + throw WException(-2, L"Error, too many arguments"); + + wifstream config(configFile); + wstring line; + + LoadCommandsStack(m_commandsStack); + + while (getline(config, line)) + { + ArgsParser parser(line); + wstring arg; + + if (parser.HaveArgs()) + { + Arguments lineArgs = parser.GetArgs(); + + if (!lineArgs.GetNext(arg)) + throw WException(-2, L"Error, no command, please use 'hiddencli /help'"); + + do + { + bool found = false; + + for (auto it = m_commandsStack.begin(); it != m_commandsStack.end(); it++) + { + if ((*it)->CompareCommand(arg)) + { + CommandPtr command = (*it)->CreateInstance(); + command->LoadArgs(lineArgs); + m_currentStack.push_back(command); + found = true; + break; + } + } + + if (!found) + throw WException(-2, L"Error, unknown command, please use 'hiddencli /help'"); + } + while (lineArgs.GetNext(arg)); + } + } } MultipleCommandsFromFile::~MultipleCommandsFromFile() @@ -116,5 +214,7 @@ MultipleCommandsFromFile::~MultipleCommandsFromFile() void MultipleCommandsFromFile::Perform(Connection& connection) { + for (auto it = m_currentStack.begin(); it != m_currentStack.end(); it++) + (*it)->PerformCommand(connection); } diff --git a/HiddenCLI/Helper.cpp b/HiddenCLI/Helper.cpp index 34c2452..345b677 100644 --- a/HiddenCLI/Helper.cpp +++ b/HiddenCLI/Helper.cpp @@ -25,10 +25,10 @@ unsigned int WException::Code() return m_errorCode; } -Arguments::Arguments(int argc, wchar_t* argv[]) : +Arguments::Arguments(int argc, wchar_t* argv[], int start) : m_argPointer(0) { - for (int i = 1; i < argc; i++) + for (int i = start; i < argc; i++) m_arguments.push_back(argv[i]); } diff --git a/HiddenCLI/Helper.h b/HiddenCLI/Helper.h index 52ab19a..9990d24 100644 --- a/HiddenCLI/Helper.h +++ b/HiddenCLI/Helper.h @@ -28,7 +28,7 @@ class Arguments public: - Arguments(int argc, wchar_t* argv[]); + Arguments(int argc, wchar_t* argv[], int start = 1); size_t ArgsCount(); diff --git a/HiddenCLI/HiddenCLI.cpp b/HiddenCLI/HiddenCLI.cpp index 3003b9f..84cde58 100644 --- a/HiddenCLI/HiddenCLI.cpp +++ b/HiddenCLI/HiddenCLI.cpp @@ -132,7 +132,7 @@ int wmain(int argc, wchar_t* argv[]) { try { - Arguments arguments(argc, argv); + Arguments arguments(argc , argv); Connection connection(arguments); wstring mode; diff --git a/HiddenCLI/vmware.conf b/HiddenCLI/vmware.conf index 3023e59..6a69998 100644 --- a/HiddenCLI/vmware.conf +++ b/HiddenCLI/vmware.conf @@ -1,6 +1,12 @@ +; ====================================== +; Config for hidding VMWare components +; ====================================== +; Enable driver if it's disabled /state on +; Following config used for hidding VMWare components + /hide dir "c:\Program Files\VMware" /hide dir "c:\ProgramData\VMware" /hide dir "c:\Windows\Temp\vmware-SYSTEM" @@ -32,4 +38,5 @@ /ignore image inherit:none apply:forall "C:\Program Files\VMware\VMware Tools\VMwareXferlogs.exe" /ignore image inherit:none apply:forall "C:\Program Files\VMware\VMware Tools\zip.exe" -/stealth on "my_stealth_gate" +; Isn't supported yet +; /stealth on "my_stealth_gate"