PE文件格式详解(2)

PE文件格式详解 本文描述了Windows系统的PE文件格式。 阅读详情

作者:MSDN
译者:李马 (http://home.nuc.edu.cn/~titilima

)

Windows NT附加域

   添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述。
   ·ImageBase。进程映像地址空间中的首选基地址。Windows NT的Microsoft Win32 SDK链接器将这个值默认设为0x00400000,但是你可以使用-BASE:linker开关改变这个值。
   ·SectionAlignment。从ImageBase开始,每个段都被相继的装入进程的地址空间中。SectionAlignment则规定了装载时段能够占据的最小空间数量——就是说,段是关于SectionAlignment对齐的。
   Windows NT虚拟内存管理器规定,段对齐不能少于页尺寸(当前的x86平台是4096字节),并且必须是成倍的页尺寸。4096字节是x86链接器的默认值,但是它可以通过-ALIGN: linker开关来设置。
   ·FileAlignment。映像文件首先装载的最小的信息块间隔。例如,链接器将一个段实体(段的原始数据)加零扩展为文件中最接近的FileAlignment边界。早先提及的2.39版链接器将映像文件以0x200字节的边界对齐,这个值可以被强制改为512到65535这么多。
   ·MajorOperatingSystemVersion。表示Windows NT操作系统的主版本号;通常对Windows NT 1.0而言,这个值被设为1。
   ·MinorOperatingSystemVersion。表示Windows NT操作系统的次版本号;通常对Windows NT 1.0而言,这个值被设为0。
   ·MajorImageVersion。用来表示应用程序的主版本号;对于Microsoft Excel 4.0而言,这个值是4。
   ·MinorImageVersion。用来表示应用程序的次版本号;对于Microsoft Excel 4.0而言,这个值是0。
   ·MajorSubsystemVersion。表示Windows NT Win32子系统的主版本号;通常对于Windows NT 3.10而言,这个值被设为3。
   ·MinorSubsystemVersion。表示Windows NT Win32子系统的次版本号;通常对于Windows NT 3.10而言,这个值被设为10。
   ·Reserved1。未知目的,通常不被系统使用,并被链接器设为0。
   ·SizeOfImage。表示载入的可执行映像的地址空间中要保留的地址空间大小,这个数字很大程度上受SectionAlignment的影响。例如,考虑一个拥有固定页尺寸4096字节的系统,如果你有一个11个段的可执行文件,它的每个段都少于4096字节,并且关于65536字节边界对齐,那么SizeOfImage域将会被设为11 * 65536 = 720896(176页)。而如果一个相同的文件关于4096字节对齐的话,那么SizeOfImage域的结果将是11 * 4096 = 45056(11页)。这只是个简单的例子,它说明每个段需要少于一个页面的内存。在现实中,链接器通过个别地计算每个段的方法来决定SizeOfImage确切的值。它首先决定每个段需要多少字节,并且最后将页面总数向上取整至最接近的SectionAlignment边界,然后总数就是每个段个别需求之和了。
   ·SizeOfHeaders。这个域表示文件中有多少空间用来保存所有的文件头部,包括MS-DOS头部、PE文件头部、PE可选头部以及PE段头部。文件中所有的段实体就开始于这个位置。
   ·CheckSum。校验和是用来在装载时验证可执行文件的,它是由链接器设置并检验的。由于创建这些校验和的算法是私有信息,所以在此不进行讨论。
   ·Subsystem。用于标识该可执行文件目标子系统的域。每个可能的子系统取值列于WINNT.H的IMAGE_OPTIONAL_HEADER结构之后。
   ·DllCharacteristics。用来表示一个DLL映像是否为进程和线程的初始化及终止包含入口点的标记。
   ·SizeOfStackReserve、SizeOfStackCommit、SizeOfHeapReserve、SizeOfHeapCommit。这些域控制要保留的地址空间数量,并且负责栈和默认堆的申请。在默认情况下,栈和堆都拥有1个页面的申请值以及16个页面的保留值。这些值可以使用链接器开关-STACKSIZE:与-HEAPSIZE:来设置。
   ·LoaderFlags。告知装载器是否在装载时中止和调试,或者默认地正常运行。
   ·NumberOfRvaAndSizes。这个域标识了接下来的DataDirectory数组。请注意它被用来标识这个数组,而不是数组中的各个入口数字,这一点非常重要。
   ·DataDirectory。数据目录表示文件中其它可执行信息重要组成部分的位置。它事实上就是一个IMAGE_DATA_DIRECTORY结构的数组,位于可选头部结构的末尾。当前的PE文件格式定义了16种可能的数据目录,这之中的11种现在在使用中。

