Встроенный скриптовый язык LUA программы VMProtect является объектно-ориентированным: по синтаксису, идеалогии и реализации он во многом похож на JavaScript. В состав скриптового языка входят как стандартные классы, обеспечивающие базовую функциональность, так и специализированные классы, предоставляющие доступ к функционалу защиты приложения.
Опции проекта:
enum ProjectOption { None, Pack, ImportProtection, MemoryProtection, ResourceProtection, CheckDebugger, CheckKernelDebugger, CheckVirtualMachine, StripFixups, StripDebugInfo, DebugMode }
Класс для работы с ядром VMProtect:
class Core { public: string projectFileName(); // возращает имя проекта void saveProject(); // сохраняет проект string inputFileName(); // возвращает имя исходного файла для текущего проекта string outputFileName(); // возращает имя выходного файла для текущего проекта void setOutputFileName(string name); // устанавливает имя выходного файла для текущего проекта string watermarkName(); // возвращает имя водяного знака из текущего проекта void setWatermarkName(string name); // устанавливает имя водяного знака для текущего проекта int options(); // возвращает опции для текущего проекта void setOptions(int options); // устанавливает опции для текущего проекта string vmSectionName(); // возвращает имя сегмента ВМ для текущего проекта void setVMSectionName(); // устанавливает имя сегмента ВМ для текущего проекта Licenses licenses(); // возвращает список лицензий для текущего проекта Files files(); // возвращает список файлов для текущего проекта Watermarks watermarks(); // возвращает список водяных знаков PEFile/MacFile inputFile(); // возвращает исходный файл PEFile/MacFile outputFile(); // возвращает выходной файл PEArchitecture/MacArchitecture inputArchitecture(); // возвращает исходную архитектуру PEArchitecture/MacArchitecture outputArchitecture(); // возвращает выходную архитектуру };
Класс для работы со списком водяных знаков:
class Watermarks { public: Watermark item(int index); // возвращает водяной знак с индексом index int count(); // возвращает количество водяных знаков в списке Watermark itemByName(string name); // возвращает водяной знак с именем name Watermark add(string name, string value); // добавляет водяной знак с именем name и значением value }
Класс для работы с водяным знаком:
class Watermark { public: string name(); // возвращает имя водяного знака string value(); // возвращает значение водяного знака bool blocked(); // возвращает признак "Заблокирован" void setBlocked(bool value); // устанавливает признак "Заблокирован" }
Класс для работы со списком лицензий:
class Licenses { public: int keyLength(); // возвращает размер ключа string publicExp(); // возвращает публичную экспоненту string privateExp(); // возвращает приватную экспоненту string modulus(); // возвращает модулус License item(int index); // возвращает лицензию с индексом index int count(); // возвращает количество лицензий в списке }
Класс для работы с лицензией:
class License { public: string date(string format = "%c"); // возвращает дату лицензии string customerName(); // возвращает имя владельца лицензии string customerEmail(); // возвращает адрес электронной почты владельца лицензии string orderRef(); // возвращает номер заказа, по которому приобретена лицензия string comments(); // возвращает комментарии к лицензии string serialNumber(); // возвращает серийный номер лицензии bool blocked(); // возвращает признак "Заблокирован" void setBlocked(bool value); // устанавливает признак "Заблокирован" }
Класс для работы со списком файлов:
class Files { public: File item(int index); // возвращает файл с индексом index int count(); // возвращает количество файлов в списке }
Класс для работы с файлом:
class File { public: string name(); // возвращает название файла string fileName(); // возвращает имя файла int options(); // возвращает опции void setName(string name); // устанавливает название файла void setFileName(string name); // устанавливает имя файла void setOptions(); // устанавлиает опции }
Класс для работы с пользовательскими папками:
class Folders { public: int count(); // возвращает количество папок в списке Folder item(int index); // возвращает папку с индексом index Folder add(string name); // добавляет новую папку void clear(); // очищает список };
Класс для работы с пользовательской папкой:
class Folder { public: int count(); // возвращает количество подпапок Folder item(int index); // возвращает подпапку с индексом index Folder add(string name); // добавляет новую подпапку string name(); // возвращает имя папки void clear(); // очищает список подпапок void destroy(); // уничтожает папку и все дочерние подпапки };
Константы для работы с PE форматом:
enum PEFormat { // Directory Entries IMAGE_DIRECTORY_ENTRY_EXPORT, IMAGE_DIRECTORY_ENTRY_IMPORT, IMAGE_DIRECTORY_ENTRY_RESOURCE, IMAGE_DIRECTORY_ENTRY_EXCEPTION, IMAGE_DIRECTORY_ENTRY_SECURITY, IMAGE_DIRECTORY_ENTRY_BASERELOC, IMAGE_DIRECTORY_ENTRY_DEBUG, IMAGE_DIRECTORY_ENTRY_ARCHITECTURE, IMAGE_DIRECTORY_ENTRY_TLS, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, IMAGE_DIRECTORY_ENTRY_IAT, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, // Section characteristics IMAGE_SCN_CNT_CODE, IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_NOT_CACHED, IMAGE_SCN_MEM_NOT_PAGED, IMAGE_SCN_MEM_SHARED, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, // Resource types RT_CURSOR, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING, RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGETABLE, RT_GROUP_CURSOR, RT_GROUP_ICON, RT_VERSION, RT_DLGINCLUDE, RT_PLUGPLAY, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML, RT_MANIFEST, RT_DLGINIT, RT_TOOLBAR };
Класс для работы с PE файлом:
class PEFile { public: string name(); // возвращает имя файла string format(); // возвращает имя формата "PE" uint64 size(); // возвращает размер файла int count(); // возвращает количество архитектур в списке PEArchitecture item(int index); // возвращает архитектуру с индексом index uint64 seek(uint64 offset); // устанавливает файловую позицию uint64 tell(); // возвращает файловую позицию int write(string buffer); // записывает буфер в файл };
Класс для работы с PE архитектурой:
class PEArchitecture { public: string name(); // возвращает имя архитектуры PEFile file(); // возвращает родительский файл uint64 entryPoint(); // возвращает стартовый адрес uint64 imageBase(); // возвращает стартовый адрес OperandSize cpuAddressSize(); // возвращает битность архитектуры uint64 size(); // возвращает размер архитектуры PESegments segments(); // возвращает список сегментов PESections sections(); // возвращает список секций PEDirectories directories(); // возвращает список директорий PEImports imports(); // возвращает список импортируемых библиотек PEExports exports(); // возвращает список экспортируемых функций PEResources resources(); // возвращает список ресурсов PEFixups fixups(); // возвращает список настраиваемых элементов MapFunctions mapFunctions(); // возвращает список доступных для защиты функций IntelFunctions functions(); // возвращает список защищаемых функций bool addressSeek(uint64 address); // устанавливает файловую позицию uint64 seek(uint64 offset); // устанавливает файловую позицию uint64 tell(); // возвращает файловую позицию int write(string buffer); // записывает буфер в файл };
Класс для работы cо списком сегментов для PE архитектуры:
class PESegments { public: PESegment item(int index); // возвращает сегмент с индексом index int count(); // возвращает количество сегментов в списке PESegment itemByAddress(uint64 address); // возвращает сегмент с адресом address };
Класс для работы c сегментом для PE архитектуры:
class PESegment { public: uint64 address(); // возвращает адрес сегмента string name(); // возвращает имя сегмента uint64 size(); // возвращает размер сегмента int physicalOffset(); // возвращает файловую позицию сегмента int physicalSize(); // возвращает файловый размер сегмента int flags(); // возвращает флаги сегмента bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" void setName(string name); // устанавливает имя сегмента };
Класс для работы cо списком секций для PE архитектуры:
class PESections { public: PESection item(int index); // возвращает секцию с индексом index int count(); // возвращает количество секций в списке PESection itemByAddress(uint64 address); // возвращает секцию с адресом address };
Класс для работы с секцией для PE архитектуры:
class PESection { public: uint64 address(); // возвращает адрес секции string name(); // возвращает имя секции uint64 size(); // возвращает размер секции int offset(); // возвращает файловую позицию секции PESegment segment(); // возвращает родительский сегмент };
Класс для работы с директориями для PE архитектуры:
class PEDirectories { public: PEDirectory item(int index); // возвращает директорию с индексом index int count(); // возвращает количество директорий в списке PEDirectory itemByType(int type); // возвращает директорию с типом type };
Класс для работы с директорией для PE архитектуры:
class PEDirectory { public: uint64 address(); // возвращает адрес директории string name(); // возвращает имя директории uint64 size(); // возвращает размер директории int type(); // возвращает тип директории void setAddress(uint64 address); // устанавливает адрес директории void setSize(int size); // устанавливает размер директории void clear(); // очищает адрес и размер директории };
Класс для работы со списком импортируемых библиотек для PE архитектуры:
class PEImports { public: PEImport item(int index); // возвращает библиотеку с индексом index int count(); // возвращает количество библиотек в списке PEImport itemByName(string name); // возвращает библиотеку с именем name };
Класс для работы с импортируемой библиотекой для PE архитектуры:
class PEImport { public: string name(); // возвращает имя библиотеки PEImportFunction item(int index); // возвращает импортируемую функцию с индексом index int count(); // возвращает количество импортируемых функций void setName(string name); // устанавливает имя библиотеки };
Класс для работы с импортируемой функцией для PE архитектуры:
class PEImportFunction { public: uint64 address(); // возвращает адрес ячейки, в которую записывается адрес импортируемой функции string name(); // возвращает имя импортируемой функции };
Класс для работы со списком экспортируемых функций для PE архитектуры:
class PEExports { public: string name(); // возвращает имя библиотеки void setName(string name); // устанавливает имя библиотеки PEExport item(int index); // возвращает экспортируемую функцию с индексом index int count(); // возвращает количество экспортируемых функций в списке void clear(); // очищает список PEExport itemByAddress(uint64 address); // возвращает экспортируемую функцию с адресом address PEExport itemByName(string name); // возвращает экспортируемую функцию с именем name };
Класс для работы с экспортируемой функцией для PE архитектуры:
class PEExport { public: uint64 address(); // возвращает адрес экспортируемой функции string name(); // возвращает имя экспортируемой функции void setName(string name); // устанавливает имя экспортируемой функции int ordinal(); // возвращает ординал экспортируемой функции string forwardedName(); // возвращает имя функции, на которую перенаправлена экспортируемая функция void destroy(); // уничтожает экспортируемую функцию };
Класс для работы со списком ресурсов для PE архитектуры:
class PEResources { public: PEResource item(int index); // возвращает ресурс с индексом index int count(); // возвращает количество ресурсов в списке void clear(); // очищает список PEResource itemByType(int type); // возвращает ресурс с типом type PEResource itemByName(string name); // возвращает ресурс с именем name };
Класс для работы с ресурсом для PE архитектуры:
class PEResource { public: PEResource item(int index); // возвращает ресурс с индексом index int count(); // возвращает количество ресурсов в списке void clear(); // очищает список uint64 address(); // возвращает адрес ресурса int size(); // возвращает размер ресурса string name(); // возвращает имя ресурса int type(); // возвращает тип ресурса bool isDirectory(); // возвращает признак "Директория" void destroy(); // уничтожает ресурс PEResource itemByName(string name); // возвращает ресурс с именем name bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" };
Класс для работы со списком настраиваемых элементов для PE архитектуры:
class PEFixups { public: PEFixup item(int index); // возвращает элемент с индексом index int count(); // возвращает количество элементов в списке PEFixup itemByAddress(uint64 address); // возвращает элемент с адресом address };
Класс для работы с настраиваемым элементом для PE архитектуры:
class PEFixup { public: uint64 address(); // возвращает адрес элемента };
Константы для работы с Mach-O форматом:
enum MacFormat { // Load Command Types LC_SEGMENT, LC_SYMTAB, LC_SYMSEG, LC_THREAD, LC_UNIXTHREAD, LC_LOADFVMLIB, LC_IDFVMLIB, LC_IDENT, LC_FVMFILE, LC_PREPAGE, LC_DYSYMTAB, LC_LOAD_DYLIB, LC_ID_DYLIB, LC_LOAD_DYLINKER, LC_PREBOUND_DYLIB, LC_ROUTINES, LC_SUB_FRAMEWORK, LC_SUB_UMBRELLA, LC_SUB_CLIENT, LC_SUB_LIBRARY, LC_TWOLEVEL_HINTS, LC_PREBIND_CKSUM, LC_LOAD_WEAK_DYLIB, LC_SEGMENT_64, LC_ROUTINES_64, LC_UUID, LC_RPATH, LC_CODE_SIGNATURE, LC_SEGMENT_SPLIT_INFO, LC_REEXPORT_DYLIB, LC_LAZY_LOAD_DYLIB, LC_ENCRYPTION_INFO, LC_DYLD_INFO, LC_DYLD_INFO_ONLY, LC_LOAD_UPWARD_DYLIB, LC_VERSION_MIN_MACOSX, // Section Types SECTION_TYPE, SECTION_ATTRIBUTES, S_REGULAR, S_ZEROFILL, S_CSTRING_LITERALS, S_4BYTE_LITERALS, S_8BYTE_LITERALS, S_LITERAL_POINTERS, S_NON_LAZY_SYMBOL_POINTERS, S_LAZY_SYMBOL_POINTERS, S_SYMBOL_STUBS, S_MOD_INIT_FUNC_POINTERS, S_MOD_TERM_FUNC_POINTERS, S_COALESCED, S_GB_ZEROFILL, S_INTERPOSING, S_16BYTE_LITERALS, S_DTRACE_DOF, S_LAZY_DYLIB_SYMBOL_POINTERS, SECTION_ATTRIBUTES_USR, S_ATTR_PURE_INSTRUCTIONS, S_ATTR_NO_TOC, S_ATTR_STRIP_STATIC_SYMS, S_ATTR_NO_DEAD_STRIP, S_ATTR_LIVE_SUPPORT, S_ATTR_SELF_MODIFYING_CODE, S_ATTR_DEBUG, SECTION_ATTRIBUTES_SYS, S_ATTR_SOME_INSTRUCTIONS, S_ATTR_EXT_RELOC, S_ATTR_LOC_RELOC };
Класс для работы с Mach-O файлом:
class MacFile { public: string name(); // возвращает имя файла string format(); // возвращает имя формата "Mach-O" uint64 size(); // возвращает размер файла int count(); // возвращает количество архитектур в списке MacArchitecture item(int index); // возвращает архитектуру с индексом index uint64 seek(uint64 offset); // устанавливает файловую позицию uint64 tell(); // возвращает файловую позицию int write(string buffer); // записывает буфер в файл };
Класс для работы с Mach-O архитектурой:
class MacArchitecture { public: string name(); // возвращает имя архитектуры MacFile file(); // возвращает родительский файл uint64 entryPoint(); // возвращает стартовый адрес OperandSize cpuAddressSize(); // возвращает битность архитектуры uint64 size(); // возвращает размер архитектуры MacSegments segments(); // возвращает список сегментов MacSections sections(); // возвращает список секций MacCommands commands(); // возвращает список загрузочных команд MacSymbols symbols(); // возвращает список символов MacImports imports(); // возвращает список импортируемых библиотек MacExports exports(); // возвращает список экспортируемых функций MacFixups fixups(); // возвращает список настраиваемых элементов MapFunctions mapFunctions(); // возвращает список доступных для защиты функций IntelFunctions functions(); // возвращает список защищаемых функций bool addressSeek(uint64 address); // устанавливает файловую позицию uint64 seek(uint64 offset); // устанавливает файловую позицию uint64 tell(); // возвращает файловую позицию int write(string buffer); // записывает буфер в файл };
Класс для работы cо списком сегментов для Mach-O архитектуры:
class MacSegments { public: MacSegment item(int index); // возвращает сегмент с индексом index int count(); // возвращает количество сегментов в списке MacSegment itemByAddress(); // возвращает сегмент с адресом address };
Класс для работы c сегментом для Mach-O архитектуры:
class MacSegment { public: uint64 address(); // возвращает адрес сегмента string name(); // возвращает имя сегмента uint64 size(); // возвращает размер сегмента int physicalOffset(); // возвращает файловую позицию сегмента int physicalSize(); // возвращает файловый размер сегмента int flags(); // возвращает флаги сегмента bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" };
Класс для работы cо списком секций для Mach-O архитектуры:
class MacSections { public: MacSection item(int index); // возвращает секцию с индексом index int count(); // возвращает количество секций в списке MacSection itemByAddress(uint64 address); // возвращает секцию с адресом address };
Класс для работы c секцией для Mach-O архитектуры:
class MacSection { public: uint64 address(); // возвращает адрес секции string name(); // возвращает имя секции uint64 size(); // возвращает размер секции int offset(); // возвращает файловую позицию секции MacSegment segment(); // возвращает родительский сегмент };
Класс для работы cо списком загрузочных команд для Mach-O архитектуры:
class MacCommands { public: MacCommand item(int index); // возвращает команду с индексом index int count(); // возвращает количество команд в списке MacCommand itemByType(int type); // возвращает команду с типом type };
Класс для работы c загрузочной командой для Mach-O архитектуры:
class MacCommand { public: uint64 address(); // возвращает адрес команды int type(); // возвращает тип команды string name(); // возвращает имя команды int size(); // возвращает размер команды };
Класс для работы cо списком символов для Mach-O архитектуры:
class MacSymbols { public: MacSymbol item(int index); // возвращает символ с индексом index int count(); // возвращает количество символов в списке };
Класс для работы c символом для Mach-O архитектуры:
class MacSymbol { public: uint64 value(); // возвращает значение символа string name(); // возвращает имя символа };
Класс для работы со списком импортируемых библиотек для Mach-O архитектуры:
class MacImports { public: MacImport item(int index); // возвращает импортируемую библиотеку с индексом index int count(); // возвращает количество импортируемых библиотек в списке MacImport itemByName(string name); // возвращает импортируемую библиотеку с именем name };
Класс для работы с импортируемой библиотекой для Mach-O архитектуры:
class MacImport { public: string name(); // возвращает имя импортируемой библиотеки MacImportFunction item(int index); // возвращает импортируемую функцию с индексом index int count(); // возвращает количество импортируемых функций в списке void setName(string name); // устанавливает имя импортируемой библиотеки };
Класс для работы с импортируемой функцией для Mach-O архитектуры:
class MacImportFunction { public: uint64 address(); // возвращает адрес ячейки, в которую записывается адрес импортируемой функции string name(); // возвращает имя импортируемой функции };
Класс для работы со списком экспортируемых функций для Mach-O архитектуры:
class MacExports { public: string name(); // возвращает имя библиотеки MacExport item(); // возвращает экспортируемую функцию с индексом index int count(); // возвращает количество экспортируемых функций в списке void clear(); // очищает список MacExport itemByAddress(uint64 address); // возвращает экспортируемую функцию с адресом address MacExport itemByName(string name); // возвращает экспортируемую функцию с именем name };
Класс для работы с экспортируемой функцией для Mach-O архитектуры:
class MacExport { public: uint64 address(); // возвращает адрес экспортируемой функции string name(); // возвращает имя экспортируемой функции string forwardedName(); // возвращает имя функции, на которую перенаправлена экспортируемая функция void destroy(); // уничтожает экспортируемую функцию };
Класс для работы со списком настраиваемых элементов для Mach-O архитектуры:
class MacFixups { public: MacFixup item(int index); // возвращает элемент с индексом index int count(); // возвращает количество элементов в списке MacFixup itemByAddress(uint64 address); // возвращает элемент с адресом address };
Класс для работы с настраиваемым элементом для Mach-O архитектуры:
class MacFixup { public: uint64 address(); // возвращает адрес элемента };
Класс для работы со списком функций:
class MapFunctions { public: MapFunction item(int index); // возвращает функцию с индексом index int count(); // возвращает количество функций в списке MapFunction itemByAddress(uint64 address); // возвращает функцию с адресом address MapFunction itemByName(string name); // возвращает функцию с именем name };
Типы функций:
enum ObjectType { Unknown, Code, Data, Export, Marker, APIMarker, Import, String };
Класс для работы с функцией:
class MapFunction { public: uint64 address(); // возвращает адрес функции string name(); // возвращает имя функции ObjectType type(); // возвращает тип функции References references(); // возвращает список ссылок };
Класс для работы со списком ссылок:
class References { public: Reference item(int index); // возвращает ссылку с индексом index int count(); // возвращает количество ссылок в списке };
Класс для работы с ссылкой:
class Reference { public: uint64 address(); // возвращает адрес команды uint64 operandAddress(); // возвращает адрес ссылки };
Класс для работы со списком функций Intel:
class IntelFunctions { public: IntelFunction item(int index); // возвращает функцию с индексом index int count(); // возвращает количество функций в списке void clear(); // очищает список IntelFunction itemByAddress(uint64 address); // возвращает функцию с адресом address IntelFunction itemByName(string name); // возвращает функцию с именем name IntelFunction addByAddress(uint64 address, CompilationType type = ctVirtualization); // добавляет новую функцию с адресом address и типом компиляции type };
Типы компиляции:
enum CompilationType { None, Virtualization, Mutation, Ultra };
Класс для работы с функцией Intel:
class IntelFunction { public: uint64 address(); // возвращает адрес функции string name(); // возвращает имя функции ObjectType type(); // возвращает тип функции IntelCommand item(int index); // возвращает команду с индексом index int count(); // возвращает количество команд в списке CompilationType compilationType(); // возвращает тип компиляции void setCompilationType(CompilationType value); // устанавливает тип компиляции CommandLinks links(); // возвращает список связей IntelCommand itemByAddress(uint64 address); // возвращает команду с адресом address void destroy(); // уничтожает функцию Folder folder(); // возвращает пользовательскую папку void setFolder(Folder folder); // устанавливает пользовательскую папку };
Типы команд Intel:
enum IntelCommandType { Unknown, Push, Pop, Mov, Add, Xor, Test, Lea, Ud0, Ret, Ssh, Crc, Call, Jmp, Fstsw, Fsqrt, Fchs, Fstcw, Fldcw, Fild, Fist, Fistp, Fld, Fstp, Fst, Fadd, Fsub, Fsubr, Fisub, Fisubr, Fdiv, Fcomp, Fmul, Repe, Repne, Rep, DB, DW, DD, DQ, Movs, Cmps, Scas, Movzx, Movsx, Inc, Dec, Les, Lds, Lfs, Lgs, Lss, Xadd, Bswap, Jxx, And, Sub, Stos, Lods, Nop, Xchg, Pushf, Popf, Sahf, Lahf, Shl, Shr, Sal, Sar, Rcl, Rcr, Rol, Ror, Shld, Shrd, Loope, Loopne, Loop, Jcxz, In, Ins, Out, Outs, Wait, Cbw, Cwde, Cdqe, Cwd, Cdq, Cqo, Clc, Stc, Cli, Sti, Cld, Std, Not, Neg, Div, Imul, Idiv, Mul, Or, Adc, Cmp, Sbb, Pusha, Popa, Clflush, Pause, Bound, Arpl, Daa, Das, Aaa, Aam, Aad, Aas, Enter, Leave, Int, Into, Iret, Set, Cmov, Addpd, Addps, Addsd, Addss, Andpd, Andps, Andnpd, Andnps, Cmppd, Cmpps, Cmpsd, Cmpss, Comisd, Comiss, Cvtdq2ps, Cvtpd2dq, Cvtdq2pd, Cvtpd2pi, Cvtps2pi, Cvtpd2ps, Cvtps2pd, Cvtpi2pd, Cvtpi2ps, Cvtps2dq, Cvtsd2si, Cvtss2si, Cvtsd2ss, Cvtss2sd, Cvttpd2pi, Cvttps2pi, Cvttpd2dq, Cvttps2dq, Cvttsd2si, Cvttss2si, Divpd, Divps, Divsd, Divss, Maxpd, Maxps, Maxsd, Maxss, Minpd, Minps, Minsd, Minss, Mulpd, Mulps, Mulsd, Mulss, Orpd, Orps, Movd, Movq, Movntq, Movapd, Movaps, Movdqa, Movdqu, Movdq2q, Movq2dq, Movhlps, Movhpd, Movhps, Movlhps, Movlpd, Movlps, Movmskpd, Movmskps, Movnti, Movntpd, Movntps, Movsd, Movss, Movupd, Movups, Pmovmskb, Psadbw, Pshufw, Pshufd, Pshuflw, Pshufhw, Psubb, Psubw, Psubd, Psubq, Psubsb, Psubsw, Psubusb, Psubusw, Paddb, Paddw, Paddd, Paddq, Paddsb, Paddsw, Paddusb, Paddusw, Pavgb, Pavgw, Pinsrw, Pextrw, Pmaxsw, Pmaxub, Pminsw, Pminub, Pmulhuw, Pmulhw, Pmullw, Pmuludq, Psllw, Pslld, Psllq, Pslldq, Psraw, Psrad, Psrlw, Psrld, Psrlq, Psrldq, Punpcklbw, Punpcklwd, Punpckldq, Punpcklqdq, Punpckhqdq, Packusdw, Pcmpgtb, Pcmpgtw, Pcmpgtd, Pcmpeqb, Pcmpeqw, Pcmpeqd, Emms, Packsswb, Packuswb, Punpckhbw, Punpckhwd, Punpckhdq, Packssdw, Pand, Pandn, Por, Pxor, Pmaddwd, Rcpps, Rcpss, Rsqrtss, Movsxd, Shufps, Shufpd, Sqrtpd, Sqrtps, Sqrtsd, Sqrtss, Subpd, Subps, Subsd, Subss, Ucomisd, Ucomiss, Unpckhpd, Unpckhps, Unpcklpd, Unpcklps, Xorpd, Xorps, Bt, Bts, Btr, Btc, Xlat, Cpuid, Rsm, Bsf, Bsr, Cmpxchg, Cmpxchg8b, Hlt, Cmc, Lgdt, Sgdt, Lidt, Sidt, Smsw, Lmsw, Invlpg, Lar, Lsl, Clts, Invd, Wbinvd, Ud2, Wrmsr, Rdtsc, Rdmsr, Rdpmc, Fcom, Fdivr, Fiadd, Fimul, Ficom, Ficomp, Fidiv, Fidivr, Faddp, Fmulp, Fsubp, Fsubrp, Fdivp, Fdivrp, Fbld, Fbstp, Ffree, Frstor, Fsave, Fucom, Fucomp, Fldenv, Fstenvm, Fxch, Fabs, Fxam, Fld1, Fldl2t, Fldl2e, Fldpi, Fldlg2, Fldln2, Fldz, Fyl2x, Fptan, Fpatan, Fxtract, Fprem1, Fdecstp, Fincstp, Fprem, Fyl2xp1, Fsincos, Frndint, Fscale, Fsin, Fcos, Ftst, Fstenv, F2xm1, Fnop, Finit, Fclex, Fcompp, Sysenter, Sysexit, Sldt, Str, Lldt, Ltr, Verr, Verw, Sfence, Lfence, Mfence, Prefetchnta, Prefetcht0, Prefetcht1, Prefetcht2, Prefetch, Prefetchw, Fxrstor, Fxsave, Ldmxcsr, Stmxcsr, Fcmovb, Fcmove, Fcmovbe, Fcmovu, Fcmovnb, Fcmovne, Fcmovnbe, Fcmovnu, Fucomi, Fcomi, Fucomip, Fcomip, Fucompp, Vmcall, Vmlaunch, Vmresume, Vmxoff, Monitor, Mwait, Xgetbv, Xsetbv, Vmrun, Vmmcall, Vmload, Vmsave, Stgi, Clgi, Skinit, Invlpga, Swapgs, Rdtscp, Syscall, Sysret, Femms, Getsec, Pshufb, Phaddw, Phaddd, Phaddsw, Pmaddubsw, Phsubw, Phsubd, Phsubsw, Psignb, Psignw, Psignd, Pmulhrsw, Pabsb, Pabsw, Pabsd, Movbe, Palignr, Rsqrtps, Vmread, Vmwrite, Svldt, Rsldt, Svts, Rsts, Xsave, Xrstor, Vmptrld, Vmptrst, Maskmovq, Fnstenv, Fnstcw, Fstp1, Fneni, Fndisi, Fnclex, Fninit, Fsetpm, Fisttp, Fnsave, Fnstsw, Fxch4, Fcomp5, Ffreep, Fxch7, Fstp8, Fstp9, Haddpd, Hsubpd, Addsubpd, Addsubps, Movntdq, Fcom2, Fcomp3, Haddps, Hsubps, Movddup, Movsldup, Cvtsi2sd, Cvtsi2ss, Movntsd, Movntss, Lddqu, Movshdup, Popcnt, Tzcnt, Lzcnt, Pblendvb, Pblendps, Pblendpd, Ptest, Movsxbw, Movsxbd, Movsxbq, Movsxwd, Movsxwq, Movsxdq, Muldq, Pcmpeqq, Movntdqa, Xsaveopt, Maskmovdqu, Ud1, Pcmpgtq, Movzxbw, Movzxbd, Movzxbq, Movzxwd, Movzxwq, Movzxdq };
Сегменты Intel:
enum IntelSegment { None, es, cs, ss, ds, fs, gs };
Флаги Intel:
enum IntelFlag { C, P, A, Z, S, T, I, D, O };
Регистры Intel:
enum IntelRegistr { eax, ecx, edx, ebx, esp, ebp, esi, edi, r8, r9, r10, r11, r12, r13, r14, r15 };
Класс для работы с командой Intel:
class IntelCommand { public: uint64 address(); // возвращает адрес команды IntelCommandType type(); // возвращает тип команды string text(); // возвращает текстовое представление int size(); // возвращает размер команды int dump(int index); // возвращает данные команды по индексу index CommandLink link(); // возвращает связь команды int flags(); // возвращает флаги команды IntelSegment baseSegment(); // возвращает базовый сегмент IntelCommandType preffix(); // возвращает тип преффиксной команды IntelOperand operand(int index); // возвращает операнд с индексом index };
Типы операндов:
enum OperandType { None, Value, Registr, Memory, SegmentRegistr, ControlRegistr, DebugRegistr, FPURegistr, HiPartRegistr, BaseRegistr, MMXRegistr, XMMRegistr };
Размеры операндов:
enum OperandSize { Byte, Word, DWord, QWord, TByte, OWord, FWord };
Класс для работы с операндом команды Intel:
class IntelOperand { public: int type(); // возвращает тип операнда OperandSize size(); // возвращает размер операнда int registr(); // возвращает регистр int baseRegistr(); // возвращает базовый регистр int scale(); // возвращает коэффициент uint64 value(); // возвращает значение };
Класс для работы со списком связей:
class CommandLinks { public: CommandLink item(int index); // возвращает связь с индексом index int count(); // возвращает количество связей в списке };
Типы связей:
enum LinkType { None, SEHBlock, FinallyBlock, DualSEHBlock, FilterSEHBlock, Jmp, JmpWithFlag, JmpWithFlagNSFS, JmpWithFlagNSNA, JmpWithFlagNSNS, Call, Case, Switch, Native, Offset, GateOffset, ExtSEHBlock, MemSEHBlock, ExtSEHHandler, VBMemSEHBlock };
Класс для работы со связью команды:
class CommandLink { public: uint64 toAddress(); // возвращает адрес, на который ссылается связь LinkType type(); // возвращает тип связи IntelCommand from(); // возвращает родительскую команду };
Класс для работы с библиотекой:
enum ParamType { "void", "byte", "char", "short", "ushort", "int", "uint", "long", "ulong", "size_t", "float", "double", "string", "pointer" }; enum CallType { "default", "cdecl", "stdcall" }; class FFILibrary { public: string name(); // возвращает имя uint64 address(); // возвращает адрес в памяти void close(); FFIFunction getFunction(string name, ParamType ret, ParamType param1, ...); // возвращает функцию FFIFunction getFunction(string name, table (ParamType ret, CallType abi, ParamType, ...)); // возвращает функцию };
Класс для работы с внешней функцией:
class FFIFunction { string name(); // возвращает имя uint64 address(); // возвращает адрес в памяти };