代碼保護軟件VMProtect用戶手冊之內(nèi)置腳本的使用(2)——PE文件
VMProtect是一種很可靠的工具,可以保護應(yīng)用程序代碼免受分析和破解,但只有在應(yīng)用程序內(nèi)保護機制正確構(gòu)建且沒有可能破壞整個保護的嚴重錯誤的情況下,才能實現(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)準類和提供對應(yīng)用程序保護功能的訪問的專用類。
▲文件夾
使用自定義文件夾的類:
class Folders { public: int count(); //返回列表中文件夾的數(shù)量 Folder item(int index); //返回具有給定索引的文件夾 Folder add(string name);//添加一個新文件夾 void clear(); //清除列表 };
:使用自定義文件夾的類:
class Folder { public: int count(); //返回子文件夾的數(shù)量 Folder item(int index); //返回具有給定索引的子文件夾 Folder add(string name);//添加一個新的子文件夾 string name(); //返回文件夾的名稱 void clear(); //清除子文件夾列表 void destroy(); //銷毀所有子文件夾中的文件夾 };
▲PE文件
使用PE格式的常量:
enum PEFormat { //目錄條目 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, //部分特征 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, //資源類型 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文件的類:
public: string name(); //返回文件名 string format(); //返回“PE”格式名稱 uint64 size(); //返回文件的大小 int count(); //返回列表中的體系結(jié)構(gòu)數(shù)量 PEArchitecture item(int index); //返回具有給定索引的體系結(jié)構(gòu) uint64 seek(uint64 offset); //設(shè)置文件位置 uint64 tell(); //返回文件位置 int write(string buffer); //記錄文件的緩沖區(qū) };
一個使用PE架構(gòu)的類:
class PEArchitecture { public: string name(); //返回體系結(jié)構(gòu)的名稱 PEFile file(); //返回父文件 uint64 entryPoint(); //返回起始地址 uint64 imageBase(); // returns the base offset OperandSize cpuAddressSize(); //返回基偏移量 uint64 size(); //返回體系結(jié)構(gòu)的位計數(shù) PESegments segments(); //返回架構(gòu)的大小 PESections sections(); //返回段列表 PEDirectories directories(); //返回節(jié)的列表 PEImports imports(); //返回目錄列表 PEExports exports(); //返回導(dǎo)入庫的列表 PEResources resources(); //返回導(dǎo)出函數(shù)的列表 PEFixups fixups(); //返回資源列表 MapFunctions mapFunctions(); //返回重置(修復(fù))列表 IntelFunctions functions(); //返回可用于保護的函數(shù)列表 bool addressSeek(uint64 address); //返回受保護函數(shù)的列表 uint64 seek(uint64 offset); //設(shè)置文件位置 uint64 tell(); //返回文件位置 int write(string buffer); //將緩沖區(qū)寫入文件 };
一個與PE架構(gòu)段一起工作的類:
class PESegment { public: uint64 address(); //返回段的地址 string name(); //返回段的名稱 uint64 size(); //返回段的大小 int physicalOffset(); //返回段的文件位置(偏移量) int physicalSize(); //返回段的文件大小 int flags(); //返回段的標(biāo)志 bool excludedFromPacking(); //返回“排除包裝”屬性 void setName(string name); //設(shè)置段的名稱 };
一個處理PE架構(gòu)部分列表的類:
class PESections { public: PESection item(int index); //返回具有給定索引的節(jié) int count(); //返回列表中的節(jié)數(shù) PESection itemByAddress(uint64 address); //返回給定地址的部分 };
與PE架構(gòu)部分一起工作的類:
class PESection { public: uint64 address(); //返回該節(jié)的地址 string name(); //返回該節(jié)的名稱 uint64 size(); //返回該節(jié)的大小 int offset(); //返回該節(jié)的文件位置 PESegment segment(); //返回父段 };
與PE體系結(jié)構(gòu)目錄一起使用的類:
class PEDirectories { public: PEDirectory item(int index); //返回具有給定索引的目錄 int count(); //返回列表中的目錄數(shù) PEDirectory itemByType(int type); //返回給定類型的目錄 };
一個使用PE架構(gòu)目錄的類:
class PEDirectory { public: uint64 address(); //返回目錄的地址 string name(); //返回目錄名 uint64 size(); //返回目錄的大小 int type(); //返回目錄的類型 void setAddress(uint64 address); //設(shè)置目錄的地址 void setSize(int size); //設(shè)置目錄的大小 void clear(); //清除目錄的地址和大小 };
用于PE體系結(jié)構(gòu)的導(dǎo)入庫列表的類:
class PEImports { public: PEImport item(int index); //返回具有給定索引的庫 int count(); //返回列表中庫的數(shù)量 PEImport itemByName(string name); //返回具有給定名稱的庫 };
用于PE架構(gòu)的導(dǎo)入庫的類:
class PEImport { public: string name(); //返回庫的名稱 PEImportFunction item(int index); //返回帶有給定索引的導(dǎo)入函數(shù) int count(); //返回導(dǎo)入函數(shù)的數(shù)量 void setName(string name); //設(shè)置庫的名稱 };
使用PE架構(gòu)導(dǎo)入函數(shù)的類:
class PEImportFunction { public: uint64 address(); //返回存儲導(dǎo)入函數(shù)地址的內(nèi)存地址 string name(); //返回導(dǎo)入函數(shù)的名稱 };
用于PE體系結(jié)構(gòu)的導(dǎo)出函數(shù)列表的類:
class PEExports { public: string name(); //返回庫的名稱 PEExport item(int index); //返回具有給定索引的導(dǎo)出函數(shù) int count(); //返回列表中導(dǎo)出函數(shù)的數(shù)量 void clear(); //清除列表 PEExport itemByAddress(uint64 address); //返回指定地址的導(dǎo)出函數(shù) PEExport itemByName(string name); //返回具有給定名稱的導(dǎo)出函數(shù) };
一個帶有PE架構(gòu)導(dǎo)出功能的wotk類:
class PEExports { public: class PEExport { public: uint64 address(); //返回導(dǎo)出函數(shù)的地址 string name(); //返回導(dǎo)出函數(shù)的名稱 int ordinal(); //返回導(dǎo)出函數(shù)的序號 string forwardedName(); //返回導(dǎo)出函數(shù)轉(zhuǎn)發(fā)給的函數(shù)的名稱 void destroy(); //銷毀導(dǎo)出的函數(shù) };
一個處理PE架構(gòu)資源列表的類:
class PEResources { public: PEResource item(int index); //返回具有給定索引的資源 int count(); //返回列表中的資源數(shù)量 void clear(); //清除列表 PEResource itemByType(int type); //返回給定類型的資源 PEResource itemByName(string name); //返回具有給定名稱的資源 };
一個使用PE架構(gòu)資源的類:
class PEResource { public: PEResource item(int index); //返回具有給定索引的資源 int count(); //返回列表中的資源數(shù)量 void clear(); //清除列表 uint64 address(); //返回資源的地址 int size(); //返回資源的大小 string name(); //返回資源的名稱 int type(); //返回資源的類型 bool isDirectory(); //返回“Directory”屬性 void destroy(); //銷毀資源 PEResource itemByName(string name); //返回具有給定名稱的資源 bool excludedFromPacking(); //返回“排除包裝”屬性 };
處理PE架構(gòu)修復(fù)(重定位)列表的類:
class PEFixups { public: PEFixup item(int index); //返回具有給定索引的元素 int count(); //返回列表中的元素數(shù)量 PEFixup itemByAddress(uint64 address); //返回給定地址的元素 };
使用PE架構(gòu)修復(fù)(重新定位)的類:
class PEFixup { public: uint64 address(); //返回元素的地址 };
- 持續(xù)更新中 -
VMProtect正版授權(quán)專享在線訂購特享超低價格!還不趕緊加入你的訂購清單?>>更多詳情可點擊咨詢購買
掃描關(guān)注“慧聚IT”微信公眾號,及時獲取最新動態(tài)及最新資訊