• 代码保护软件VMProtect用户手册之内置脚本的使用(3)——Mach-O文件


    VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。

    本文继续对VMProtect中强大的内置脚本的使用进行介绍,希望对您有所帮助。

    【下载VMProtect最新试用版】icon-default.png?t=M85Bhttps://www.evget.com/product/1859/download

    VMProtect具有内置的强大脚本语言LUA,极大地增强了VMProtect在每个保护阶段的默认保护功能。LUA语法非常类似于JavaScript,但与之不同的是,LUA不包含显式类。不过,脚本语言允许轻松地实现类、继承和事件等面向对象的编程机制。

    对于如何使用脚本语言,可以进行以下三类的介绍:

    • 内置功能
    • 事件

    第一部分:类

    VMProtect中内置的脚本语言LUA是面向对象的:它在语法,意识形态和实现方面与JavaScript非常相似。脚本语言包括提供基本功能的标准类和提供对应用程序保护功能的访问的专用类。

    ▲Mach-O文件

    使用Mach-O格式的常量:

    enum MacFormat {
    	//Load命令类型
    	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_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); //返回具有给定索引的体系结构
    	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); //向文件写入缓冲区
    };

    一个使用Mach-O架构段列表的类:

    class MacSegments {
    public:
    	MacSegment item(int index); //返回具有给定索引的段
    	int count(); //返回列表中的段数
    	MacSegment itemByAddress(); //返回给定地址的段
    };

    与Mach-O架构部分一起使用的类:

    class MacSegment {
    public:
    	uint64 address(); //返回段的地址
    	string name(); //返回段的名称
    	uint64 size(); //返回段的大小
    	int physicalOffset(); //返回段的文件位置
    	int physicalSize(); //返回段的文件大小
    	int flags(); //返回段的标志
    	bool excludedFromPacking(); //返回“排除包装”属性
    };

    一个使用Mach-O架构部分列表的类:

    class MacSections {
    public:
    	MacSection item(int index); //返回具有给定索引的节
    	int count(); //返回列表中的节数
    	MacSection itemByAddress(uint64 address); //返回给定地址的部分
    };

    使用Mach-O架构部分的类:

    class MacSection {
    public:
    	uint64 address(); //返回该节的地址
    	string name(); //返回该节的名称
    	uint64 size(); //返回该节的大小
    	int offset(); //返回该节的文件位置
    	MacSegment segment(); //返回父段
    };

    一个使用Mach-O体系结构加载命令列表的类:

    class MacCommands {
    public:
    	MacCommand item(int index); //返回带有给定索引的命令
    	int count(); //返回列表中命令的数量
    	MacCommand itemByType(int type); //返回给定类型的命令
    };

    使用Mach-O体系结构加载命令的类:

    class MacCommand {
    public:
    	uint64 address(); //返回命令的地址
    	int type(); //返回命令的类型
    	string name(); //返回命令名
    	int size(); //返回命令的大小
    };

    一个使用Mach-O架构符号列表的类:

    class MacSymbols {
    public:
    	MacSymbol item(int index); //返回具有给定索引的符号
    	int count(); //返回列表中的符号数量
    };

    用于处理Mach-O体系结构的导入库列表的类:

    class MacImports {
    public:
    	MacImport item(int index); //返回具有给定索引的导入库
    	int count(); //返回列表中导入的库的数量
    	MacImport itemByName(string name); //返回具有给定名称的导入库
    };

    使用Mach-O架构导入库的类:

    class MacImport {
    public:
    	string name(); //返回导入库的名称
    	MacImportFunction item(int index); //返回带有给定索引的导入函数
    	int count(); //返回列表中导入函数的数量
    	void setName(string name); //设置导入库的名称
    };

    一个用于处理Mach-O架构的导出函数列表的类:

    class MacExports {
    public:
    	string name(); //返回库的名称
    	MacExport item(); //返回具有给定索引的导出函数
    	int count(); //返回列表中导出函数的数量
    	void clear(); //清除列表
    	MacExport itemByAddress(uint64 address); //返回指定地址的导出函数
    	MacExport itemByName(string name); //返回具有给定名称的导出函数
    };

    使用Mach-O架构导出函数的类:

    class MacExport {
    public:
    	uint64 address(); //返回导出函数的地址
    	string name(); //返回导出函数的名称
    	string forwardedName(); //返回被导出函数转发到的函数的名称
    	void destroy(); //销毁导出的函数
    };

    一个用于处理Mach-O架构的修正(重定位)列表的类:

    class MacFixups {
    public:
    	MacFixup item(int index); //返回具有给定索引的元素
    	int count(); //返回列表中的元素数量
    	MacFixup itemByAddress(uint64 address); //返回给定地址的元素
    };

    使用Mach-O架构修复的类:

    class MacFixup {
    public:
    	uint64 address(); //返回元素的地址
    };
  • 相关阅读:
    自动驾驶中常见的位姿表示和坐标系问题
    Springboot建筑造价师资格考试应试网站毕业设计源码260839
    「Python条件结构」实现超市付款功能
    Lwip之PPP、PPPoE实现(一)
    【001】变量知多少
    Java类加载过程
    Python标准库中内置装饰器@staticmethod@classmethod
    C++流媒体开源库Live555详细介绍
    多旋翼无人机仿真 rotors_simulator 是如何悬停的(二)
    Python3 - Docker图像化管理工具之Portainer
  • 原文地址:https://blog.csdn.net/m0_67129275/article/details/127101644