【论文笔记】AdversarialExamplesonDiscreteSequencesforBeating Whole-BinaryMalwareDetection用于击败全二进制恶意软件检测

希尔·阿维夫·鲁文·巴·伊兰大学 约瑟夫·凯舍特 以色列理工学院

文章 ·2018年2月

文章下载地址: https://www.researchgate.net/profile/Joseph-Keshet/publication/323165087_Adversarial_Examples_on_Discrete_Sequences_for_Beating_Whole-Binary_Malware_Detection/links/5a95b540aca2721405694194/Adversarial-Examples-on-Discrete-Sequences-for-Beating-Whole-Binary-Malware-Detection.pdf

摘要

近年来,深度学习在图像检测、图像分割、姿态估计、语音识别等诸多应用中都取得了性能突破。它还成功地应用于恶意软件检测。然而,这带来了一个主要问题:深度网络被发现容易受到对抗性示例的影响。到目前为止,成功的攻击已被证明是非常有效的,特别是在图像和语音领域,其中对输入信号的微小扰动不会改变人类对它的感知方式,但会极大地影响受攻击模型的分类。

我们的目标是修改恶意二进制文件,使其在保留其原始功能的同时被检测为良性。与图像或语音相反,对二进制字节的微小修改会导致功能发生重大变化。

我们介绍了一种生成对抗性示例的新方法,用于攻击全二进制恶意软件检测器。我们在二进制文件中附加了一小段,其中包含选定的字节序列,该序列以高置信度将网络的预测从恶意引导为良性。我们将这种方法应用于基于 CNN 的恶意软件检测模型,并在攻击中显示出极高的成功率。

介绍

人工智能和深度学习最近已成为计算机科学和工程领域最新兴的领域之一。深度学习已经成功地应用于现代社会的许多领域[27],特别是在图像分类[25,17],语音识别[3]和机器翻译[4]等突出问题上取得了一些突破。自然地,它正在成为静态恶意软件分析和检测中感兴趣的技术[42,7,37,40]。 近年来,已经表明深度网络容易受到对抗性示例的攻击。对抗性示例是通过修改合法输入生成的合成输入。在图像处理和语音识别领域,当人类无法将修改后的输入与合法示例区分开来时,它们被认为是对抗性的,但它们欺骗了最先进的分类系统[15,32,26]。

对抗性示例的攻击突出了机器学习的脆弱性,尤其是深度学习的脆弱性[33]。它引发了一系列活跃的研究,涉及理解这种现象[13,12],并使神经网络更加健壮[35,8]。

在恶意软件检测领域,对抗性示例是恶意二进制文件,该文件在保留其恶意功能的同时逃避检测。更具体地说,对抗性示例是通过修改现有恶意二进制文件生成的二进制文件。虽然原始文件被正确分类为恶意文件,但其修改后的版本被错误分类为良性,因此逃避检测。

最近,一系列工作[21,16,19]表明,对抗性示例会导致恶意软件分类系统的灾难性故障。这些工作假设了一个恶意软件检测分类器,该分类器设计有一组手工制作和专注于的功能,例如,PE标头数据。

我们的工作重点是一种称为卷积神经网络(CNN)的通用和通用深度学习架构。我们对攻击现代端到端恶意软件检测器感兴趣[37]。这种检测器不是基于输入的手工特征,而是基于整个原始二进制文件。端到端深度学习是最近用于许多任务的最先进系统中最重要的概念之一。

这项工作的目标是攻击端到端恶意软件检测器,该检测器获取整个二进制文件的输入。攻击端到端CNN模型已经在图像检测[6],图像分割,姿势估计和语音识别[9]方面成功完成。在所有这些领域中,输入(即图像像素或语音样本)的微小变化基本上不会改变人类对输入的感知理解。对于书面语言中的单词或二进制文件中的字节,情况完全不同,因为更改这些类型的输入中的一个单词或字节会完全改变含义或功能。我们不知道对应用于后一种类型输入的深度学习模型的有效攻击。

  • 贡献

    • 我们展示了对全二进制恶意软件检测器进行对抗性示例攻击的成功设计。

    • 我们提出了一种对离散输入序列的新攻击,即使对输入进行微小的更改,其“含义”也可能完全改变(这与对图像或语音等实值输入向量的攻击相反)。

    • 我们提出了一种新的替代损失函数来有效地实现这一目标。

