#ifndef CORE_H #define CORE_H #include "../runtime/common.h" enum ProjectOption { cpDebugMode = 0x00000002, cpCryptValues = 0x00000008, cpIncludeWatermark = 0x00000020, cpRunnerCRC = 0x00000040, cpEncryptRegs = 0x00000080, cpStripFixups = 0x00008000, cpPack = 0x00000100, cpImportProtection = 0x00000200, cpCheckDebugger = 0x00000400, cpCheckVirtualMachine = 0x00000800, cpMemoryProtection = 0x00001000, cpResourceProtection = 0x00010000, cpCheckKernelDebugger = 0x00020000, cpStripDebugInfo = 0x00040000, cpLoaderCRC = 0x10000000, #ifndef DEMO cpUnregisteredVersion = 0x40000000, #endif cpEncryptBytecode = 0x80000000, cpVirtualFiles = 0x08000000, cpInternalMemoryProtection = 0x04000000, cpLoader = 0x02000000, cpMaximumProtection = cpCryptValues | cpRunnerCRC | cpEncryptRegs | cpPack | cpImportProtection | cpMemoryProtection | cpResourceProtection | cpStripDebugInfo, cpUserOptionsMask = 0x00FFFFFF }; std::string VectorToBase64(const std::vector &src); static const VMP_CHAR *default_message[MESSAGE_COUNT] = { MESSAGE_DEBUGGER_FOUND_STR, MESSAGE_VIRTUAL_MACHINE_FOUND_STR, MESSAGE_FILE_CORRUPTED_STR, MESSAGE_SERIAL_NUMBER_REQUIRED_STR, MESSAGE_HWID_MISMATCHED_STR }; struct LicenseDate { uint16_t Year; uint8_t Month; uint8_t Day; LicenseDate(uint32_t value = 0) { Day = value & 0xff; Month = (value >> 8) & 0xff; Year = (value >> 16) & 0xffff; }; LicenseDate(uint16_t year, uint8_t month, uint8_t day) : Year(year), Month(month), Day(day) {}; uint32_t value() const { return (Year << 16) | (Month << 8) | Day; } }; class Core; class BigNumber; class ProjectTemplate; class ProjectTemplateManager; class RSA { public: RSA(); RSA(const std::vector &public_exp, const std::vector &private_exp, const std::vector &modulus); ~RSA(); bool Encrypt(Data &data); bool Decrypt(Data &data); bool CreateKeyPair(size_t key_length); std::vector public_exp() const; std::vector private_exp() const; std::vector modulus() const; private: BigNumber *private_exp_; BigNumber *public_exp_; BigNumber *modulus_; // no copy ctr or assignment op RSA(const RSA &); RSA &operator =(const RSA &); }; #ifdef ULTIMATE class LicensingManager; struct LicenseInfo { uint32_t Flags; std::string CustomerName; std::string CustomerEmail; LicenseDate ExpireDate; std::string HWID; uint8_t RunningTimeLimit; LicenseDate MaxBuildDate; std::string UserData; LicenseInfo() : Flags(0), RunningTimeLimit(0) {} }; class License: public IObject { public: explicit License(LicensingManager *owner, LicenseDate date, const std::string &customer_name, const std::string &customer_email, const std::string &order_ref, const std::string &comments, const std::string &serial_number, bool blocked); ~License(); std::string customer_name() const { return customer_name_; } std::string customer_email() const { return customer_email_; } std::string order_ref() const { return order_ref_; } std::string comments() const { return comments_; } std::string serial_number() const { return serial_number_; } bool blocked() const { return blocked_; } void GetHash(uint8_t hash[20]); LicenseDate date() const { return date_; } void set_customer_name(const std::string &value); void set_customer_email(const std::string &value); void set_order_ref(const std::string &value); void set_date(LicenseDate value); void set_comments(const std::string &value); void set_blocked( bool value); LicenseInfo *info(); void Notify(MessageType type, IObject *sender, const std::string &message = "") const; private: LicensingManager *owner_; LicenseDate date_; std::string customer_name_; std::string customer_email_; std::string order_ref_; std::string comments_; std::string serial_number_; bool blocked_; LicenseInfo *info_; // no copy ctr or assignment op License(const License &); License &operator =(const License &); }; enum Algorithm { alNone, alRSA }; enum SerialNumberFlags { HAS_USER_NAME = 0x0001, HAS_EMAIL = 0x0002, HAS_EXP_DATE = 0x0004, HAS_MAX_BUILD_DATE = 0x0008, HAS_TIME_LIMIT = 0x0010, HAS_HARDWARE_ID = 0x0020, HAS_USER_DATA = 0x0040, SN_FLAGS_PADDING = 0xFFFF }; class LicensingManager : public ObjectList { public: explicit LicensingManager(Core *owner = NULL); virtual bool GetLicenseData(Data &data) const; virtual void clear(); bool Open(const std::string &file_name); bool Save(); bool SaveAs(const std::string &file_name); bool empty() const { return algorithm_ == alNone; } uint64_t product_code() const; bool Init(size_t key_len); Algorithm algorithm() const { return algorithm_; } uint16_t bits() const { return bits_; } std::vector public_exp() const { return public_exp_; } std::vector private_exp() const { return private_exp_; } std::vector modulus() const { return modulus_; } std::vector hash() const; std::string activation_server() const { return activation_server_; } void set_activation_server(const std::string &activation_server) { activation_server_ = activation_server; } void set_build_date(uint32_t build_date) { build_date_ = build_date; } std::string GenerateSerialNumber(const LicenseInfo &license_info); bool DecryptSerialNumber(const std::string &serial_number, LicenseInfo &license_info); License *Add(LicenseDate date, const std::string &customer_name, const std::string &customer_email, const std::string &order_ref, const std::string &comments, const std::string &serial_number, bool blocked); License *GetLicenseBySerialNumber(const std::string &serial_number); bool CompareParameters(const LicensingManager &manager) const; virtual void Notify(MessageType type, IObject *sender, const std::string &message = "") const; virtual void AddObject(License *license); virtual void RemoveObject(License *license); private: void changed(); Core *owner_; std::string file_name_; Algorithm algorithm_; uint16_t bits_; std::vector public_exp_; std::vector private_exp_; std::vector modulus_; std::vector product_code_; std::string activation_server_; uint32_t build_date_; }; class FileManager; class IFunction; class FileStream; class FileFolder : public ObjectList { public: explicit FileFolder(FileFolder *owner, const std::string &name); explicit FileFolder(FileFolder *owner, const FileFolder &src); virtual ~FileFolder(); FileFolder *Clone(FileFolder *owner) const; FileFolder *Add(const std::string &name); std::string name() const { return name_; } FileFolder *owner() const { return owner_; } void set_name(const std::string &name); void set_owner(FileFolder *owner); virtual void Notify(MessageType type, IObject *sender, const std::string &message = "") const; std::string id() const; FileFolder *GetFolderById(const std::string &id) const; void WriteEntry(IFunction &data); void WriteName(IFunction &data, uint64_t image_base, uint32_t key); using IObject::CompareWith; private: void changed(); FileFolder *owner_; std::string name_; size_t entry_offset_; }; class FileFolderList : public FileFolder { public: explicit FileFolderList(FileManager *owner); explicit FileFolderList(FileManager *owner, const FileFolderList &src); FileFolderList *Clone(FileManager *owner) const; std::vector GetFolderList() const; virtual void Notify(MessageType type, IObject *sender, const std::string &message = "") const; FileManager *owner() const { return owner_; } private: FileManager *owner_; }; enum InternalFileAction { faNone, faLoad, faRegister, faInstall }; class InternalFile : public IObject { public: InternalFile(FileManager *owner, const std::string &name, const std::string &file_name, InternalFileAction action, FileFolder *folder); ~InternalFile(); std::string name() const { return name_; } std::string file_name() const { return file_name_; } std::string absolute_file_name() const; void set_name(const std::string &value); void set_file_name(const std::string &value); bool Open(); void Close(); virtual void WriteEntry(IFunction &func); virtual void WriteName(IFunction &func, uint64_t image_base, uint32_t key); virtual void WriteData(IFunction &func, uint64_t image_base, uint32_t key); void Notify(MessageType type, IObject *sender, const std::string &message = "") const; FileManager *owner() const { return owner_; } InternalFileAction action() const { return action_; } void set_action(InternalFileAction action); bool is_server() const { return (action_ == faRegister || action_ == faInstall); } FileFolder *folder() const { return folder_; } void set_folder(FileFolder *folder); size_t id() const; FileStream *stream() const { return stream_; } private: FileManager *owner_; std::string name_; std::string file_name_; InternalFileAction action_; FileStream *stream_; size_t entry_offset_; FileFolder *folder_; // no copy ctr or assignment op InternalFile(const InternalFile &); InternalFile &operator =(const InternalFile &); }; class FileManager : public ObjectList { public: FileManager(Core *owner); ~FileManager(); virtual void clear(); bool need_compile() const { return need_compile_; } void set_need_compile(bool need_compile); InternalFile *Add(const std::string &name, const std::string &file_name, InternalFileAction action, FileFolder *folder); bool OpenFiles(); void CloseFiles(); void Notify(MessageType type, IObject *sender, const std::string &message = "") const; Core *owner() const { return owner_; } uint32_t GetRuntimeOptions() const; size_t server_count() const; FileFolderList *folder_list() const { return folder_list_; } private: Core *owner_; bool need_compile_; FileFolderList *folder_list_; // no copy ctr or assignment op FileManager(const FileManager &); FileManager &operator =(const FileManager &); }; #endif class WatermarkManager; class IniFile; class SettingsFile; class Watermark : public IObject { public: Watermark(WatermarkManager *owner); Watermark(WatermarkManager *owner, const std::string &name, const std::string &value, size_t use_count, bool enabled); ~Watermark(); size_t id() const { return id_; } std::string name() const { return name_; } bool enabled() const { return enabled_; } std::string value() const { return value_; } size_t use_count() const { return use_count_; } void set_name(const std::string &name); void set_value(const std::string &value); void set_enabled(bool value); void Compile(); bool SearchByte(uint8_t value); std::vector dump() const { return dump_; } void inc_use_count(); void ReadFromIni(IniFile &file, size_t id); void ReadFromNode(TiXmlElement *node); void SaveToNode(TiXmlElement *node); void SaveToFile(SettingsFile &file); void DeleteFromFile(SettingsFile &file); void InitSearch() { pos_.clear(); } virtual void Notify(MessageType type, IObject *sender, const std::string &message = "") const; static bool AreSimilar(const std::string &v1, const std::string &v2); static bool SymbolsMatch(char v1, char v2); private: WatermarkManager *owner_; size_t id_; std::string name_; std::string value_; size_t use_count_; bool enabled_; std::vector dump_; std::vector mask_; std::vector pos_; }; class WatermarkManager : public ObjectList { public: WatermarkManager(Core *owner); Watermark *Add(const std::string name, const std::string value, size_t use_count = 0, bool enabled = true); Watermark *GetWatermarkByName(const std::string &name); void InitSearch() const; virtual void Notify(MessageType type, IObject *sender, const std::string &message = "") const; void ReadFromFile(SettingsFile &file); virtual void RemoveObject(Watermark *watermark); void ReadFromIni(const std::string &file_name); void SaveToFile(SettingsFile &file); std::string CreateValue() const; Watermark *GetWatermarkByValue(const std::string &value) const; bool IsUniqueWatermark(const std::string &value) const; private: Core *owner_; }; enum VMProtectProductId { VPI_NOT_SPECIFIED, //0 legacy VPI_LITE_WIN_PERSONAL, //1 VMProtect Lite for Windows (Personal License) VPI_LITE_WIN_COMPANY, //2 VMProtect Lite for Windows (Company License) VPI_PROF_WIN_PERSONAL, //3 VMProtect Professional for Windows (Personal License) VPI_PROF_WIN_COMPANY, //4 VMProtect Professional for Windows (Company License) VPI_ULTM_WIN_PERSONAL, //5 VMProtect Ultimate for Windows (Personal License) VPI_ULTM_WIN_COMPANY, //6 VMProtect Ultimate for Windows (Company License) VPI_LITE_OSX_PERSONAL, //7 VMProtect Lite for Mac OS X (Personal License) VPI_LITE_OSX_COMPANY, //8 VMProtect Lite for Mac OS X (Company License) VPI_PROF_OSX_PERSONAL, //9 VMProtect Professional for Mac OS X (Personal License) VPI_PROF_OSX_COMPANY, //10 VMProtect Professional for Mac OS X (Company License) VPI_ULTM_OSX_PERSONAL, //11 VMProtect Ultimate for Mac OS X (Personal License) VPI_ULTM_OSX_COMPANY, //12 VMProtect Ultimate for Mac OS X (Company License) VPI_WLM_PERSONAL, //13 VMProtect Web License Manager (Personal License) VPI_WLM_COMPANY, //14 VMProtect Web License Manager (Company License) VPI_YEAR_PESONAL, //15 Yearly Subscription Plan (Personal License) VPI_YEAR_COMPANY, //16 Yearly Subscription Plan (Company License) VPI_SENS_WIN_PERSONAL, //17 VMProtect SE for Windows (Personal License) VPI_SENS_WIN_COMPANY, //18 VMProtect SE for Windows (Company License) VPI_LITE_LIN_PERSONAL, //19 VMProtect Lite for Linux (Personal License) VPI_LITE_LIN_COMPANY, //20 VMProtect Lite for Linux (Company License) VPI_PROF_LIN_PERSONAL, //21 VMProtect Professional for Linux (Personal License) VPI_PROF_LIN_COMPANY, //22 VMProtect Professional for Linux (Company License) VPI_ULTM_LIN_PERSONAL, //23 VMProtect Ultimate for Linux (Personal License) VPI_ULTM_LIN_COMPANY, //24 VMProtect Ultimate for Linux (Company License) #ifdef __unix__ VPI_LITE_PERSONAL = VPI_LITE_LIN_PERSONAL, VPI_LITE_COMPANY = VPI_LITE_LIN_COMPANY, VPI_PROF_PERSONAL = VPI_PROF_LIN_PERSONAL, VPI_PROF_COMPANY = VPI_PROF_LIN_COMPANY, VPI_ULTM_PERSONAL = VPI_ULTM_LIN_PERSONAL, VPI_ULTM_COMPANY = VPI_ULTM_LIN_COMPANY, #elif defined(__APPLE__) VPI_LITE_PERSONAL = VPI_LITE_OSX_PERSONAL, VPI_LITE_COMPANY = VPI_LITE_OSX_COMPANY, VPI_PROF_PERSONAL = VPI_PROF_OSX_PERSONAL, VPI_PROF_COMPANY = VPI_PROF_OSX_COMPANY, VPI_ULTM_PERSONAL = VPI_ULTM_OSX_PERSONAL, VPI_ULTM_COMPANY = VPI_ULTM_OSX_COMPANY, #else VPI_LITE_PERSONAL = VPI_LITE_WIN_PERSONAL, VPI_LITE_COMPANY = VPI_LITE_WIN_COMPANY, VPI_PROF_PERSONAL = VPI_PROF_WIN_PERSONAL, VPI_PROF_COMPANY = VPI_PROF_WIN_COMPANY, VPI_ULTM_PERSONAL = VPI_ULTM_WIN_PERSONAL, VPI_ULTM_COMPANY = VPI_ULTM_WIN_COMPANY, #endif }; #if defined(ULTIMATE) #define EDITION "Ultimate" #elif defined(LITE) #define EDITION "Lite" #else #define EDITION "Professional" #endif #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) #define STR_HELPERW(x) L ## #x #define STRW(x) STR_HELPERW(x) #define STR_HELPERWQ(x) L ## x #define STRWQ(x) STR_HELPERWQ(x) class ProjectTemplate : public IObject { public: ProjectTemplate(ProjectTemplateManager *owner, const std::string &name, bool is_default = false); ProjectTemplate &operator =(const ProjectTemplate &); ~ProjectTemplate(); void Reset(); void ReadFromCore(const Core &core); void ReadFromNode(TiXmlElement *node); void SaveToNode(TiXmlElement *node) const; bool is_default() const { return is_default_; } void set_is_default(bool is_default) { is_default_ = is_default; } std::string name() const { return name_; } std::string display_name() const; uint32_t options() const { return options_; } std::string vm_section_name() const { return vm_section_name_; } std::string message(size_t idx) const; void set_name(const std::string &name); static std::string default_name() { return "(default)"; } virtual void Notify(MessageType type, IObject *sender, const std::string &message = "") const; bool operator ==(const ProjectTemplate &other) const; bool operator !=(const ProjectTemplate &other) const { return !operator==(other); } private: void Init(); ProjectTemplateManager *owner_; bool is_default_; uint32_t options_; std::string name_, vm_section_name_; std::string messages_[MESSAGE_COUNT]; // no copy ctr or assignment op ProjectTemplate(const ProjectTemplate &); }; class ProjectTemplateManager : public ObjectList { public: ProjectTemplateManager(Core *owner); void ReadFromFile(SettingsFile &file); void SaveToFile(SettingsFile &file) const; void Add(const std::string &name, const Core &core); void Notify(MessageType type, IObject *sender, const std::string &message = "") const; void RemoveObject(ProjectTemplate *pt); private: Core *owner_; // no copy ctr or assignment op ProjectTemplateManager(const ProjectTemplateManager &); ProjectTemplateManager &operator =(const ProjectTemplateManager &); }; class Script; class ILog; class IFile; class IArchitecture; class Core : public IObject { public: explicit Core(ILog *log = NULL); virtual ~Core(); #ifdef ULTIMATE bool Open(const std::string &file_name, const std::string &user_project_file_name = "", const std::string &user_licensing_params_file_name = ""); #else bool Open(const std::string &file_name, const std::string &user_project_file_name = ""); #endif bool Save(); bool SaveAs(const std::string &file_name); void Close(); bool Compile(); uint32_t options() const { return options_; } std::string vm_section_name() const { return vm_section_name_; } std::string watermark_name() const { return watermark_name_; } IFile *input_file() const { return input_file_; } IFile *output_file() const { return output_file_; } ILog *log() const { return log_; } std::string input_file_name() const { return input_file_name_; } std::string output_file_name() const { return output_file_name_; } void set_options(uint32_t options); void include_option(ProjectOption option); void exclude_option(ProjectOption option); void set_vm_section_name(const std::string &vm_section_name); void set_watermark_name(const std::string &watermark_name); void set_output_file_name(const std::string &output_file_name); std::string message(size_t type) const { return messages_[type]; } void set_message(size_t type, const std::string &message); #ifdef ULTIMATE std::string hwid() const { return hwid_; } void set_hwid(const std::string &hwid); LicensingManager *licensing_manager() const { return licensing_manager_; } FileManager *file_manager() const { return file_manager_; } std::string license_data_file_name() const { return license_data_file_name_; } void set_license_data_file_name(const std::string &license_data_file_name); std::string activation_server() const { return licensing_manager_->activation_server(); } void set_activation_server(const std::string &activation_server); std::string default_license_data_file_name() const; #endif std::string project_path() const; void Notify(MessageType type, IObject *sender, const std::string &message = ""); std::string absolute_output_file_name() const; std::string project_file_name() const { return project_file_name_; } WatermarkManager *watermark_manager() const { return watermark_manager_; } ProjectTemplateManager *template_manager() const { return template_manager_; } Script *script() const { return script_; } static const char *copyright() { return "Copyright 2003-2021 VMProtect Software"; } static const char *edition() { return "VMProtect " EDITION; } static const char *version(); static const char *build(); static bool check_license_edition(const VMProtectSerialNumberData &lic); IArchitecture *input_architecture() const; IArchitecture *output_architecture() const { return output_architecture_; } void LoadFromTemplate(const ProjectTemplate &pt); void SaveToTemplate(ProjectTemplate &pt); private: HANDLE BeginCompileTransaction(); void EndCompileTransaction(HANDLE locked_file, bool commit); bool LoadFromXML(const char *project_file_name); bool LoadFromIni(const char *project_file_name); void LoadDefaultFunctions(); std::string default_output_file_name() const; std::string project_file_name_; bool modified_; IFile *input_file_; std::string input_file_name_; uint32_t options_; uint32_t vm_options_; std::string vm_section_name_; ProjectTemplateManager *template_manager_; std::string output_file_name_; std::string watermark_name_; std::string messages_[MESSAGE_COUNT]; IFile *output_file_; ILog *log_; Watermark *watermark_; WatermarkManager *watermark_manager_; Script *script_; IArchitecture *output_architecture_; #ifdef ULTIMATE std::string hwid_; std::string license_data_file_name_; LicensingManager *licensing_manager_; FileManager *file_manager_; #endif // no copy ctr or assignment op Core(const Core &); Core &operator =(const Core &); }; #endif