#ifndef COMMON_H #define COMMON_H #ifdef VMP_GNU #define VMP_IMPORT #else #define VMP_IMPORT __declspec(dllimport) #ifdef WIN_DRIVER #ifdef _WIN64 #pragma comment(lib, "../bin/64/Driver/VMProtectDDK64.lib") #else #pragma comment(lib, "../bin/32/Driver/VMProtectDDK32.lib") #endif // _WIN64 #else #ifdef _WIN64 #ifdef NDEBUG #pragma comment(lib, "../bin/64/Release/VMProtectSDK64.lib") #else #pragma comment(lib, "../bin/64/Debug/VMProtectSDK64.lib") #endif #else #ifdef NDEBUG #pragma comment(lib, "../bin/32/Release/VMProtectSDK32.lib") #else #pragma comment(lib, "../bin/32/Debug/VMProtectSDK32.lib") #endif #endif // _WIN64 #endif // WIN_DRIVER #endif // VMP_GNU #include "../sdk/sdk.h" const size_t NOT_ID = (size_t)-1; enum { MESSAGE_DEBUGGER_FOUND, MESSAGE_VIRTUAL_MACHINE_FOUND, MESSAGE_FILE_CORRUPTED, MESSAGE_SERIAL_NUMBER_REQUIRED, MESSAGE_HWID_MISMATCHED, MESSAGE_COUNT }; #ifdef VMP_GNU #define VMP_STR(s) s #else #define VMP_STR(s) L##s #endif #define MESSAGE_DEBUGGER_FOUND_STR VMP_STR("A debugger has been found running in your system.\nPlease, unload it from memory and restart your program.") #define MESSAGE_VIRTUAL_MACHINE_FOUND_STR VMP_STR("Sorry, this application cannot run under a Virtual Machine.") #define MESSAGE_FILE_CORRUPTED_STR VMP_STR("File corrupted! This program has been manipulated and maybe\nit's infected by a Virus or cracked. This file won't work anymore.") #define MESSAGE_SERIAL_NUMBER_REQUIRED_STR VMP_STR("This code requires valid serial number to run.\nProgram will be terminated.") #define MESSAGE_HWID_MISMATCHED_STR VMP_STR("This application cannot be executed on this computer.") #define MESSAGE_UNREGISTERED_VERSION_STR VMP_STR("This application is protected with unregistered version of VMProtect and cannot be executed on this computer.") enum { VAR_IS_PATCH_DETECTED, VAR_IS_DEBUGGER_DETECTED, VAR_LOADER_CRC_INFO, VAR_LOADER_CRC_INFO_SIZE, VAR_LOADER_CRC_INFO_HASH, VAR_SESSION_KEY, VAR_DRIVER_UNLOAD, VAR_CRC_IMAGE_SIZE, VAR_LOADER_STATUS, VAR_SERVER_DATE, VAR_OS_BUILD_NUMBER, VAR_CPU_COUNT, VAR_CPU_HASH, VAR_COUNT = VAR_CPU_HASH + 32 }; enum { FACE_MASK = 0xFACE0000U, FACE_RC5_P, FACE_RC5_Q, FACE_STRING_INFO, FACE_RESOURCE_INFO, FACE_STORAGE_INFO, FACE_REGISTRY_INFO, FACE_LICENSE_INFO, FACE_LICENSE_INFO_SIZE, FACE_KEY_INFO, FACE_RUNTIME_ENTRY, FACE_CRC_INFO_SALT, FACE_CRC_TABLE_ENTRY, FACE_CRC_TABLE_SIZE, FACE_CRC_TABLE_HASH, FACE_TRIAL_HWID, FACE_TRIAL_HWID_SIZE, FACE_CORE_OPTIONS, FACE_IMAGE_BASE, FACE_FILE_BASE, FACE_NTOSKRNL_NAME, FACE_HAL_NAME, FACE_USER32_NAME, FACE_MESSAGE_BOX_NAME, FACE_KERNEL32_NAME, FACE_CREATE_FILE_NAME, FACE_CLOSE_HANDLE_NAME, FACE_INITIALIZATION_ERROR, FACE_PROC_NOT_FOUND, FACE_ORDINAL_NOT_FOUND, FACE_STRING_DECRYPT_KEY, FACE_DRIVER_FORMAT_VALUE, FACE_FILE_CORRUPTED, FACE_LOADER_OPTIONS, FACE_LOADER_DATA, FACE_DEBUGGER_FOUND, FACE_NT_SET_INFORMATION_PROCESS_NAME, FACE_NT_RAISE_HARD_ERROR_NAME, FACE_IS_WOW64_PROCESS_NAME, FACE_WINE_GET_VERSION_NAME, FACE_MACOSX_FORMAT_VALUE, FACE_GNU_PTRACE, FACE_UNREGISTERED_VERSION, FACE_WTSAPI32_NAME, FACE_WTS_SEND_MESSAGE_NAME, FACE_NTDLL_NAME, FACE_NT_QUERY_INFORMATION_NAME, FACE_NT_SET_INFORMATION_THREAD_NAME, FACE_SICE_NAME, FACE_SIWVID_NAME, FACE_NTICE_NAME, FACE_ICEEXT_NAME, FACE_SYSER_NAME, FACE_VIRTUAL_MACHINE_FOUND, FACE_SBIEDLL_NAME, FACE_QUERY_VIRTUAL_MEMORY_NAME, FACE_ENUM_SYSTEM_FIRMWARE_NAME, FACE_GET_SYSTEM_FIRMWARE_NAME, FACE_NT_QUERY_INFORMATION_PROCESS_NAME, FACE_NT_VIRTUAL_PROTECT_NAME, FACE_NT_OPEN_FILE_NAME, FACE_NT_CREATE_SECTION_NAME, FACE_NT_OPEN_SECTION_NAME, FACE_NT_MAP_VIEW_OF_SECTION, FACE_NT_UNMAP_VIEW_OF_SECTION, FACE_NT_CLOSE, FACE_SYSCALL, FACE_NT_ALLOCATE_VIRTUAL_MEMORY_NAME, FACE_NT_FREE_VIRTUAL_MEMORY_NAME, FACE_PACKER_INFO = 0xFACE0100U, FACE_PACKER_INFO_SIZE, FACE_FILE_CRC_INFO, FACE_FILE_CRC_INFO_SIZE, FACE_LOADER_CRC_INFO, FACE_LOADER_CRC_INFO_SIZE, FACE_SECTION_INFO, FACE_SECTION_INFO_SIZE, FACE_FIXUP_INFO, FACE_FIXUP_INFO_SIZE, FACE_RELOCATION_INFO, FACE_RELOCATION_INFO_SIZE, FACE_IAT_INFO, FACE_IAT_INFO_SIZE, FACE_IMPORT_INFO, FACE_IMPORT_INFO_SIZE, FACE_INTERNAL_IMPORT_INFO, FACE_INTERNAL_IMPORT_INFO_SIZE, FACE_MEMORY_CRC_INFO, FACE_MEMORY_CRC_INFO_SIZE, FACE_DELAY_IMPORT_INFO, FACE_DELAY_IMPORT_INFO_SIZE, FACE_LOADER_CRC_INFO_HASH, FACE_MEMORY_CRC_INFO_HASH, FACE_TLS_INDEX_INFO, FACE_GNU_RELRO_INFO, FACE_NON_PAGED_POOL_NX, FACE_DEFAULT_MDL_PRIORITY, FACE_VAR = 0xFACE0200U, FACE_VAR_IS_PATCH_DETECTED = FACE_VAR | (VAR_IS_PATCH_DETECTED << 4), FACE_VAR_IS_DEBUGGER_DETECTED = FACE_VAR | (VAR_IS_DEBUGGER_DETECTED << 4), FACE_VAR_LOADER_CRC_INFO = FACE_VAR | (VAR_LOADER_CRC_INFO << 4), FACE_VAR_LOADER_CRC_INFO_SIZE = FACE_VAR | (VAR_LOADER_CRC_INFO_SIZE << 4), FACE_VAR_LOADER_CRC_INFO_HASH = FACE_VAR | (VAR_LOADER_CRC_INFO_HASH << 4), FACE_VAR_SESSION_KEY = FACE_VAR | (VAR_SESSION_KEY << 4), FACE_VAR_DRIVER_UNLOAD = FACE_VAR | (VAR_DRIVER_UNLOAD << 4), FACE_VAR_CRC_IMAGE_SIZE = FACE_VAR | (VAR_CRC_IMAGE_SIZE << 4), FACE_VAR_LOADER_STATUS = FACE_VAR | (VAR_LOADER_STATUS << 4), FACE_VAR_SERVER_DATE = FACE_VAR | (VAR_SERVER_DATE << 4), FACE_VAR_CPU_COUNT = FACE_VAR | (VAR_CPU_COUNT << 4), FACE_VAR_CPU_HASH = FACE_VAR | (VAR_CPU_HASH << 4), FACE_VAR_OS_BUILD_NUMBER = FACE_VAR | (VAR_OS_BUILD_NUMBER << 4), FACE_VAR_SALT = 0xFACE0300U, FACE_VAR_IS_PATCH_DETECTED_SALT = FACE_VAR_SALT | VAR_IS_PATCH_DETECTED, FACE_VAR_IS_DEBUGGER_DETECTED_SALT = FACE_VAR_SALT | VAR_IS_DEBUGGER_DETECTED, FACE_VAR_LOADER_CRC_INFO_SALT = FACE_VAR_SALT | VAR_LOADER_CRC_INFO, FACE_VAR_LOADER_CRC_INFO_SIZE_SALT = FACE_VAR_SALT | VAR_LOADER_CRC_INFO_SIZE, FACE_VAR_LOADER_CRC_INFO_HASH_SALT = FACE_VAR_SALT | VAR_LOADER_CRC_INFO_HASH, FACE_VAR_DRIVER_UNLOAD_SALT = FACE_VAR_SALT | VAR_DRIVER_UNLOAD, FACE_VAR_CRC_IMAGE_SIZE_SALT = FACE_VAR_SALT | VAR_CRC_IMAGE_SIZE, FACE_VAR_SERVER_DATE_SALT = FACE_VAR_SALT | VAR_SERVER_DATE, FACE_VAR_CPU_COUNT_SALT = FACE_VAR_SALT | VAR_CPU_COUNT, FACE_VAR_CPU_HASH_SALT = FACE_VAR_SALT | VAR_CPU_HASH, FACE_VAR_OS_BUILD_NUMBER_SALT = FACE_VAR_SALT | VAR_OS_BUILD_NUMBER, }; enum { LOADER_OPTION_CHECK_PATCH = 0x1, LOADER_OPTION_CHECK_DEBUGGER = 0x2, LOADER_OPTION_CHECK_KERNEL_DEBUGGER = 0x4, LOADER_OPTION_EXIT_PROCESS = 0x8, LOADER_OPTION_CHECK_VIRTUAL_MACHINE = 0x10 }; enum { CORE_OPTION_MEMORY_PROTECTION = 0x1, CORE_OPTION_CHECK_DEBUGGER = 0x2 }; enum { FILE_LOAD = 0x1, FILE_REGISTER = 0x2, FILE_INSTALL = 0x4, }; enum { FIELD_BUILD_DATE, FIELD_PUBLIC_EXP_OFFSET, FIELD_PUBLIC_EXP_SIZE, FIELD_MODULUS_OFFSET, FIELD_MODULUS_SIZE, FIELD_BLACKLIST_OFFSET, FIELD_BLACKLIST_SIZE, FIELD_ACTIVATION_URL_OFFSET, FIELD_ACTIVATION_URL_SIZE, FIELD_CRC_OFFSET, FIELD_COUNT }; enum { WOW64_FLAG = 0x8000 }; #ifndef _CONSOLE // google test #define FACE_TO_INDEX(i) ((uint32_t)(i)/sizeof(size_t)) #ifdef VMP_GNU #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warray-bounds" #endif #else #define FACE_TO_INDEX(i) (((uint32_t)(i) & 0xff) >> 4) #endif struct GlobalData { bool is_patch_detected() { return ((v_[FACE_TO_INDEX(FACE_VAR_IS_PATCH_DETECTED)] ^ FACE_VAR_IS_PATCH_DETECTED_SALT) != 0); } //-V557 bool is_debugger_detected() { return ((v_[FACE_TO_INDEX(FACE_VAR_IS_DEBUGGER_DETECTED)] ^ FACE_VAR_IS_DEBUGGER_DETECTED_SALT) != 0); } //-V557 size_t loader_crc_info() { return (v_[FACE_TO_INDEX(FACE_VAR_LOADER_CRC_INFO)] ^ FACE_VAR_LOADER_CRC_INFO_SALT); } //-V557 size_t loader_crc_size() { return (v_[FACE_TO_INDEX(FACE_VAR_LOADER_CRC_INFO_SIZE)] ^ FACE_VAR_LOADER_CRC_INFO_SIZE_SALT); } //-V557 size_t loader_crc_hash() { return (v_[FACE_TO_INDEX(FACE_VAR_LOADER_CRC_INFO_HASH)] ^ FACE_VAR_LOADER_CRC_INFO_HASH_SALT); } //-V557 size_t cpu_hash(size_t index) { return (v_[FACE_TO_INDEX(FACE_VAR_CPU_HASH) + index] ^ FACE_VAR_CPU_HASH_SALT); } size_t cpu_count() { return (v_[FACE_TO_INDEX(FACE_VAR_CPU_COUNT)] ^ FACE_VAR_CPU_COUNT_SALT); } //-V557 size_t session_key() { return (v_[FACE_TO_INDEX(FACE_VAR_SESSION_KEY)]); } //-V557 size_t driver_unload() { return (v_[FACE_TO_INDEX(FACE_VAR_DRIVER_UNLOAD)] ^ FACE_VAR_DRIVER_UNLOAD_SALT); } //-V557 size_t crc_image_size() { return (v_[FACE_TO_INDEX(FACE_VAR_CRC_IMAGE_SIZE)] ^ FACE_VAR_CRC_IMAGE_SIZE_SALT); } //-V557 uint32_t loader_status() { return static_cast(v_[FACE_TO_INDEX(FACE_VAR_LOADER_STATUS)]); } //-V557 uint32_t server_date() { return static_cast(v_[FACE_TO_INDEX(FACE_VAR_SERVER_DATE)] ^ FACE_VAR_SERVER_DATE_SALT); } //-V557 uint32_t os_build_number() { return static_cast(v_[FACE_TO_INDEX(FACE_VAR_OS_BUILD_NUMBER)] ^ FACE_VAR_OS_BUILD_NUMBER_SALT); } //-V557 void set_is_patch_detected(bool value) { v_[FACE_TO_INDEX(FACE_VAR_IS_PATCH_DETECTED)] = static_cast(value) ^ FACE_VAR_IS_PATCH_DETECTED_SALT; } //-V557 void set_is_debugger_detected(bool value) { v_[FACE_TO_INDEX(FACE_VAR_IS_DEBUGGER_DETECTED)] = static_cast(value) ^ FACE_VAR_IS_DEBUGGER_DETECTED_SALT; } //-V557 void set_loader_crc_info(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_LOADER_CRC_INFO)] = value ^ FACE_VAR_LOADER_CRC_INFO_SALT; } //-V557 void set_loader_crc_size(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_LOADER_CRC_INFO_SIZE)] = value ^ FACE_VAR_LOADER_CRC_INFO_SIZE_SALT; } //-V557 void set_loader_crc_hash(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_LOADER_CRC_INFO_HASH)] = value ^ FACE_VAR_LOADER_CRC_INFO_HASH_SALT; } //-V557 void set_cpu_hash(size_t index, size_t value) { v_[FACE_TO_INDEX(FACE_VAR_CPU_HASH) + index] = value ^ FACE_VAR_CPU_HASH_SALT; } void set_cpu_count(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_CPU_COUNT)] = value ^ FACE_VAR_CPU_COUNT_SALT; } //-V557 void set_session_key(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_SESSION_KEY)] = value; } //-V557 void set_driver_unload(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_DRIVER_UNLOAD)] = value ^ FACE_VAR_DRIVER_UNLOAD_SALT; } //-V557 void set_crc_image_size(size_t value) { v_[FACE_TO_INDEX(FACE_VAR_CRC_IMAGE_SIZE)] = value ^ FACE_VAR_CRC_IMAGE_SIZE_SALT; } //-V557 void set_loader_status(uint32_t value) { v_[FACE_TO_INDEX(FACE_VAR_LOADER_STATUS)] = value; } //-V557 void set_server_date(uint32_t value) { v_[FACE_TO_INDEX(FACE_VAR_SERVER_DATE)] = value ^ FACE_VAR_SERVER_DATE_SALT; } //-V557 void set_os_build_number(uint32_t value) { v_[FACE_TO_INDEX(FACE_VAR_OS_BUILD_NUMBER)] = value ^ FACE_VAR_OS_BUILD_NUMBER_SALT; } //-V557 private: size_t v_[VAR_COUNT]; }; #ifndef _CONSOLE #ifdef VMP_GNU #pragma clang diagnostic pop #endif #endif #endif