背景

恶意软件是一种恶意软件,在执行时可能会导致意外的错误行为,从而导致信息泄露、主机受损或其他严重的负面安全结果。

恶意软件检测是坏人和防御者之间的猫捉老鼠游戏。随着恶意软件检测系统引入新方法,不良行为者不断引入检测和逃避防御者的方法。

  • 基于签名的检测是检测恶意软件的最基本技术。

基于签名的恶意软件检测系统搜索通常称为入侵指标 (IOC) 的文件和系统范围的指示器。

攻击者非常了解基于签名的静态分析。他们通过在代码中使用变形和多态技术,使用打包器和加密以及改变他们的通信技术来逃避它。因此,基于签名的检测通常被认为是一张大网,可以捕获我们所知道的鱼,但不是对抗看不见的恶意软件的有效手段。

  • 恶意软件检测可以基于静态分析或动态分析。动态分析的另一个缺点是它对恶意软件检测器提出了很高的计算要求。

    静态分析尝试在不执行代码的情况下检测恶意软件。在动态分析中,可疑代码在沙盒中执行,并监控其动态行为(例如 API 调用序列)。

在二进制分析领域,[42]和[7]中描述的研究在二进制文件上应用了递归神经网络(RNN),以解决函数识别问题并从反汇编的二进制代码中恢复函数类型签名。

另一个应用类似方法的领域是恶意软件检测,通过分析字节文件的 n 元语法 [38] 和挖掘 API 调用 [39, 21]。这些方法不适用于整个二进制文件,并且似乎更容易受到基于恶意软件作者轻微修改的攻击。

有人尝试使用深度学习作为恶意软件检测的静态分析机制。最初的构造仅对文件的一部分应用了基于深度学习的分析。

例如,通过分析 Android 清单 [16],使用字节中的随机投影来减少特征 [49],或通过提取特定特征,如字节熵直方图、PE 导入特征和 PE 元数据特征 [40]。

但是,这些技术不会分析整个可执行文件,并且可能会错过代码本身中存在的相关信息,因为恶意软件作者可能会忽略格式约定,并可能将恶意代码隐藏在其他并可能将恶意代码隐藏在文件的其他区域中。

Raff 等人 [37] 最近的一项研究展示了一种名为 MalConv 的恶意软件检测系统,该系统基于端到端 CNN 模型。该系统无领域知识。它通过查看文件本身的原始字节来对整个可执行文件进行操作,并构建神经网络模型来确定文件的恶意性。这项工作中的实验处理了1-2MB的原始字节序列。与以前的恶意软件检测方法相比,此模型学习的信息类型范围更广。这个网络是我们探索的目标。

- 对抗性示例Adversarial examples

尽管深度神经网络已被证明在分类领域优于其他模型,但现在很明显,即使输入受到非常小的干扰并且人类仍然正确分类,此类网络也很容易被错误分类样本。在图像处理领域,这意味着扰动图像和原始图像对任何人类观察者来说看起来都是一样的。在语音识别领域,这是由人类无法区分音频变化来定义的[9]。修改后的输入数据被命名为对抗性示例,因为它的主要目的是挑战原始分类。

据我们所知,在分析整个二进制文件方面,没有对对抗性示例进行研究。该领域缺乏工作的原因可能是,与其他已知字段相比,在可执行文件上制作对抗性示例的挑战不同且更困难。例如,用于图像检测的对抗性示例通过计算最大损失并相应地更新学习模型的梯度来确定要更改的像素。这是可能的,因为对图像像素添加非常小的扰动不会影响人类对图像的感知方式。二进制文件的情况本质上是不同的,因为文件由离散字节组成,对字节的微小修改可能会导致功能发生较大更改。

二进制文件的对抗示例在定义和最小化距离方面也有所不同

新的约束:

原始项目中的对抗性示例。在图像中,距离必须很小且人类无法检测到。对于可执行文件,与原始文件的差异不必很小或人类无法检测到,但是有一个新的约束,即执行文件的功能将保持与以前完全相同。

相关工作

其他领域:

