diff --git a/Scylla/ConfigurationHolder.cpp b/Scylla/ConfigurationHolder.cpp index d7af60b..b051379 100644 --- a/Scylla/ConfigurationHolder.cpp +++ b/Scylla/ConfigurationHolder.cpp @@ -1,266 +1,259 @@ #include "ConfigurationHolder.h" #include "resource.h" +#include "definitions.h" WCHAR ConfigurationHolder::configPath[MAX_PATH]; ConfigurationInitializer ConfigurationHolder::config; //#define DEBUG_COMMENTS ConfigurationInitializer::ConfigurationInitializer() { ConfigObject configObject; mapConfig[USE_PE_HEADER_FROM_DISK] = configObject.newValues(L"USE_PE_HEADER_FROM_DISK", Boolean, IDC_CHECK_PE_HEADER_FROM_DISK); mapConfig[DEBUG_PRIVILEGE] = configObject.newValues(L"DEBUG_PRIVILEGE", Boolean, IDC_CHECK_DEBUG_PRIVILEGES); mapConfig[CREATE_BACKUP] = configObject.newValues(L"CREATE_BACKUP", Boolean, IDC_CHECK_CREATE_BACKUP); mapConfig[DLL_INJECTION_AUTO_UNLOAD] = configObject.newValues(L"DLL_INJECTION_AUTO_UNLOAD", Boolean, IDC_CHECK_UNLOAD_DLL); mapConfig[UPDATE_HEADER_CHECKSUM] = configObject.newValues(L"UPDATE_HEADER_CHECKSUM", Boolean, IDC_CHECK_HEADER_CHECKSUM); mapConfig[IAT_SECTION_NAME] = configObject.newValues(L"IAT_SECTION_NAME", String, IDC_OPTIONS_SECTIONNAME); } bool ConfigurationHolder::loadConfiguration() { std::map::iterator mapIter; if (!buildConfigFilePath()) { return false; } for (mapIter = config.mapConfig.begin() ; mapIter != config.mapConfig.end(); mapIter++) { if (!loadConfig((*mapIter).second)) { return false; } } return true; } bool ConfigurationHolder::saveConfiguration() { std::map::iterator mapIter; if (!buildConfigFilePath()) { return false; } for (mapIter = config.mapConfig.begin() ; mapIter != config.mapConfig.end(); mapIter++) { if (!saveConfig((*mapIter).second)) { return false; } } return true; } bool ConfigurationHolder::saveNumericToConfigFile(ConfigObject & configObject, int nBase) { if (nBase == 16) { -#ifdef _WIN64 - swprintf_s(configObject.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%016I64X"),configObject.valueNumeric); -#else - swprintf_s(configObject.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%08X"),configObject.valueNumeric); -#endif + swprintf_s(configObject.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT(PRINTF_DWORD_PTR_FULL),configObject.valueNumeric); } else { -#ifdef _WIN64 - swprintf_s(configObject.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%I64u"),configObject.valueNumeric); -#else - swprintf_s(configObject.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%u"),configObject.valueNumeric); -#endif + swprintf_s(configObject.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT(PRINTF_INTEGER),configObject.valueNumeric); } if (WritePrivateProfileString(TEXT(CONFIG_FILE_SECTION_NAME), configObject.name, configObject.valueString, configPath)) { return true; } else { return false; } } bool ConfigurationHolder::readNumericFromConfigFile(ConfigObject & configObject, int nBase) { GetPrivateProfileString(TEXT(CONFIG_FILE_SECTION_NAME),configObject.name,TEXT(""),configObject.valueString, 100, configPath); if (wcslen(configObject.valueString) > 0) { #ifdef _WIN64 configObject.valueNumeric = _wcstoui64(configObject.valueString, NULL, nBase); #else configObject.valueNumeric = wcstoul(configObject.valueString, NULL, nBase); #endif if (configObject.valueNumeric) { return true; } else { return false; } } else { return false; } } bool ConfigurationHolder::saveStringToConfigFile(ConfigObject & configObject) { if (WritePrivateProfileString(TEXT(CONFIG_FILE_SECTION_NAME), configObject.name, configObject.valueString, configPath)) { return true; } else { return false; } } bool ConfigurationHolder::readStringFromConfigFile(ConfigObject & configObject) { GetPrivateProfileString(TEXT(CONFIG_FILE_SECTION_NAME),configObject.name,TEXT(""),configObject.valueString, 100, configPath); if (wcslen(configObject.valueString) > 0) { return true; } else { return false; } } bool ConfigurationHolder::readBooleanFromConfigFile(ConfigObject & configObject) { if (GetPrivateProfileInt(TEXT(CONFIG_FILE_SECTION_NAME), configObject.name, 0, configPath) != 0) { configObject.valueNumeric = 1; } else { configObject.valueNumeric = 0; } return true; } bool ConfigurationHolder::saveBooleanToConfigFile(ConfigObject & configObject) { WCHAR *boolValue = 0; if (configObject.valueNumeric == 0) { boolValue = L"0"; } else { boolValue = L"1"; } if (WritePrivateProfileString(TEXT(CONFIG_FILE_SECTION_NAME), configObject.name, boolValue, configPath)) { return true; } else { return false; } } bool ConfigurationHolder::loadConfig(ConfigObject & configObject) { switch (configObject.configType) { case String: return readStringFromConfigFile(configObject); break; case Boolean: return readBooleanFromConfigFile(configObject); break; case Decimal: return readNumericFromConfigFile(configObject, 10); break; case Hexadecimal: return readNumericFromConfigFile(configObject, 16); break; default: return false; } } bool ConfigurationHolder::saveConfig(ConfigObject & configObject) { switch (configObject.configType) { case String: return saveStringToConfigFile(configObject); break; case Boolean: return saveBooleanToConfigFile(configObject); break; case Decimal: return saveNumericToConfigFile(configObject, 10); break; case Hexadecimal: return saveNumericToConfigFile(configObject, 16); break; default: return false; } } ConfigObject * ConfigurationHolder::getConfigObject(Configuration configuration) { return &(config.mapConfig[configuration]); } bool ConfigurationHolder::buildConfigFilePath() { ZeroMemory(configPath, sizeof(configPath)); if (!GetModuleFileName(0, configPath, _countof(configPath))) { #ifdef DEBUG_COMMENTS Logger::debugLog("buildConfigFilePath :: GetModuleFileName failed %d\r\n",GetLastError()); #endif return false; } //remove exe file name for (size_t i = wcslen(configPath) - 1; i >= 0; i--) { if (configPath[i] == L'\\') { configPath[i + 1] = 0; break; } } wcscat_s(configPath, _countof(configPath), TEXT(CONFIG_FILE_NAME) ); //wprintf(L"configPath %s\n\n", configPath); return true; } std::map & ConfigurationHolder::getConfigList() { return config.mapConfig; } \ No newline at end of file diff --git a/Scylla/OptionsGui.cpp b/Scylla/OptionsGui.cpp index 5289648..c4b9b98 100644 --- a/Scylla/OptionsGui.cpp +++ b/Scylla/OptionsGui.cpp @@ -1,164 +1,158 @@ #include "OptionsGui.h" - #include "ConfigurationHolder.h" +#include "definitions.h" BOOL OptionsGui::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { EditSectionName.Attach(GetDlgItem(IDC_OPTIONS_SECTIONNAME)); EditSectionName.LimitText(IMAGE_SIZEOF_SHORT_NAME); loadOptions(); CenterWindow(); return TRUE; } void OptionsGui::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl) { saveOptions(); ConfigurationHolder::saveConfiguration(); EndDialog(0); } void OptionsGui::OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl) { EndDialog(0); } void OptionsGui::saveOptions() { std::map::iterator mapIter; for (mapIter = ConfigurationHolder::getConfigList().begin() ; mapIter != ConfigurationHolder::getConfigList().end(); mapIter++) { getConfigOptionsFromDlg((*mapIter).second); } } void OptionsGui::loadOptions() { std::map::iterator mapIter; for (mapIter = ConfigurationHolder::getConfigList().begin() ; mapIter != ConfigurationHolder::getConfigList().end(); mapIter++) { displayConfigInDlg((*mapIter).second); } } void OptionsGui::setCheckBox( int nIDDlgItem, bool bValue ) { CButton Button(GetDlgItem(nIDDlgItem)); Button.SetCheck(bValue ? BST_CHECKED : BST_UNCHECKED); } void OptionsGui::displayConfigInDlg( ConfigObject & config ) { switch (config.configType) { case String: { setEditControl(config.dialogItemValue, config.valueString); } break; case Boolean: { setCheckBox(config.dialogItemValue, config.isTrue()); } break; case Decimal: { -#ifdef _WIN64 - swprintf_s(config.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%I64u"),config.valueNumeric); -#else - swprintf_s(config.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%u"),config.valueNumeric); -#endif + swprintf_s(config.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT(PRINTF_INTEGER),config.valueNumeric); + setEditControl(config.dialogItemValue, config.valueString); } break; case Hexadecimal: { -#ifdef _WIN64 - swprintf_s(config.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%016I64X"),config.valueNumeric); -#else - swprintf_s(config.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT("%08X"),config.valueNumeric); -#endif + swprintf_s(config.valueString, CONFIG_OPTIONS_STRING_LENGTH, TEXT(PRINTF_DWORD_PTR_FULL),config.valueNumeric); + setEditControl(config.dialogItemValue, config.valueString); } break; } } void OptionsGui::setEditControl( int nIDDlgItem, const WCHAR * valueString ) { CEdit Edit(GetDlgItem(nIDDlgItem)); Edit.SetWindowText(valueString); } void OptionsGui::getConfigOptionsFromDlg( ConfigObject & config ) { switch (config.configType) { case String: { getEditControl(config.dialogItemValue, config.valueString); } break; case Boolean: { getCheckBox(config.dialogItemValue, &config.valueNumeric); } break; case Decimal: { getEditControlNumeric(config.dialogItemValue, &config.valueNumeric, 10); } break; case Hexadecimal: { getEditControlNumeric(config.dialogItemValue, &config.valueNumeric, 16); } break; } } bool OptionsGui::getEditControl( int nIDDlgItem, WCHAR * valueString ) { CEdit Edit(GetDlgItem(nIDDlgItem)); return (Edit.GetWindowText(valueString, CONFIG_OPTIONS_STRING_LENGTH) > 0); } void OptionsGui::getCheckBox( int nIDDlgItem, DWORD_PTR * valueNumeric ) { CButton Button(GetDlgItem(nIDDlgItem)); switch (Button.GetCheck()) { case BST_CHECKED: *valueNumeric = 1; return; case BST_UNCHECKED: *valueNumeric = 0; return; default: *valueNumeric = 0; } } void OptionsGui::getEditControlNumeric( int nIDDlgItem, DWORD_PTR * valueNumeric, int nBase ) { WCHAR temp[CONFIG_OPTIONS_STRING_LENGTH] = {0}; if (getEditControl(nIDDlgItem, temp)) { #ifdef _WIN64 *valueNumeric = _wcstoui64(temp, NULL, nBase); #else *valueNumeric = wcstoul(temp, NULL, nBase); #endif } else { *valueNumeric = 0; } } diff --git a/Scylla/definitions.h b/Scylla/definitions.h index 93a7f44..448778b 100644 --- a/Scylla/definitions.h +++ b/Scylla/definitions.h @@ -1,35 +1,37 @@ #pragma once #define APPNAME "Scylla" #ifdef _WIN64 #define ARCHITECTURE "x64" #define PRINTF_DWORD_PTR "%I64X" #define PRINTF_DWORD_PTR_FULL "%016I64X" #define PRINTF_DWORD_PTR_HALF "%08I64X" +#define PRINTF_INTEGER "%I64u" #define MAX_HEX_VALUE_EDIT_LENGTH 16 #else #define ARCHITECTURE "x86" #define PRINTF_DWORD_PTR "%X" #define PRINTF_DWORD_PTR_FULL "%08X" #define PRINTF_DWORD_PTR_HALF "%08X" +#define PRINTF_INTEGER "%u" #define MAX_HEX_VALUE_EDIT_LENGTH 8 #endif -#define APPVERSION "v0.3" +#define APPVERSION "v0.4" #define RECOMMENDED_OS "This tool was designed to work with Windows 7 x64" #define DEVELOPED "Developed with Microsoft Visual Studio 2010, written in pure C/C++" #define CREDIT_DISTORM "This tool uses the diStorm disassembler library -> http://code.google.com/p/distorm/" #define CREDIT_YODA "The PE Rebuilder engine is based on the Realign DLL version 1.5 by yoda" #define CREDIT_SILK "The small icons are taken from the Silk icon package -> http://www.famfamfam.com" #define GREETINGS "Greetz: metr0, G36KV and all from the gRn Team" #define VISIT "Visit http://kickme.to/grn and http://forum.tuts4you.com " #define PLUGIN_MENU_BASE_ID 0x10 \ No newline at end of file