数据目录

WINNT.H之中所定义的数据目录为:
//WINNT.H // 目录入口// 导出目录#define IMAGE_DIRECTORY_ENTRY_EXPORT 0// 导入目录#define IMAGE_DIRECTORY_ENTRY_IMPORT 1// 资源目录#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2// 异常目录#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3// 安全目录#define IMAGE_DIRECTORY_ENTRY_SECURITY 4// 重定位基本表#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5// 调试目录#define IMAGE_DIRECTORY_ENTRY_DEBUG 6// 描述字串#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7// 机器值(MIPS GP)#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8// TLS目录#define IMAGE_DIRECTORY_ENTRY_TLS 9// 载入配置目录#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10  
基本上,每个数据目录都是一个被定义为IMAGE_DATA_DIRECTORY的结构。虽然数据目录入口本身是相同的,但是每个特定的目录种类却是完全唯一的。每个数据目录的定义在本文的以后部分被描述为“预定义段”。
//WINNT.Htypedef struct _IMAGE_DATA_DIRECTORY {  ULONG VirtualAddress;  ULONG Size;} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
每个数据目录入口指定了该目录的尺寸和相对虚拟地址。如果你要定义一个特定的目录的话,就需要从可选头部中的数据目录数组中决定相对的地址,然后使用虚拟地址来决定该目录位于哪个段中。一旦你决定了哪个段包含了该目录,该段的段头部就会被用于查找数据目录的精确文件偏移量位置。
   所以要获得一个数据目录的话,那么首先你需要了解段的概念。我在下面会对其进行描述,这个讨论之后还有一个有关如何定位数据目录的示例。

PE文件段

   PE文件规范由目前为止定义的那些头部以及一个名为“段”的一般对象组成。段包含了文件的内容,包括代码、数据、资源以及其它可执行信息,每个段都有一个头部和一个实体(原始数据)。我将在下面描述段头部的有关信息,但是段实体则缺少一个严格的文件结构。因此,它们几乎可以被链接器按任何的方法组织,只要它的头部填充了足够能够解释数据的信息。

段头部

   PE文件格式中,所有的段头部位于可选头部之后。每个段头部为40个字节长,并且没有任何的填充信息。段头部被定义为以下的结构:
//WINNT.H#define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER {UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];  union {    ULONG PhysicalAddress;    ULONG VirtualSize;  } Misc;  ULONG VirtualAddress;  ULONG SizeOfRawData;  ULONG PointerToRawData;  ULONG PointerToRelocations;  ULONG PointerToLinenumbers;  USHORT NumberOfRelocations;  USHORT NumberOfLinenumbers;  ULONG Characteristics;} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;  
你如何才能获得一个特定段的段头部信息?既然段头部是被连续的组织起来的,而且没有一个特定的顺序,那么段头部必须由名称来定位。以下的函数示范了如何从一个给定了段名称的PE映像文件中获得一个段头部:
//PEFILE.CBOOL WINAPI GetSectionHdrByName(LPVOID lpFile, IMAGE_SECTION_HEADER *sh, char *szSection){  PIMAGE_SECTION_HEADER psh;  int nSections = NumOfSections (lpFile);  int i;  if ((psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile))      != NULL)  {    /* 由名称查找段 */    for (i = 0; i < nSections; i++)    {      if (!strcmp(psh->Name, szSection))      {        /* 向头部复制数据 */        CopyMemory((LPVOID)sh, (LPVOID)psh,            sizeof(IMAGE_SECTION_HEADER));        return TRUE;      }      else        psh++;    }  }  return FALSE;}
这个函数通过SECHDROFFSET宏将第一个段头部定位,然后它开始在所有段中循环,并将要寻找的段名称和每个段的名称相比较,直到找到了正确的那一个为止。当找到了段的时候,函数将内存映像文件的数据复制到传入函数的结构中,然后IMAGE_SECTION_HEADER结构的各域就能够被直接存取了。