对抗示例
[13,6]虽然深度网络可以在未知输入上实现高性能,但它们容易受到导致错误分类的小扰动的影响
[20]如何制作这种对抗性示例
[45]跨模型泛化,其中相同的对抗性示例可能被具有不同超参数从头开始训练的网络错误分类,以及交叉训练集泛化,其中相同的对抗性示例可能被在不同训练集上从头开始训练的网络错误分类。
Cisse等人[9]一种名为Houdini的新颖灵活方法,用于生成专门针对所考虑任务的最终性能度量量身定制的对抗性示例。他们的作者攻击了语音识别,人体姿势估计和语义分割系统,成功率很高。
Kreuk等人[24]攻击基于端到端神经网络的说话人验证模型的对抗性示例的生成
Carlini等人[5]对语音命令系统的对抗性攻击

二进制领域:

二进制领域
Grosse 等人[16]从 Android APK 清单文件中提取的特征向量上 训练了一个前馈神经网络他们应用了一种算法来制作对抗性示例,就像在[34]中的图像上所做的那样,并在清单的末尾附加了其他功能。该方法在恶意二进制文件上的误分类率达到 85%。
Hu等人[19]提出了一种基于生成对抗网络(GAN)的方法,该方法采用原始样本并输出对抗性示例。 这项工作使用了表示 API 调用的二进制功能。然后,在生成对抗性示例时,通过切换二进制特征来模拟虚假的 API 调用。
Xu等人[48]提出了遗传编程技术来逃避恶意PDF检测系统,以便自动生成规避变异。由于PDF文件的主体具有树状结构,因此很容易利用遗传编程来改变和移动子树以生成新的变体。从一小部分测试样本中,他们能够通过迭代生成保留恶意行为但被归类为良性的变体来实现 100% 的规避率。

问题设置

在本节中,我们严格制定了恶意软件检测的任务,并为本文的其余部分设置了符号。

二进制输入文件(无论是恶意的还是良性的)都由一系列字节组成。我们将所有字节的集合表示为 X ⊆ [0, N − 1],其中 N = 256。二进制文件是 L 字节 x = (x1, x2, ...xL),其中 xi ∈ X 表示所有 1 ≤ i ≤ L.请注意,长度 L 因一个二进制文件而异,因此 L 不是固定的。我们用 X 表示所有有限长度序列的集合,因此 x ∈ X。

恶意软件检测系统的目标是对输入二进制文件是恶意文件还是良性文件进行分类。因此,该系统是一个函数,它获取二进制文件 x ∈ X 作为输入,并输出二进制文件 x 是恶意的概率。形式上,我们用 fθ 表示 : X → [0, 1] 作为具有一组参数 θ 的神经网络实现的恶意软件检测功能。

给定一组训练示例,通过最小化二进制负对数似然损失函数来找到参数 θ。训练集中的每个示例都是二进制文件 x ∈ X 的元组 (x, y) 和一个标签 y ∈ {0, 1},指示二进制文件 x 是良性还是恶意的。如果 fθ (x) 的输出大于 0.5,则预测被视为 1 或恶意,否则预测被视为 0 或良性。

这项工作的目标是修改二进制文件,同时保留其功能,以便它被神经网络错误分类。更具体地说,给定一个被正确归类为恶意软件的恶意文件,我们希望在保持其原始功能的同时对其进行轻微修改,以便将其归类为良性文件。正式地,用 ̃ x 表示恶意文件 x 的修改版本。请注意,如果 x 被归类为恶意软件,fθ (x) > 0.5,那么我们希望设计 ̃ x,使 fθ ( ̃ x) < 0.5,并且预测是良性的。

学习体

在本节中,我们将描述神经网络(NN)的训练过程。

回想一下,神经网络是由 θ 参数化的函数 fθ : X → [0, 1],其中 X 是所有有限长度二进制文件的域

我们假设二进制文件 x 及其相应的标签 y ∈ {0, 1} 是从固定但未知的分布 ρ 中提取的。我们用 ˆ yθ ∈ {0, 1} 表示神经网络预测的标签:

通常,每个任务都定义了自己的性能度量[1,2]。

