代码保护软件VMProtect用户手册之内置脚本的使用(2)——PE文件

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

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

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

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

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

  • 内置功能
  • 事件

第一部分:类

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

▲文件夹

使用自定义文件夹的类:

class Folders {
public:
	int count(); //返回列表中文件夹的数量
	Folder item(int index); //返回具有给定索引的文件夹
	Folder add(string name);//添加一个新文件夹
	void clear(); //清除列表
};

:使用自定义文件夹的类:

class Folder {
public:
	int count(); //返回子文件夹的数量
	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(); //返回列表中的体系结构数量
	PEArchitecture item(int index); //返回具有给定索引的体系结构
	uint64 seek(uint64 offset); //设置文件位置
	uint64 tell(); //返回文件位置
	int write(string buffer); //记录文件的缓冲区
};

一个使用PE架构的类:

class PEArchitecture {
public:
	string name(); //返回体系结构的名称
	PEFile file(); //返回父文件
	uint64 entryPoint(); //返回起始地址
	uint64 imageBase(); // returns the base offset
	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); //将缓冲区写入文件
};

一个与PE架构段一起工作的类:

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

一个处理PE架构部分列表的类:

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

与PE架构部分一起工作的类:

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

与PE体系结构目录一起使用的类:

class PEDirectories {
public:
PEDirectory item(int index); //返回具有给定索引的目录
int count(); //返回列表中的目录数
PEDirectory itemByType(int 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); //返回具有给定索引的库
	int count(); //返回列表中库的数量
	PEImport itemByName(string name); //返回具有给定名称的库
};

用于PE架构的导入库的类:

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

使用PE架构导入函数的类:

class PEImportFunction {
public:
uint64 address(); //返回存储导入函数地址的内存地址
string name();  //返回导入函数的名称
};

用于PE体系结构的导出函数列表的类:

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

一个带有PE架构导出功能的wotk类:

class PEExports {
public:
	class PEExport {
public:
uint64 address(); //返回导出函数的地址
string name(); //返回导出函数的名称
int ordinal();  //返回导出函数的序号
string forwardedName(); //返回导出函数转发给的函数的名称
void destroy(); //销毁导出的函数
};

一个处理PE架构资源列表的类:

class PEResources {
public:
PEResource item(int index); //返回具有给定索引的资源
int count(); //返回列表中的资源数量
void clear(); //清除列表
PEResource itemByType(int type); //返回给定类型的资源
PEResource itemByName(string name); //返回具有给定名称的资源
};

一个使用PE架构资源的类:

class PEResource {
public:
PEResource item(int index); //返回具有给定索引的资源
int count(); //返回列表中的资源数量
void clear(); //清除列表
uint64 address(); //返回资源的地址
int size(); //返回资源的大小
string name(); //返回资源的名称
int type(); //返回资源的类型
bool isDirectory(); //返回“Directory”属性
void destroy(); //销毁资源
PEResource itemByName(string name); //返回具有给定名称的资源
bool excludedFromPacking(); //返回“排除包装”属性
};

处理PE架构修复(重定位)列表的类:

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

使用PE架构修复(重新定位)的类:

class PEFixup {
public:
uint64 address(); //返回元素的地址
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值