段头部的域

   ·Name。每个段都有一个8字符长的名称域,并且第一个字符必须是一个句点。
   ·PhysicalAddress或VirtualSize。第二个域是一个union域,现在已不使用了。
   ·VirtualAddress。这个域标识了进程地址空间中要装载这个段的虚拟地址。实际的地址由将这个域的值加上可选头部结构中的ImageBase虚拟地址得到。切记,如果这个映像文件是一个DLL,那么这个DLL就不一定会装载到ImageBase要求的位置。所以一旦这个文件被装载进入了一个进程,实际的ImageBase值应该通过使用GetModuleHandle来检验。
   ·SizeOfRawData。这个域表示了相对FileAlignment的段实体尺寸。文件中实际的段实体尺寸将少于或等于FileAlignment的整倍数。一旦映像被装载进入了一个进程的地址空间,段实体的尺寸将会变得少于或等于FileAlignment的整倍数。
   ·PointerToRawData。这是一个文件中段实体位置的偏移量。
   ·PointerToRelocations、PointerToLinenumbers、NumberOfRelocations、NumberOfLinenumbers。这些域在PE格式中不使用。
   ·Characteristics。定义了段的特征。这些值可以在WINNT.H及本光盘(译注:MSDN的光盘)的PE格式规范中找到。

值         定义
0x00000020 代码段
0x00000040 已初始化数据段
0x00000080 未初始化数据段
0x04000000 该段数据不能被缓存
0x08000000 该段不能被分页
0x10000000 共享段
0x20000000 可执行段
0x40000000 可读段
0x80000000 可写段

定位数据目录

   数据目录存在于它们相应的数据段中。典型地来说,数据目录是段实体中的第一个结构,但不是必需的。由于这个缘故,如果你需要定位一个指定的数据目录的话,就需要从段头部和可选头部中获得信息。
   为了让这个过程简单一点,我编写了以下的函数来定位任何一个在WINNT.H之中定义的数据目录。
// PEFILE.CLPVOID WINAPI ImageDirectoryOffset(LPVOID lpFile,    DWORD dwIMAGE_DIRECTORY){  PIMAGE_OPTIONAL_HEADER poh;  PIMAGE_SECTION_HEADER psh;  int nSections = NumOfSections(lpFile);  int i = 0;  LPVOID VAImageDir;  /* 必须为0到(NumberOfRvaAndSizes-1)之间 */  if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)    return NULL;  /* 获得可选头部和段头部的偏移量 */  poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);  psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile);  /* 定位映像目录的相对虚拟地址 */  VAImageDir = (LPVOID)poh->DataDirectory      [dwIMAGE_DIRECTORY].VirtualAddress;  /* 定位包含映像目录的段 */  while (i++ < nSections)  {    if (psh->VirtualAddress <= (DWORD)VAImageDir &&        psh->VirtualAddress +         psh->SizeOfRawData > (DWORD)VAImageDir)      break;    psh++;  }  if (i > nSections)    return NULL;  /* 返回映像导入目录的偏移量 */  return (LPVOID)(((int)lpFile +     (int)VAImageDir. psh->VirtualAddress) +    (int)psh->PointerToRawData);}  
该函数首先确认被请求的数据目录入口数字,然后它分别获取指向可选头部和第一个段头部的两个指针。它从可选头部决定数据目录的虚拟地址,然后它使用这个值来决定数据目录定位在哪个段实体之中。如果适当的段实体已经被标识了,那么数据目录特定的位置就可以通过将它的相对虚拟地址转换为文件中地址的方法来找到。
初步了解PE文件格式(上) 今天这篇博客只对PE文件进行大致的分析,使用一个例子并结合一个简单的PE文件格式图来说明PE文件格式。 阅读详情

相关推荐

[系统安全] PE文件格式详解2

IMAGE_EXPORT_DIRECTORY IMAGE_IMPORT_DESCRIPTOR IMAGE_RESOURCE_DIRECTORY

H4ppyD0g的博客 1148

从一个简单的实例来了解PE文件

逆向工程(二):从一个简单的实例来了解PE文件由于原来的链接失效,RegisterMe这个软件很难找到免费的,找了半天才找了一个reverseme,感觉还不太对,但是用来研究ollydbg应该是一样的。  1.准备好ollydbg。 开始打开reverseme会出现下面这样的弹窗 2.然后用ollydbg打开reverseme。 通过另一个教程,我知道了要去除掉这个弹窗,需要把0040107B的j...