在恶意软件检测任务中,系统的性能由 0-1 损失函数评估,如果真实标签 y 不等于预测的标签 ˆ y,则定义为 1,否则定义为 0。

是谓词π上的指示符函数。训练的目标是找到最小化所需损失函数期望的参数 θ [22]

不幸的是,在上述形式化中有两个警告:

  • (i)概率密度函数ρ是未知的;

  • (ii) 指标函数不能直接最小化,因为它是一个组合量。

机器学习中的常见做法是用从分布 ρ 中提取的一组训练示例的平均值替换期望值,并将所需的损失函数(即 0-1 损失)替换为表示为 ̄'(x, y; θ )的代理损失函数,例如 (x, y) 和参数 θ。大多数情况下,训练二进制 NN 中使用的代理损失函数是负对数似然,定义为

总的来说,参数 θ 是通过求解以下优化问题找到的: 其中 S = {(xi, yi)} 是 m 个示例的训练集。

上述优化问题使用随机梯度下降或类似的基于梯度的算法来解决[11,46,23]。这些算法提供了一种迭代方法来最小化目标函数,在我们的例子中,损失函数 ̄ '。这是通过迭代更新参数集 θ 来实现的。

在本文中,我们使用卷积神经网络(CNN)举例说明了我们的想法。CNN在许多任务和应用程序中都显示出最先进的结果[47,17],特别是在恶意软件检测任务中[37]。

卷积网络

卷积神经网络是一类深度神经网络。在卷积层中,滤波器围绕输入向量进行卷积,产生称为特征图的输出。特征图中的每个坐标都可以解释为输入中小区域的表示。

CNN具有一些理想的属性:

  • (i)围绕输入向量卷积滤波器的性质会产生一个移位不变的模型。换句话说,它与特征的空间位置无关,并且专门用于模式识别;

  • (ii) 每个滤波器在整个输入中复制。复制的单元共享相同的参数。这大大减少了学习参数的数量,从而实现更好的泛化、更快的收敛和更低的数据过度拟合风险;

  • (iii)CNN通过使其层与全连接网络相比本地连接来利用空间局部相关性,从而产生与输入高度空间相关的特征图。

特征图在下采样之前通常通过非线性激活函数。缩减采样是通过称为池化的概念实现的。有几种非线性方法可以执行池化,最常见的是最大池化。它将输入划分为不重叠的固定大小区域,每个区域由其最大值表示。池化层逐渐减小其输入的空间大小,从而减少所需的参数和计算量。

为了解决上述警告,独热表示通常与称为嵌入的密集表示相结合。嵌入是 one-hot 向量到实值向量空间的映射,表示为 Z ⊆ R,其中 D 是嵌入大小(在我们的设置中我们使用 D = 8)。在这个向量空间中,每个嵌入向量表示一个字节及其上下文信息,并且彼此接近的嵌入向量对应于共享相似上下文和语义含义的字节。总的来说,每个二进制文件在嵌入式向量空间中表示为向量序列 z = (z1, z2, ...zL),其中 zi ∈ Z 表示所有 1 ≤ i ≤ L。

我们将 hθ 定义为从单热向量域映射到实值向量空间 Z 域的函数。实现此类函数的常用方法是通过查找表 M ∈ R。特别地,函数 fθ 被认为是 hθ 和函数 gθ 的组合,其中 gθ : Z → [0, 1]。也就是说,fθ = gθ ◦ hθ 。将独热向量映射到嵌入空间通常是作为训练过程的一部分学习的[14],或者像[31,36]中那样单独学习。

在描述这项工作中使用的神经网络架构之前,我们描述了二进制文件如何有意义地表示给网络。

表示

回想一下,二进制文件 x 是离散值(字节)的序列。由于序列中的实际值是任意的,因此神经网络无法在不同值之间找到有意义的语义概念。表示离散变量的常用方法是使用独热表示。在我们的例子中,序列中的每个元素,xi,其中 1 ≤ i ≤ L,表示一个离散变量,它属于离散集合 X ⊆ [0, N − 1]。元素 xi 的单热表示,其特定值为 q ∈ X 定义为向量 x ∈ {0, 1},其中其所有值均为 0,但第 q 个索引处的值设置为 1 除外。 对于 1 ≤ J ≤ |X|.这样的表示允许网络将每个元素相乘具有不同的权重,并找到相似元素之间的相关关系。

