Java反编译工具Xjad的深入探讨与实践

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Xjad作为一款功能强大的Java反编译软件,允许开发者理解Java字节码并将其转换回接近原始的源代码形式。它是学习他人代码、调试二进制库或进行代码审计的实用工具。本文将介绍反编译的概念、Xjad的工作原理以及在使用时需注意的版权和法律问题、代码质量、混淆代码以及版本兼容性等方面。还将提供安装和使用Xjad的具体指导,以及结合其他工具进行代码分析的建议。 java反编译软件 Xjad

1. Java反编译概念

1.1 Java反编译简述

Java反编译是将Java类文件(.class文件)转换为其源代码形式的过程。这种转换可以是完全自动的,也可以是半自动的。反编译的目的是为了分析、修复或优化程序,或者用于学习和教育目的。

// 示例Java代码
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

1.2 反编译的应用场景

在软件开发和维护过程中,反编译被广泛应用,它可以:

  • 问题诊断 :当程序运行出现错误,但没有源代码可查时,通过反编译可以追踪问题所在。
  • 安全审计 :检查已编译代码是否存在安全漏洞或恶意代码。
  • 学习与教学 :帮助新手理解Java程序的工作原理。
  • 代码重构 :在没有源代码的情况下重构程序。

1.3 反编译的必要性

对于已经编译的Java类文件,源代码的丢失是反编译出现的直接原因。Java反编译的必要性主要包括:

  • 软件维护 :在没有源代码的情况下,维护和更新软件。
  • 知识产权保护 :检查是否存在非法复制或仿冒代码。
  • 技术研究 :分析第三方库或框架的实现细节。

由于Java反编译可能涉及到软件版权和隐私等敏感问题,因此在使用反编译技术时,开发者应遵守相关的法律法规,并尊重原软件的版权和许可协议。在下一章中,我们将详细探讨字节码与高级语言转换的过程,以及字节码的生成和转换原理。

2. 字节码与高级语言转换

2.1 字节码的定义与作用

2.1.1 Java虚拟机(JVM)的角色

Java虚拟机(JVM)是实现Java字节码到具体硬件平台机器码转换的中介。JVM 的存在使得 Java 程序能够做到“一次编写,到处运行”,这是因为无论目标机器的具体硬件如何,只要该机器上安装了对应的JVM,Java程序就可以被执行。JVM 不仅处理了字节码的执行,还负责内存管理、垃圾回收等。

JVM 具体执行操作可以分为以下几个阶段:

  1. 加载(Loading) :JVM 从文件系统或网络中加载 Class 文件。
  2. 链接(Linking) :链接分为三个步骤:验证、准备、解析。
  3. 验证确保 Class 文件的结构符合 JVM 规范,并且不会危害虚拟机本身的安全。
  4. 准备阶段则为类变量分配内存并设置类变量的默认初始值,这些内存都是在方法区分配的。
  5. 解析阶段负责将类、接口、字段和方法的符号引用转换为直接引用。
  6. 初始化(Initialization) :执行类构造器 <clinit>() 方法的过程。
  7. 使用(Using) :执行类中定义的方法。
  8. 卸载(Unloading) :当类或者类加载器被垃圾回收时,类也会被卸载。

2.1.2 字节码的生成过程

Java源代码在编译成字节码的过程中,需要经过Java编译器(javac)的处理。这个过程主要分为以下几个步骤:

  1. 词法分析 :将源代码的字符流转换为标记(Token)序列。
  2. 语法分析 :根据语言的语法规则,将标记序列构造成抽象语法树(Abstract Syntax Tree, AST)。
  3. 语义分析 :检查AST中的语义是否符合语言规范,进行类型检查、变量定义检查等。
  4. 中间代码生成 :将AST转换成中间代码表示,Javac将AST生成的是字节码的指令序列。
  5. 代码优化 :对生成的中间代码进行优化,提高运行效率。
  6. 字节码生成 :最终将优化后的中间代码转换为字节码,保存在.class文件中。

2.2 高级语言到字节码的转换原理

2.2.1 编译器和反编译器的工作原理