swust_zhangchun的博客 726

易语言编译PE文件格式详解与实践

PE(Portable Executable)文件格式是Windows操作系统中用于可执行文件、目标代码、DLL(动态链接库)等的标准格式。它是一种高级的执行文件格式,为Windows提供了丰富的结构化信息,这些信息对于系统的加载和执行过程至关重要。本章旨在提供PE文件格式的基本概念、结构及重要组成,帮助读者建立对PE文件格式的初步认识。PE文件格式从结构上来看,可以划分为几个主要部分:DOS头、PE签名、COFF文件头、可选头、节表以及节数据。

weixin_42610010的博客 1089

PE文件格式学习

目录 IMAGE_DOS_HEADER_STRUCT e_lfanew IMAGE_NT_HEADER Signature IMAGE_FILE_HEADER Machine NumberOfSections TimeDateStamp PointerToSymbolTable &NumberOfSymbols SizeOfOptionalHeader Characteristics IMAGE_OPTIONAL_HEADER Magic MajorLinkerV...

qin_code的博客 5223

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 505

爬虫小例--爬药监局(上)

”明月如霜,好风如水,清景无限 “ 文远最近也算是爬虫入门吧,相信后面会慢慢熟悉。 壹 直接上例子,爬取药监局的数据。目的是得到每家公司的详情数据,例: 具体网址:http://scxk.nmpa.gov.cn:81/xk/ 这是主页,下面详情信息: 贰 分析,通过网页检查发现,主网页上没有公司相关数据,观察XHR中的Ajax请求发现,公司信息都是动态数据(方便更新),点击发现每个公司 的详情信息通过ID号这个参数区别,那么可以确定思路是先得到每个公司的ID号,然后在通过ID对应每一个详细网站,同样右键

john_ashley的博客 4556

PE文件结构详解(三)PE导出表

上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,这次来看看第一项:导出表。

evil.eagle的专栏 2万+

数理金融学笔记 Chap2 二叉树模型Binomial

2 二叉树模型与期权定价 Binomial Model and Option Pricing 文章目录2 二叉树模型与期权定价 Binomial Model and Option Pricing单期二叉树模型 One-step Binomial Model风险与无风险资产单期二叉树模型与无套利条件无套利定价 No Arbitrage Pricing风险中性定价 Risk Neutral PricingDelta套期保值 Delta Hedging两期二叉树模型 Two-Step Binomial Model

weixin_66831131的博客 2389

PE文件详细解析

IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic//MZ(4D5A)** +2h WORD e_cblp +4h WORD e_cp +6h WORD e_crlc +8h WORD e_cparhdr +0ah WORD e_mi...

henuyl的博客 494

告别混乱!用Cadence Capture CIS高效管理你的原理图库:以单逻辑器件K9F2G08U0M为例

本文以单逻辑器件K9F2G08U0M为例,详细介绍了如何使用Cadence Capture CIS高效管理原理图库。通过三级分类体系、工程化命名规范和智能检索技术,帮助工程师实现从混乱到有序的转变,提升团队协作效率和设计准确性。

aizhi0169的博客 403

Appstore开发者必读:3.2(f)违规预警与高效申诉指南

本文为AppStore开发者提供了应对3.2(f)违规通知的完整指南。文章深度解析了3.2(f)条款下的隐瞒性、关联性与真实性违规类型,并提供了黄金48小时内的自查、申诉信撰写与提交全流程策略。同时,文章强调遵循App Review Guidelines,建立内部合规清单与保持账号独立,是预防违规、维护开发者账号安全的关键。

weixin_29214559的博客 273

PE文件格式详解(2)

MS-DOS头部/实模式头部  如上所述,PE文件格式的第一个组成部分是MS-DOS头部。在PE文件格式中,它并非一个新概念,因为它与MS-DOS 2.0以来就已有的MS-DOS头部是完全一样的。保留这个相同结构的最主要原因是,当你尝试在Windows 3.1以下或MS-DOS 2.0以上的系统下装载一个文件的时候,操作系统能够读取这个文件并明白它是和当前系统不相兼容的。换句话说,当你在MS-

马说@优快云 2914

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

