diff options
author | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
---|---|---|
committer | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
commit | 28008a746a31abb7909dd86cb0cd413ac8943b0b (patch) | |
tree | a30b74b8cad548048c3c1551d652828ab76fa9bd /core/core.h | |
download | vmprotect-3.5.1-master.tar vmprotect-3.5.1-master.tar.gz vmprotect-3.5.1-master.tar.bz2 vmprotect-3.5.1-master.zip |
Diffstat (limited to 'core/core.h')
-rw-r--r-- | core/core.h | 598 |
1 files changed, 598 insertions, 0 deletions
diff --git a/core/core.h b/core/core.h new file mode 100644 index 0000000..9c3f4ca --- /dev/null +++ b/core/core.h @@ -0,0 +1,598 @@ +#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<uint8_t> &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<uint8_t> &public_exp, const std::vector<uint8_t> &private_exp, const std::vector<uint8_t> &modulus); + ~RSA(); + bool Encrypt(Data &data); + bool Decrypt(Data &data); + bool CreateKeyPair(size_t key_length); + std::vector<uint8_t> public_exp() const; + std::vector<uint8_t> private_exp() const; + std::vector<uint8_t> 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<License> +{ +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<uint8_t> public_exp() const { return public_exp_; } + std::vector<uint8_t> private_exp() const { return private_exp_; } + std::vector<uint8_t> modulus() const { return modulus_; } + std::vector<uint8_t> 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<uint8_t> public_exp_; + std::vector<uint8_t> private_exp_; + std::vector<uint8_t> modulus_; + std::vector<uint8_t> product_code_; + std::string activation_server_; + uint32_t build_date_; +}; + +class FileManager; +class IFunction; +class FileStream; + +class FileFolder : public ObjectList<FileFolder> +{ +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<FileFolder*> 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<InternalFile> +{ +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<uint8_t> 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<uint8_t> dump_; + std::vector<uint8_t> mask_; + std::vector<size_t> pos_; +}; + +class WatermarkManager : public ObjectList<Watermark> +{ +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<ProjectTemplate> +{ +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 |