编译器(Compiler)的工作原理主要基于上述的从源代码到字节码的转换步骤。编译器通过一系列的分析和处理,将高级语言翻译成中间表示,然后再将中间表示转换成字节码。

反编译器(Decompiler)则是编译过程的逆过程。它接收字节码作为输入,通过逆向工程,尽可能地还原出等效的高级语言代码。反编译器通常包含以下步骤:

  1. 字节码解析 :分析字节码指令,理解其含义。
  2. 抽象语法树重构 :基于解析的指令构建出AST。
  3. 高级语言生成 :将AST转换成高级语言的形式。

反编译器面临的挑战在于,由于编译过程中信息的丢失(例如,局部变量的名称,以及一些优化后无法直接推断的信息),反编译过程无法完全还原出源代码的所有细节。

2.2.2 常用的Java反编译工具对比

市场上存在许多Java字节码反编译工具,其中一些流行的选择包括:

  • JD-GUI :一款开源的Java反编译器,界面简洁,易于使用。
  • Procyon :一个现代的反编译器,提供插件支持,可以集成到不同的IDE中。
  • CFR :Cavaj Java decompiler, 能够处理加密和混淆后的代码。
  • JAD :一个经典的反编译器,现在基本不再维护,但历史上对反编译Java字节码贡献很大。

对这些反编译器进行比较时,我们通常会考虑以下几个维度:

  • 准确性 :反编译后代码的可读性和准确性。
  • 速度 :反编译过程的处理速度。
  • 兼容性 :支持的Java版本和字节码特性。
  • 用户界面 :是否提供图形用户界面(GUI),界面的友好程度。

2.3 字节码与源代码的关联

2.3.1 源代码的编译过程

源代码的编译过程其实与字节码生成过程是对应的,只不过是从相反的方向进行。在这个过程中,开发者通常使用IDE或者命令行工具(如javac)来编译Java源代码。此过程可以分为:

  1. 读取源文件 :读取Java源代码文件。
  2. 词法分析 :分析源代码并生成Token。
  3. 语法分析 :解析Token,构建语法树。
  4. 语义分析和优化 :检查语义错误,进行类型检查和优化。
  5. 字节码生成 :生成.class文件。

2.3.2 字节码与源代码的差异分析

尽管字节码是源代码的低级表示,但两者之间存在一些本质上的差异:

  • 抽象级别 :源代码是高级语言表示,更接近人的思维方式;字节码是虚拟机的低级指令集,更接近机器语言。
  • 可读性 :源代码通常包含大量的注释、命名信息、格式化空格,而这些在字节码中往往不可见或被压缩。
  • 结构差异 :源代码中的控制流结构在字节码中可能表现为一系列跳转指令,类和方法信息也以特定的方式存储。
  • 执行效率 :字节码经过优化,有时比直接执行源代码还要高效。
  • 平台独立性 :源代码需要针对不同平台重新编译;字节码只需在目标平台上有一个JVM,即可运行。

了解这些差异对于理解反编译的限制和可能性至关重要。反编译过程中,某些源代码中的逻辑或注释可能无法准确还原,这是因为在编译过程中,这些信息已经以某种形式丢失或被优化。

3. Xjad软件功能与特点

随着Java应用程序的广泛应用,对Java字节码的分析和理解变得越来越重要。反编译工具因此成为开发者的利器,Xjad正是其中的佼佼者。本章将深入探讨Xjad的界面布局、操作流程、核心技术以及与其他同类软件的对比分析。

3.1 Xjad的界面布局与操作流程

3.1.1 用户界面的组成

Xjad的用户界面采用了现代、直观的设计,确保即使是新手用户也能快速上手。界面主要由以下几个部分组成:

  • 菜单栏 : 提供了文件管理、视图调整、工具设置等常用功能的入口。
  • 工具栏 : 快速访问按钮集合,涵盖了反编译、搜索、打印等常用操作。
  • 项目视图 : 显示了当前打开的项目及其结构,用户可以在这里浏览和管理项目中的类文件。
  • 代码编辑器 : 反编译后Java源代码的展示和编辑区域,提供了语法高亮、代码折叠等便利功能。

