代碼保護軟件VMProtect用戶手冊之內(nèi)置腳本的使用(3)——Mach-O文件
VMProtect是一種很可靠的工具,可以保護應(yīng)用程序代碼免受分析和破解,但只有在應(yīng)用程序內(nèi)保護機制正確構(gòu)建且沒有可能破壞整個保護的嚴(yán)重錯誤的情況下,才能實現(xiàn)最好的效果。
本文繼續(xù)對VMProtect中強大的內(nèi)置腳本的使用進行介紹,希望對您有所幫助。
VMProtect具有內(nèi)置的強大腳本語言LUA,極大地增強了VMProtect在每個保護階段的默認保護功能。LUA語法非常類似于JavaScript,但與之不同的是,LUA不包含顯式類。不過,腳本語言允許輕松地實現(xiàn)類、繼承和事件等面向?qū)ο蟮木幊虣C制。
對于如何使用腳本語言,可以進行以下三類的介紹:
- 類
- 內(nèi)置功能
- 事件
第一部分:類
VMProtect中內(nèi)置的腳本語言LUA是面向?qū)ο蟮模核谡Z法,意識形態(tài)和實現(xiàn)方面與JavaScript非常相似。腳本語言包括提供基本功能的標(biāo)準(zhǔn)類和提供對應(yīng)用程序保護功能的訪問的專用類。
▲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(); // 返回列表中的體系結(jié)構(gòu)數(shù)量 MacArchitecture item(int index); //返回具有給定索引的體系結(jié)構(gòu) uint64 seek(uint64 offset); //設(shè)置文件位置 uint64 tell(); // 返回文件位置 int write(string buffer); // 向文件寫入緩沖區(qū) };
一個使用Mach-O架構(gòu)的類:
class MacArchitecture { public: string name(); //返回體系結(jié)構(gòu)的名稱 MacFile file(); //返回父文件 uint64 entryPoint(); //返回起始地址 OperandSize cpuAddressSize(); //返回體系結(jié)構(gòu)的位計數(shù) uint64 size(); //返回架構(gòu)的大小 MacSegments segments(); //返回段列表 MacSections sections(); //返回節(jié)的列表 MacCommands commands(); //返回加載命令列表 MacSymbols symbols(); //返回符號列表 MacImports imports(); //返回導(dǎo)入庫的列表 MacExports exports(); //返回導(dǎo)出函數(shù)的列表 MacFixups fixups(); //返回修復(fù)程序列表(重新定位) MapFunctions mapFunctions(); //返回可用于保護的函數(shù)列表 IntelFunctions functions(); //返回受保護函數(shù)的列表 bool addressSeek(uint64 address); //設(shè)置文件位置 uint64 seek(uint64 offset); //設(shè)置文件位置 uint64 tell(); //返回文件位置 int write(string buffer); //向文件寫入緩沖區(qū) };
一個使用Mach-O架構(gòu)段列表的類:
class MacSegments { public: MacSegment item(int index); //返回具有給定索引的段 int count(); //返回列表中的段數(shù) MacSegment itemByAddress(); //返回給定地址的段 };
與Mach-O架構(gòu)部分一起使用的類:
class MacSegment { public: uint64 address(); //返回段的地址 string name(); //返回段的名稱 uint64 size(); //返回段的大小 int physicalOffset(); //返回段的文件位置 int physicalSize(); //返回段的文件大小 int flags(); //返回段的標(biāo)志 bool excludedFromPacking(); //返回“排除包裝”屬性 };
一個使用Mach-O架構(gòu)部分列表的類:
class MacSections { public: MacSection item(int index); //返回具有給定索引的節(jié) int count(); //返回列表中的節(jié)數(shù) MacSection itemByAddress(uint64 address); //返回給定地址的部分 };
使用Mach-O架構(gòu)部分的類:
class MacSection { public: uint64 address(); //返回該節(jié)的地址 string name(); //返回該節(jié)的名稱 uint64 size(); //返回該節(jié)的大小 int offset(); //返回該節(jié)的文件位置 MacSegment segment(); //返回父段 };
一個使用Mach-O體系結(jié)構(gòu)加載命令列表的類:
class MacCommands { public: MacCommand item(int index); //返回帶有給定索引的命令 int count(); //返回列表中命令的數(shù)量 MacCommand itemByType(int type); //返回給定類型的命令 };
使用Mach-O體系結(jié)構(gòu)加載命令的類:
class MacCommand { public: uint64 address(); //返回命令的地址 int type(); //返回命令的類型 string name(); //返回命令名 int size(); //返回命令的大小 };
一個使用Mach-O架構(gòu)符號列表的類:
class MacSymbols { public: MacSymbol item(int index); //返回具有給定索引的符號 int count(); //返回列表中的符號數(shù)量 };
用于處理Mach-O體系結(jié)構(gòu)的導(dǎo)入庫列表的類:
class MacImports { public: MacImport item(int index); //返回具有給定索引的導(dǎo)入庫 int count(); //返回列表中導(dǎo)入的庫的數(shù)量 MacImport itemByName(string name); //返回具有給定名稱的導(dǎo)入庫 };
使用Mach-O架構(gòu)導(dǎo)入庫的類:
class MacImport { public: string name(); //返回導(dǎo)入庫的名稱 MacImportFunction item(int index); //返回帶有給定索引的導(dǎo)入函數(shù) int count(); //返回列表中導(dǎo)入函數(shù)的數(shù)量 void setName(string name); //設(shè)置導(dǎo)入庫的名稱 };
一個用于處理Mach-O架構(gòu)的導(dǎo)出函數(shù)列表的類:
class MacExports { public: string name(); //返回庫的名稱 MacExport item(); //返回具有給定索引的導(dǎo)出函數(shù) int count(); //返回列表中導(dǎo)出函數(shù)的數(shù)量 void clear(); //清除列表 MacExport itemByAddress(uint64 address); //返回指定地址的導(dǎo)出函數(shù) MacExport itemByName(string name); //返回具有給定名稱的導(dǎo)出函數(shù) };
使用Mach-O架構(gòu)導(dǎo)出函數(shù)的類:
class MacExport { public: uint64 address(); //返回導(dǎo)出函數(shù)的地址 string name(); //返回導(dǎo)出函數(shù)的名稱 string forwardedName(); //返回被導(dǎo)出函數(shù)轉(zhuǎn)發(fā)到的函數(shù)的名稱 void destroy(); //銷毀導(dǎo)出的函數(shù) };
一個用于處理Mach-O架構(gòu)的修正(重定位)列表的類:
class MacFixups { public: MacFixup item(int index); //返回具有給定索引的元素 int count(); //返回列表中的元素數(shù)量 MacFixup itemByAddress(uint64 address); //返回給定地址的元素 };
使用Mach-O架構(gòu)修復(fù)的類:
class MacFixup { public: uint64 address(); //返回元素的地址 };
- 持續(xù)更新中 -
VMProtect正版授權(quán)專享在線訂購特享超低價格!還不趕緊加入你的訂購清單?>>更多詳情可點擊咨詢購買
掃描關(guān)注“慧聚IT”微信公眾號,及時獲取最新動態(tài)及最新資訊