这种表示的缺点是双重的:

(i)它是高度稀疏的

(ii)所有字节彼此之间的距离相等,无论它们的语义距离如何。

为了解决上述警告,独热表示通常与称为嵌入的密集表示相结合。嵌入是 one-hot 向量到实值向量空间的映射,表示为 Z ⊆ R,其中 D 是嵌入大小(在我们的设置中我们使用 D = 8)。在这个向量空间中,每个嵌入向量表示一个字节及其上下文信息,并且彼此接近的嵌入向量对应于共享相似上下文和语义含义的字节。总的来说,每个二进制文件在嵌入式向量空间中表示为向量序列 z = (z1, z2, ...zL),其中 zi ∈ Z 表示所有 1 ≤ i ≤ L。

我们将 hθ 定义为从单热向量域映射到实值向量空间 Z 域的函数。实现此类函数的常用方法是通过查找表 M ∈ R。特别地,函数 fθ 被认为是 hθ 和函数 gθ 的组合,其中 gθ : Z → [0, 1]。也就是说,fθ = gθ ◦ hθ 。将独热向量映射到嵌入空间通常是作为训练过程的一部分学习的[14],或者像[31,36]中那样单独学习。

模型结构

在本节中,我们将介绍用作恶意软件检测功能的网络架构 [37],如图 1 所示。回想一下,输入文件 x 是离散字节序列。它是嵌入函数 hθ 的输入,将其映射到嵌入向量 z。然后将嵌入 z 馈送到两个卷积层中,其中一个是 S 形激活的。这些层的相应输出按元素相乘[10]。然后将此输出传递到时态最大池化层,这是最大池化的特殊情况,其中正在处理的区域是整个特征映射。池化层将所有可变长度序列减少到固定大小。然后将序列表示馈送到全连接层,将其减小到所需的输出大小。

对抗样本

在本节中,我们将介绍对抗性示例的生成。

我们的目标是修改二进制文件,使其被网络错误分类,同时保留其原始功能。

特别是,如果二进制文件是恶意的,并且被网络检测到,我们希望稍微修改它,使其被归类为良性,但仍会作为恶意软件运行。

二进制文件表示为字节序列是任意的,因此神经网络无法在此空间中有效工作,也无法有效地生成对抗性示例。

生成对抗性示例是通过在原始示例中添加小扰动来完成的,这些扰动朝增加/减少梯度的方向。

这些方法不起作用,因为扰动独热向量会导致向量不再位于单热向量空间中。

  • 为离散输入集生成对抗性示例

    给定在嵌入式域 z ∈ Z 中表示的输入二进制文件,对抗性示例是原始模式的扰动版本

其中δ ∈Z是生成的加性扰动,使得z的功能得以保留,但会导致网络预测不正确的标签。

我们假设网络 gθ,训练并且参数 θ 是固定的。通过求解以下优化问题生成目标对抗示例

被其中 y 是所需的目标标签(在我们的例子中是良性的),ε 代表对手的实力,p 是规范值。换句话说,我们希望在对抗性示例与 p 范数中的原始示例相似的约束下,最小化对抗性示例上的 gθ 预测与目标标签之间的损失函数。

假设损失函数 ̄' 是可微的,[41] 的作者提出采用 x 7→ ̄ '( ̃ z, y; θ ) 的一阶泰勒展开来计算δ,方法是解决以下问题:

回想一下,在训练期间,损失的缩放版本被添加到参数中,如公式(7)所示。同样,在生成对抗性示例时,会将梯度(或其符号)的缩放版本添加到示例中。或者,可以使用较小的范数执行这些步骤的更多迭代。这种更复杂的策略有几种变体[32]。

在制作了 ̃ z 的对抗示例之后,我们需要重建新的二进制文件 ̃ x。最直接的方法是将每个 zi 映射到嵌入矩阵 M 中的最近邻居,这是一个查找表,它将 Z 中的向量分配给 X 中的每个输入。虽然这种方法在大多数情况下都有效,但我们可以进一步增强它以获得更高的成功率。

加强重建