![Xjad用户界面布局](***

*** 基本的使用步骤

使用Xjad进行反编译的基本步骤如下:

  1. 打开Xjad软件。
  2. 通过“文件”菜单或工具栏按钮导入需要反编译的.class文件或.jar文件。
  3. 选择合适的反编译策略(默认设置通常适用于大多数情况)。
  4. 点击“反编译”按钮开始反编译过程。
  5. 查看反编译结果,进行代码审查或编辑。
  6. 如有需要,通过“保存”或“另存为”功能保存编辑后的源代码。

3.2 Xjad的核心技术解析

3.2.1 反编译算法的实现

Xjad的反编译算法是其核心技术之一。为了保证反编译结果的准确性和可靠性,Xjad采用了先进的静态分析技术。反编译过程可以概括为以下步骤:

  1. 读取字节码 : 从.class文件中读取字节码指令。
  2. 分析控制流 : 构建方法的控制流图(CFG),明确代码逻辑流程。
  3. 数据流分析 : 确定变量类型和变量之间的作用关系。
  4. 重建源代码 : 根据控制流和数据流的分析结果,构建出可读的Java源代码。

3.2.2 对Java特性的支持度

Xjad对Java语言特性有很好的支持,包括但不限于:

  • 泛型 : 保留原始泛型信息,便于开发者理解代码设计意图。
  • 注解 : 准确还原注解信息,有助于理解类或方法的附加元数据。
  • 内部类 : 支持内部类的正确反编译,保持代码结构的完整性。
  • lambda表达式 : 支持Java 8及以上版本的lambda表达式反编译,这对于理解和调试Java 8及以上版本的应用至关重要。

3.3 Xjad与同类软件的对比分析

3.3.1 功能特点的对比

Xjad在与同类软件(如JD-GUI、CFR等)的功能特点对比中具有以下优势:

  • 性能 : Xjad优化了反编译算法,处理大型项目时速度更快。
  • 兼容性 : 支持广泛的Java版本,从早期版本到最新的Java SE 17+。
  • 扩展性 : 提供插件系统,方便第三方开发者扩展新功能。

3.3.2 用户体验的比较

Xjad在用户体验方面同样占据上风:

  • 界面友好 : Xjad的现代UI设计为用户提供了更好的视觉体验。
  • 定制性 : 用户可以自定义主题、快捷键等,满足个性化需求。
  • 稳定性 : 在长时间使用中,Xjad能够保持较高的稳定性和响应速度。

Xjad软件凭借其强大的反编译能力、丰富的功能以及良好的用户体验,已经成为Java开发者在分析和调试Java字节码时不可或缺的工具之一。接下来的章节将会介绍如何安装和使用Xjad,以及在反编译过程中需要注意的事项。

4. 反编译法律和道德规范

在IT行业和软件开发领域,反编译技术在某些情况下被认为是合法且必要的,但在其他情境下可能触犯法律或道德规范。本章节将详细探讨反编译所涉及的法律问题、道德争议,并提供规避风险的策略。

4.1 知识产权与反编译的界限

4.1.1 合法使用的定义

反编译是否合法,首先需要明确的是法律对于知识产权的保护范围和界限。合法使用反编译技术的基本原则是,反编译的目的应是为了获取与实现兼容性、错误修复、安全审计等合法目的,并且在法律允许的框架内。例如,欧洲软件指令中,第6条第3项规定:“在不影响版权及其相关权利的条件下,合法获取的软件副本的用户,有权对该副本进行观察、研究或测试,以确定软件的主要思想和原理。” 这一点为反编译留下了合法的空间,但同时必须遵守相关法律的限制。

4.1.2 法律风险与防范

尽管存在合法的使用场景,但开发者或使用者在实施反编译时仍需谨慎,以避免侵犯知识产权。具体防范措施包括:

  1. 确认使用反编译的目的是否属于法律允许的范畴。
  2. 在必要时,获取原始软件的许可和授权。
  3. 对于个人学习或研究目的的反编译,需保证不将结果用于商业用途。
  4. 咨询专业法律顾问,了解当前法律对反编译的具体限制和规定。

4.2 反编译的道德争议

4.2.1 道德责任的界定

除了法律风险,反编译还涉及到道德责任问题。从道德的角度来讲,尊重他人的劳动成果和知识产权是基本原则。开发者在反编译时,需要权衡技术进步和道德责任之间的关系。

  1. 反编译可以促进技术交流和开放源代码的发展,从而有利于整个行业。
  2. 反编译应当遵循透明和共享的原则,确保成果不用于破坏公平竞争或侵犯原作者权益。

4.2.2 社会对反编译的接受程度

社会对于反编译的态度是多元化的。一方面,开源社区通常对反编译持开放态度,因为它促进了技术创新和共享。另一方面,商业软件公司则可能强烈反对反编译行为,认为这侵害了他们的合法收益和商业秘密。

  1. 在开源社区中,反编译被视为理解和改进软件的一种手段。
  2. 商业公司则往往通过法律手段来保护其软件产品,防止反编译行为发生。

在处理道德争议时,开发者和企业应当遵循公平、诚信的原则,确保反编译的正当性和必要性,同时尊重原作者的知识产权。

在下一章节中,我们将详细探讨反编译过程中需要注意的事项,以及如何安全、高效地进行反编译工作。

5. 反编译过程中的注意事项

5.1 反编译前的准备工作

5.1.1 环境配置的要点

在进行反编译操作之前,确保你有一个良好的开发和调试环境是非常关键的。首先,你需要确保你的计算机上安装了适合的Java虚拟机(JVM)。这是因为大部分Java反编译工具都需要JVM来运行。JVM的版本要和目标类文件的编译版本相兼容,否则可能会出现兼容性问题,导致反编译失败。

其次,对于开发者来说,一个集成开发环境(IDE)如IntelliJ IDEA或Eclipse,可以帮助你在反编译后对代码进行分析和编辑。它们通常包含了对Java字节码的高级编辑支持。

除了Java运行环境,你还需要安装专门的反编译工具,比如JD-GUI、CFR或者Xjad。在安装这些工具时,请确保下载对应操作系统版本的正确安装包,并遵循官方的安装指导文档进行安装。

在安装时,要特别注意系统环境变量的配置,尤其是工具的安装路径。如果环境变量配置不当,可能会在执行命令行工具时遇到找不到主类或执行文件的问题。

5.1.2 文件格式的选择

反编译过程中,文件的格式也是一个需要仔细考虑的因素。Java类文件是以 .class 为扩展名的二进制文件,这通常是在没有源代码的情况下唯一可以使用的格式。然而,有时你可能会接触到jar、war或EAR等Java归档文件。这些归档文件中包含了多个 .class 文件以及其他资源文件。

在反编译这些归档文件之前,你需要先将它们解压缩成其内部的 .class 文件。这个过程可以通过命令行工具如 jar 或图形界面工具如WinRAR完成。在解压时,务必保留文件结构,因为这有助于后续的代码理解和重构。

另一个常见的文件格式是JAR。JAR文件是Java归档文件,不仅包含类文件,还可能包含包信息、资源文件和其他文件。在处理JAR文件时,你可以选择直接使用反编译工具打开整个JAR文件,也可以先解压缩JAR文件,然后选择需要反编译的 .class 文件进行操作。

5.2 反编译过程中的常见问题

5.2.1 兼容性问题的处理

在反编译Java字节码时,兼容性问题可能会影响反编译工具的执行效果。兼容性问题可能会由以下几种原因引起:

  • 目标JVM版本与反编译工具不匹配 :不同版本的JVM在字节码层面可能存在差异,所以反编译工具可能在某些版本的JVM上表现不同。

  • 特定API或库的限制 :如果反编译的类文件中使用了特定版本的API或者第三方库,那么在没有这些API或库支持的环境中反编译可能会失败或导致不准确的代码输出。

  • 字节码损坏 :字节码文件可能因为编译错误、传输损坏或者恶意修改等原因,导致无法正确反编译。

处理兼容性问题的一般策略是:

  • 确认反编译工具支持的JVM版本范围,选择与目标类文件编译时使用的JVM版本一致的环境进行反编译。

  • 在不同的反编译工具中尝试反编译,看哪一个能够提供更准确的结果。

  • 使用字节码分析工具检查字节码文件的完整性,如 javap 或者专业的字节码分析工具。

  • 如果问题依然存在,尝试使用源码编译器直接编译原始源代码,以查看是否能够重现问题。

5.2.2 错误和异常的排除

反编译过程中可能会遇到各种错误和异常,比如 IOException ClassNotFoundException 或者 NoClassDefFoundError 等。这些通常指示在读取或处理字节码时遇到了问题。

  • IOException 可能是因为文件路径错误或文件权限问题导致无法读取文件。

  • ClassNotFoundException 或者 NoClassDefFoundError 可能是因为依赖问题或者环境配置问题导致JVM无法找到必要的类定义。

排除这些错误和异常的步骤通常如下:

  • 检查文件路径和权限 :确保你指定的文件路径是正确的,且你有足够的权限访问该文件。

  • 验证环境变量设置 :确认环境变量的配置是否正确,特别是 CLASSPATH 变量。

  • 调试日志和信息 :如果错误信息不够明确,可以通过增加反编译工具的日志级别来获取更详细的调试信息。

  • 检查依赖关系 :使用诸如 javap Dependency Walker 等工具来检查类文件中是否有未解决的依赖。

一旦你确定了错误的原因,就可以采取相应的解决措施,比如修复路径和权限问题,或者添加缺少的依赖项。

5.3 反编译后的代码分析

5.3.1 代码的可读性提升

反编译得到的Java源代码虽然在功能上和原始源代码一致,但是在可读性方面往往不尽人意。这主要是因为编译过程中去掉了大部分的符号信息,例如方法名、变量名被转换为简短的符号。为了提升可读性,你可以采取以下几种策略:

  • 重命名标识符 :反编译工具通常允许用户重命名方法和变量。如果你知道原始代码中使用了什么样的命名规则,可以尝试使用这些规则来重命名符号。

  • 代码格式化和美化 :使用IDE或代码美化工具对代码进行格式化。这样可以使得代码的结构更加清晰,提高可读性。

  • 添加注释 :为难以理解的代码段添加注释。虽然注释不会直接提升代码的执行效率,但对后续理解代码逻辑有很大帮助。

  • 重构策略的使用 :重构不便于阅读的代码片段。比如,将长方法拆分成短方法,将复杂的逻辑分离成简单的子逻辑等。

  • 阅读反编译日志 :有些反编译工具会生成日志文件,这些日志文件包含了反编译过程中的详细信息。通过分析这些信息,可以更深入地理解代码结构。

5.3.2 代码重构的策略

反编译后的代码重构是一个非常重要的环节。重构的目的在于提高代码的可维护性和可扩展性,同时减少错误。重构策略应当遵循以下步骤:

  • 理解原有逻辑 :在重构之前,确保你充分理解了代码的功能和逻辑。如果可能的话,运行测试用例验证功能的正确性。

  • 小步修改,频繁测试 :重构时应该采取小步骤的方式,每次修改后都要运行测试用例确认修改没有引入新的问题。

  • 提取通用逻辑 :查找代码中重复的模式,将其转换为方法或类,以提高代码复用率。

  • 模块化设计 :如果代码是由多个功能模块组成的,考虑将它们分解为独立的模块。这样不仅有助于维护,也便于未来的升级和扩展。

  • 使用设计模式 :根据代码的具体情况,适当使用设计模式来解决特定的问题。

  • 重构后的审查 :重构完成后,最好有其他开发者对重构后的代码进行审查,以确保重构的正确性和有效性。

重构后的代码应该是一个更清晰、更易于理解、更易于维护的版本。记住,重构是一个持续的过程,随着需求的变化,代码可能需要不断地进行调整和优化。

以上提到的准备工作、常见问题处理和代码分析策略,都是在反编译Java字节码时必须注意的关键点。通过仔细地遵循这些指南,你可以有效地提升反编译过程的效率和产出代码的质量。

6. Xjad的安装与使用教程

6.1 Xjad的安装过程详解

6.1.1 系统要求和兼容性

Xjad作为一个专业的Java反编译工具,对于系统的最小要求相对较低。基本上,它支持所有主流操作系统,包括但不限于Windows, Linux, macOS。它需要Java运行环境(JRE)的支持,版本要求为Java 8及以上。

从兼容性角度看,Xjad能够处理绝大多数Java编译后的.class字节码文件。不过,需要注意的是,如果字节码文件被混淆或者加密处理,Xjad可能无法还原出源代码,或者只能部分还原。此外,对于某些特定编译器优化生成的字节码,反编译结果可能与原始源代码有所出入。

6.1.2 安装步骤与验证

安装Xjad相对简单,主要分为以下几个步骤:

  1. 下载Xjad安装包:前往官方网站或者下载镜像站点下载最新版本的Xjad安装包。
  2. 解压安装包:根据操作系统选择合适的解压工具进行解压操作。
  3. 运行安装脚本:在解压后的文件夹中,找到安装脚本并运行。如果是Windows系统,双击安装包中的 setup.exe 即可。

在安装结束后,为验证安装是否成功,可以执行以下操作:

  1. 打开命令行界面。
  2. 进入到Xjad的安装目录下。
  3. 输入 java -jar xjad.jar ,若安装成功,将启动Xjad的主界面。

如果遇到问题,可以检查环境变量配置,确保Java的路径已被正确添加到系统环境变量中。

6.2 Xjad的实际操作指南

6.2.1 反编译单个文件的方法

使用Xjad进行单个文件的反编译非常简单,以下是操作步骤:

  1. 打开Xjad主界面。
  2. 在界面上方的导航栏中,选择“File”菜单,然后点击“Open Class File”。
  3. 在弹出的文件选择对话框中,找到并选择需要反编译的.class文件。
  4. 点击“打开”后,Xjad将开始反编译过程。
  5. 反编译完成之后,源代码将在主界面的代码编辑区显示出来。

6.2.2 批量处理与自动化脚本

如果需要对多个文件进行反编译,Xjad也提供了批量处理的功能,以提高效率:

  1. 在“Tools”菜单中选择“Batch Process”。
  2. 在弹出的批量处理窗口中,点击“Add”选择需要反编译的文件或目录。
  3. 设置好输出路径和其它选项。
  4. 点击“Start”开始批量反编译。

此外,Xjad支持使用脚本自动化处理,这样可以通过编写脚本来对特定的文件集执行一系列操作,如:

  • 使用 -script 命令行参数加载脚本文件。
  • 脚本中可以包含打开文件、设置选项、执行反编译等命令。

6.3 Xjad高级功能的探索

6.3.1 插件系统的应用

Xjad支持插件系统,可以通过安装插件来增强其功能。目前市场中有一些第三方开发的插件,比如用于代码美化、代码注释生成等,用户可以根据需求进行选择安装。

安装插件的步骤如下:

  1. 下载需要的插件文件,通常为 .jar 格式。
  2. 将下载好的插件文件复制到Xjad的 plugins 目录下。
  3. 启动Xjad,插件将自动加载。

6.3.2 自定义反编译模板与规则

对于高级用户来说,Xjad还允许用户自定义反编译的模板与规则,以实现更精细的控制。

自定义模板步骤:

  1. 在“Tools”菜单中选择“Options”。
  2. 在设置界面中找到“Templates”选项卡。
  3. 在这里可以创建新的模板或修改现有模板,根据个人需求设定代码的格式和规则。
  4. 保存设置后,反编译操作将按照新设定的模板执行。

自定义规则涉及到更深层次的使用,一般情况下,仅在有特殊需求时才需要设置,如对反编译结果进行特殊的代码格式调整或清理工作。在Xjad的高级设置中,用户可以根据规则语法进行自定义。

通过这些高级功能的探索和应用,用户可以更有效地利用Xjad进行Java字节码的反编译工作,并提高开发效率。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Xjad作为一款功能强大的Java反编译软件,允许开发者理解Java字节码并将其转换回接近原始的源代码形式。它是学习他人代码、调试二进制库或进行代码审计的实用工具。本文将介绍反编译的概念、Xjad的工作原理以及在使用时需注意的版权和法律问题、代码质量、混淆代码以及版本兼容性等方面。还将提供安装和使用Xjad的具体指导,以及结合其他工具进行代码分析的建议。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值