PE文件格式详解(五-2)――Improt Table(引入表)

现在我们知道如何找到引入表了。Data Directory数组第二项的VirtualAddress包含引入表地址。引入表实际上是一个 IMAGE_IMPORT_DESCRIPTOR 结构数组。每个结构包含PE文件引入函数的一个相关DLL的信息。比如,如果该PE文件从10个不同的DLL中引入函数,那么这个数组就有10个成员。该数组以一个全0的成员结尾。下面详细研究结构组成: IMAGE_IMPOR

lwglucky的专栏 1845

Colmap中 patchmatch源码

惊世骇俗的Colmap PatchMatch源码 500多行,简明易懂 先了解PatchMatch的options: max_image_size: 任一维度的最大图像尺寸 gpu_index: gpu的下标 depth_min,depth_max: 随机采样的深度范围 window_radius:用于计算NCC(两图片的归一化互相关),NCC的计算需要用到 win_size. 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解 - 知乎 (zhihu.com) window_step: 用.

qq_24884193的博客 2211

FM20S用户手册--Linux系统启动卡制作及系统固化

评估板出厂时,默认提供一张配套的Micro SD卡,此卡为可正常使用的Linux系统 启动卡。评估板断电,将Linux系统启动卡插入评估板Micro SD卡槽,根据评估底板丝印将 启动方式选择拨码开关拨为1010(1-4).此档位为Micro SD启动模式。使用Linux 系统启动卡启动系统时,将使用此目录的BOOTbn文件启动FSBL和U-Boot。Linux系统启动卡制作时,已将固化系统的脚本文件mkemmcboot.sh拷贝至Linux系 统启动卡文件系统的"/opt/tools/"目录下。

创龙,嵌入式一体化解决方案商 302

最详细PE文件格式讲解!!!!!

每个PE文件都是以一个DOS程序开始的,有了它,一旦程序在DOS下执行,DOS就能执行识别出这是一个有效的执行体,然后运行紧随MZ header的DOS stub(DOS块)。e_lfanew 字段是真正的PE文件头的相对偏移(RVA),指向真正的PE头的文件偏移位置,占用4字节,位于文件开始偏移3ch字节处。当PE文件通过加载器载入内存后,内存中的版本称为模块(Module),映射文件的起始地址称为模块句柄(hModule),可以通过模块句柄访问内存中的其他数据结构。基地址的值是由PE文件本身设定的。

SXXYNHHXX的博客 4123

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PE文件格式全解读

PE文件包括DOS部分、PE文件头和节表和节数据。从DOS头(DOS header)到节区头(Sectionheader)是PE头部分,其下的节区合称PE体。节数据包括代码(.text)、数据(.data)、资源(.rsrc)节,分别保存。1.DOS部分:IMAGE_DOS_HEADER结构体的大小为40字节,需要注意的2个重要成员:0x0-0x01e_magic: DOS签名,表文件开始标识0x4d5a=”MZ”0x3c-0x3fe_lfanew:PE头部分的偏移0x000000b0.DOS存根位于DOS

凌阳的博客 5574

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

PE文件格式

PE文件是windows操作系统下使用的可执行文件格式。它是微软在UNIX平台的COFF(CommonObjectFileFormat,通用对象文件格式)基础上制作而成。最初设计用来提高程序在不同操作系统下的移植性,但实际上这种文件格式仅用在windows系列的操作系统下。PE文件是指32位的可执行文件,也称为PE32。64位的可执行文件称为PE+或者PE32,是PE文件的一种扩展形式(注意不是PE64)

weixin_43905689的博客 1430

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PE文件格式详解(上)

Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。     然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。本文旨在解决这一问题,它会对整个

feidegengao的专栏 6512

PE文件格式粗浅认识

前言:最近开始学习PE文件格式,写点笔记做点记录,希望能够对和我一样正在学习PE文件的小伙伴有些启发,生出很棒的点子 ,当然,下面这些只是我这个初学者的一些简单的认识,针对和我一样的初学者,dalao可以绕道,另外,如果大家可以指出我的错误,我当感激不尽! 1.PE文件格式图总览 2.PE文件格式介绍 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有EX...

qq_45444695的博客 1131
上一篇: PE文件格式详解(1)
下一篇: PE文件格式详解(3)
Matrix_Designer
博客等级 码龄16年 58粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值