在本小节中,我们提出了一个新的损失函数,该函数强制嵌入空间中的修改,以便它们允许更好地重建二进制文件。我们发现,从 Z 中的扰动嵌入中重建字节通常不是一件容易的事。在某些情况下,受扰动的嵌入与查找表 M 中的嵌入失去了相似之处,查找表 M 表示字节到嵌入之间的映射。因此,从扰动嵌入到字节的重建不再明智。为了更好地重建,我们建议在损失函数中添加一个新项,该项在嵌入矩阵 M 中施加 Z 中的扰动将接近行。

用 d 表示:Z × Z → R+ 一个距离函数,如果 Z 中的两个嵌入接近,则分配一个低正数,否则分配一个高正数。请注意,̄ ' 是负对数似然损失。为了解决失败的重建情况,我们提出了一个新的组合代理损失函数̄'(z,y; θ),定义为:我们用所有元素的总和替换它,以获得 min 函数的上限。新的损失可以写成如下

为了在嵌入域中生成对抗性示例,我们将公式15代入公式(12)中描述的生成过程。成功制作对抗示例 ̃ z 后,我们重建新的二进制文件 ̃ x,如第 6.1 节所述

保留功能

到目前为止,我们已经讨论了如何修改嵌入向量并重建修改后的二进制文件。

但是,直接使用此方法可能不会保留二进制文件的原始功能,因为更改可能会影响整个文件。

相反,我们建议创建一个包含有效负载字节的新部分,并设置一个标志,指示它包含初始化的可读数据。在制作对抗性示例时,我们只扰动这一部分。此部分可以附加到原始二进制文件。或者,可以在数据和资源部分中的条件未使用字节处添加精心制作的部分。上述任一方法都不会引起任何功能更改,因为扰动的数据入到不可执行的代码节中。在本文中,我们侧重于前一种选择,即附加一个新的章节,并将后一种选择推迟到未来的工作中。

我们使用算法 1 中描述的技术生成对抗性示例,并在此处详细介绍。我们将长度为 k、x ∈ X 的均匀随机字节序列附加到原始二进制文件 x 中。然后我们嵌入新的二进制 x = x ⊕ x,得到 z = z ⊕ z。接下来,该算法迭代扰动附加的段 z,并在 gθ 错误分类时停止。通过仅扰动附加的段,我们确保 z 保持不变,并保留 x 的功能。结果是一个文件 x,它的行为与 x 相同,但逃避了 gθ 的检测。

实验结果

在本节中,我们介绍了一系列实验,其中我们证明使用我们提出的方法对全二进制恶意软件检测器的攻击在统计上是成功的。

在我们的所有实验中,实验的设置都是相似的。我们按照第 4 节所述表示二进制文件,并以类似于 [37] 中所述的方式在该表示上训练恶意软件检测器模型。我们通过在嵌入向量空间中添加扰动来生成对抗性示例,然后从对抗性示例重建新的二进制文件。我们现在详细描述实验设置和结果。

实验内容省略……

未来工作

在本文中,我们演示了如何生成对抗性示例来欺骗深度神经网络,将恶意软件二进制文件错误分类为良性。尽管我们发现我们攻击的网络在代码段中添加随机数据和变化方面是稳健的,但我们将一个部分附加到二进制文件并仅修改该部分的方法表明,该网络容易受到对抗性攻击。

通常,为欺骗模型A而精心设计的对抗性示例也会欺骗模型B,即使模型B的体系结构与模型A的体系结构不同(请参阅[9]及其中的引用)。这种现象称为跨模型攻击。当模型 B 在与模型 A 不同的数据集上进行训练时,这称为跨数据集攻击。因此,即使攻击者无权访问模型,对抗性示例也会带来很大的安全风险。我们的攻击方法在很大程度上依赖于模型的学习嵌入,这可能会阻碍对抗性示例向具有不同字节嵌入的模型的可转移性。在今后的工作中,我们努力超越我们努力克服这一限制,以产生更通用的攻击。我们还将尝试演示对其他数据集和真实架构的跨数据集攻击。

深度学习近年来取得了重大突破。重新审视深度学习的评估过程似乎至关重要,尤其是在一般安全敏感领域的情况下,尤其是恶意软件检测。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值