RDP协议详解

RDP协议详解

一、前言

RDP,Remote Desktop Protocol,远程桌面协议,是一个多通道(mutil-channel)的协议,让用户(客户端或称“本地电脑”)连上提供微软终端机服务的电脑(服务器端或称“远程电脑”)。大部分的Windows、Linux、FreeBSD、Mac OS X都有相应的客户端。服务端听取送到 TCP 3389 端口的数据。

windows从NT开始提供终端服务,它是微软买来的网络协议技术(Citrix),服务器端要安装、配置,客户端要连接程序。终端服务使任何一台有权限的终端机,用已知的账号登录服务器,可以使用账号内的资源,包括软件,硬件资源;同时,在协议升级后,客户端连接后可以使用本地的资源,包括本地打印机、声音本地回放,本地磁盘资源和本地硬件接口。所有的计算都在服务器端进行,客户端只需要处理网络连接、接收数据、界面显示和设备数据输出。目前,关于RDP服务的linux客户端程序有winconnect,linrdp,rdesktop,前两个没有源码,但redsktop已经由原来的个人开发后公开代码演变成现在的项目组开发。

二、概述

1 版本功能说明:

RDP协议在终端服务推出后已有四个版本,4.0、5.0、5.1、5.2。一般来说,版本是根据windows的版本确定的。

从客户端的角度来说,5.X版本间提供的功能差别不是很大,相对于4.0版本,它提供了用户带密码直接登录、客户端驱动器资源映射、客户端音频回放、最高24位色显示和符合FIPS加密级别连接。

另外,从4.0协议开始变提供的客户羰功能有:高、中、低三种数据加密级别,客户端自定义初始登录环境,客户端打印机映射,客户端LPT端口映射,客户端com端口映射,剪贴板映射,客户登录的个性化设置(包括键盘、显示界面大小等)。


7.0版:这是最新的版本,必须要有Windows Server 2008 R2 或 Windows 7。

2、协议层次说明:

通过破解研究,我们掌握了RDP协议的基本层次结构。基本上,RDP协议的每一层次上都标示出其层内的数据长度值。对于层次划分,主要是指RDP协议网络功能数据传送时通常都包含的各层次,而对于各层次内所实现的单层次连接等功能将做为单独的模块来进行阐述。

 网络连接层:RDP协议建立在TCP/IP协议之上,由于传输的数据量比较大,因此在协议的底层首先定义一层网络连接层。它定义了一个完整的RDP数据逻辑包,以避免由于网络包长度过长而被分割使数据丢失。

ISO数据层:在网络连接层之上是ISO数据层,它表示RDP数据的正常连接通信。

虚拟通道层:在ISO数据层之上,RDP协议定义一个虚拟通道层,用以拆分标示不同虚拟通道的数据,加快客户端处理速度,节省占用网络接口的时间。

加密解密层:在虚拟通道层之上,RDP定义一个数据加密解密层。此层用于对所有的功能数据进行加密、解密处理。

功能数据层:在加密解密层之上是功能数据,画面信息,本地资源转换,声音数据,打印数据等所有的功能数据信息都在此层进行处理。另外,根据数据类型的不同,这些数据都有各自不同层次的分割,他们的内部层次结构将在各个功能模块中进行阐述。

3 其它说明:

本协议解析中所提到的各层次结构都是指RDP功能数据正常传送时的各底层结构,在功能数据传送前的各层次的建立连接过程及其结构、实现都归于模块实现来进行说明。对于服务器端的各种设置以及个版本间的内部实现差异请看RDP帮助文档,以及rdpwin开发文档。

4 连接过程说明:

1) 客户端连接服务器
2) ISO数据层建立连接
3) 发送初始协议相关信息,接收加密、解密密钥
4) 虚拟通道申请
5) 加密形式发送客户端系统信息,同时验证加密协议
6) 平台软件证书验证
7) 各功能建立连接,各功能数据传输,功能实现

三、网络层次

1.网络连接层

在RDP协议网络实现连接中,本层的数据格式是固定的。

内容协议版本号保留此逻辑包长度
字节数112
当前版本皆是30逻辑长度,从版本号开始到本包结束

2.ISO数据层

内容单层数据长度ISO包类型标志
字节数111
2,从下字节开始计算0xf0,表示数据0x80

3.虚拟通道层

虚拟通道层用于在正常网络连接数据之上,中个虚拟通道的功能数据。此层次的连接另见初始连接模块与通道申请模块,在此只说明正常数据连接时的层次结构。

1)结构信息
内容类型虚拟通道个数虚拟通道号标志
字节数1221
0x64/0x680x0010x03eb至0x03ee0x70/0xf0

2)类型说明
0x64:客户端发送数据
0x68:客户端接收数据

3)用户号说明
本次连接的用户号,服务器发送的是0x0001;客户端所发送的值是初始连接时请示通道后服务器同意开通的虚拟个数。

4)虚拟通道号说明:
虚拟通道号是本层次以上所发送的功能数据所在的虚拟通道号,其由初始连接通道申请建立时确定。

5)标志说明:
客户端发送的标志为0x70;服务器端发送的标志,当数据是图像(由通道号识别),其值为0x70,当功能数据是其他数据时,其值为0xf0.

4.加密解密层:

加密解密用于对网络连接中所发送、接收的数据进行加密、解密。我为保证数据和系统的安全性,对网络数据进行加密传输时比较常用且必然的,RDP协议在此层对实际的功能数据进行加密。

1)结构信息:
内容单层及层上数据总长度加密标志未知标志数字签名
字节数1-2228
从下字节开始计算0x08000x1000/0x0203顺序取得

5.功能数据层:

功能数据是客户端与服务器进行交互的真正数据。他们都有各自固定格式、连接、控制方式,具体情况见各功能模块的说明。

根据当前我们所掌握的信息,RDP协议将图像信息、声音信息、设备信息、剪贴板内容都各自以单一的虚拟通道进行传送,而打印机映射,磁盘映射,端口映射都做为设备信息的内容进行处理。限于当前左上角工作和项目工作的限度,设备信息中只考虑了打印机映射的部分,对于打印机信息与其他的设备相关的信息没有进行有效隔离区分,而本协议说明中相关的连接信息、数据传送都只认为是打印机映射的内容。

四、各连接模块说明:

1 ISO连接模块:

在客户端与服务器的网络套接口建立之后,需要首先建立RDP协议底层连接,得到连接确认后才能正常通信。具体实现如下:

1) 连接过程说明:

初始连接时,在网络套接口TCP连接建立之后中,客户端首先进行连接请求,当收到连接确认后表示网络连接层连接建立,随后开始传送RDP数据。

2) 连接请求通信数据

内容层内数据长度RDP包类型未知1未知2标志其它
字节数11221不定
从下一字节开始计算0xd0/0xe00x0000另见0x00另见

3) RDP包类型说明:

     0xe0:客户端连接请求

     0xd0:服务器确认连接

4) 未知数据2说明:

  0x0000:客户端请求连接的值

  0x1234:服务器确认请求的值

5) 其它数据说明:

win2003客户端在请求时附带了如下字符—“Cookie: mstshash=Administrator0x0d0x0e”,目前不知其意。其中Administrator为自动登录名,当其长度超过12字节时,只保留前12字节,其它字符都固定不变。

2 协议信息初始模块:

当基本的RDP连接建立后,需要进行客户端与服务器的系统环境、RDP连接环境的信息交流与连接确认。

2-1) 发送包结构:

内容字节数
ISO数据层及以下XXXX
协议信息初始发送标志20x7f65
其后数据长度30x82 0xlength
第一部分未知数据704 00 04 01 01 ff
第二部分未知数据XX三组协议参数
第三部分未知数据XX四种连接参数

2-1-1) 第一部分未知数据结构:

内容字节数
Calling domain20x0400
Calling domain20x0400
未知数据20x0101
标志10xff

2-1-2) 第二部分未知数据结构:

内容字节数
协议适合参数2+4+7*(2+参数值占字节数)标志,长度,8个参数值
协议最小参数2+4+7*(2+参数值占字节数)标志,长度,8个参数值
协议最大参数2+4+7*(2+参数值占字节数)标志,长度,8个参数值

说明:3组参数标志都是0x30,8个参数值的标志都是0x20

含义适合值最小值最大值
虚拟通道数0x22=340x010xffff
用户数0x220x010xfc17=64535
Token值0x000x010xffff
优先数(proorities)0x010x010x01
遍及数(throughput)0x000x000x00
顶点数(height)0x010x010x01
网络逻辑数据包长度0xffff0x0420=10560xffff=65535
版本号0x020x020x02

2-1-3) 第三部分未知数据结构:

内容字节数
本部分标志、数据长度40x40 0x82 0xlenght1
未知数据1400 05 00 14 7c 00 01
余下的数据长度20x8000/length2
未知数据2800 08 00 10 00 01 c0 00
未知数据3444 75 63 61 - “Duca”
4组数据XX各功能模块连接信息

2-1-3-1:基本信息

内容字节数值(反字节存储)
标志20xc001
长度2这一数据的长度
Licence版本21,4,5;lincence标志升级
未知数据120x0008
窗口宽度、高度4宽度、高度
未知数据240xca01,0xaa03
Keylayout40x00000409
客户端系统组件数4419,2195,2462
客户端机器名322字节存储一个字符
未知数据3120x04,0x00,0x0c各四个字节
未知数据464都是0
未知数据5801 ca 01 00 00 00 00
图形颜色位(最大值)224,16,15,8
未知数据6(疑最小位)207 00
未知数据7401 00 00 00

基本信息返回值多少且固定,认为在具体连接时有更多返回信息。加密信息需要取回加密级别与密钥;通道信息则返回基本图形信息的通道号和其他虚拟通道号,需要另行申请。

3 通道申请模块

对于RDP连接,各种功能数据都是通过单独的虚拟通道传输的。初始连接后,在进一步的信息通信之前,需要开辟相应的通道。

1) 过程说明

客户端首先发送一个建立连接独立空间请求,再发送一个用户绑定请求,若服务器同意,将发送用户绑定确认,且含有需要申请的虚拟通道总数totalchannel。随后客户端申请虚拟通道。虚拟通道号从1001+2=1003开始到1001+totalchannel结束,每次申请都应返回一个申请结果。

2) 建立连接独立空间请求结构:

内容ISO数据层以下请求标示高度值间距
字节数XX122
XX |0x040x00010x0001

3) 绑定用户请求结构 :

内容ISO数据层以下请求标示
字节数XX1
XX0x28

4)用户绑定确认结构:

内容ISO数据层以下请求标志虚拟通道总数
字节数XX22
XX|0x2e00totalchannel

5)申请虚拟通道号结构:

内容ISO数据层以下申请标志虚拟通道总数虚拟通道号
字节数XX123
XX0x38total channelNum

6)通道申请确认结构:

内容ISO数据层以下确认标志通道总数申请通道
字节数XX222
XX0x3e00totalnum

4.系统初始连接模块

当通道申请各部分通过后,开始系统登录的初始连接。从此数据包开始,所以虚拟通道层以上的网络数据都需要加密,详细的加密功能实现请参见加密模块。登录的网络信息结构如下:

内容字节数值(字节反存)
加密层及以下XXXX
空闲字节40x00000000
自动登录标志4正常,0x33,自动:0x28
域名长度2若空为0,有值则乘2
用户名长度2若空为0,有值则乘2
密码长度2若空为0,有值则乘2
登录程序长度2若空为0,有值则乘2
登录路径长度2若空为0,有值则乘2
域名值域名长度+22字节反存1字符,最后为2字节为0x0000
用户名值用户名长度+22字节反存1字符,最后为2字节为0x0000
密码字符值密码长度+22字节反存1字符,最后为2字节为0x0000
登录程序名称登录程序长度+22字节反存1字符,最后为2字节为0x0000
登录路径值登录路径长度+22字节反存1字符,最后为2字节为0x0000

5.图形连接模块

在图形数据发送之前,服务器需要对此功能模块验证,验证内容是所有与图形相关的信息,包括鼠标设置、键盘输入、字体类型、画图命令格式、图形显示的各种类型。

根据已破解的信息显示,RDESKTOP原来并没有正确的赋值,因为它的返回值是没有固定的,对于服务器发送来的信息没有处理,而服务器在其关于图形方面的参数设置询问没有得到正确的回答时,则以固定的服务器端的参数进行设置。

连接过程说明:服务器端首先发送关于图形方面的基本参数设置,客户端应该对这些设置进行反馈。此后rdesktop的处理是顺序发送同步信息,两个控制信息包,一个输入信息包,两个字体信息包;同时顺序接收一个同步信息包,两控制信息包,一个未知信息包;但redsktop并没有对接2收的信息包进行处理。

5-2)基本参数设2置信息包结构:

内容字节数值(字节反存)
加密层及以下XXXX |
层后数据长度2XX
数据类型标志211 00,表示图形信息连接确认
基本通道号2ea 03,固定
未知数据1201 00
ASCII信息长度2XX
基本参数长度2XX
ASCII信息长度值+152 44 50 00,r->”MSTSC”
参数信息2r->0b 00,s->0d
空位230或00
详细各组参数组数内容XX

5-3) 详细参数信息组类别:

每个类型的数据前2字节为类型,然后是长度,数据。以接收到优先作例介绍。

类型值说明
01r通用类型(general)
02r位图类型(bitmap)
03r命令(order)
04位图缓存(bitmap cache)
05控制(control)
07活动(active)
08r指针(pointer)
08r共享(share)
0ar颜色缓存(color cache)

5-3-1) 通用类型(general->01)

内容字节数值(字节反存)
系统主类型201 00,OS major type
系统次类型203 00,OS minor type
协议版本号202 00,protocol version
空数据1200 00
压缩类型200 00不压缩
空数据221d 04
更新属性200 00
共享属性200 00
压缩级别200 00
空数据3201 01

6打印机映射连接模块:

RDP协议当前提供映射5个设备,在我们破解过程中并没有区分出他们的区别,在此视为单一处理。打印机的连接在系统登录前完成,以配置操作系统信息。

6-1) 连接过程说明

包序号接收发送字符含义
1RInDr设备初始连接通知,说明可以连接申请
2SCCDr客户端连接申请
3SCNDr客户端名称注册
4RSPDr服务器提供的设备接口说明
5RCCDr服务器设备申请确认
6SCPDr客户端设备提供的接口说明
7SDADr客户端打印机映射申请
8RdrDr服务器打印机设备映射成功确认

6-2) 设备初始连接通知:

内容字节数值(字节反存)
层内数据长度40x0000000c
标志403 00 00 00,表示控制信息
ASCII信息4InDr
未知数据1201 00,可能是最少个数
未知数据2205 00,可能是最多个数
未知数据32ff ff
未知数据4ff ff

6-3) 客户端连接申请:

内容字节数值(字节反存)
层内数据长度40x0000000c
标志400 00 03 00,表示控制信息
ASCII信息4CCDr
未知数据1200 01,申请最少个数
未知数据2200 05,申请最多个数
未知数据32ff ff

6-4) 客户端名称注册:

内容字节数值(字节反存)
内容字节数值(字节反存)
层内数据长度4XX
标志400 00 03 00,表示控制信息
ASCII信息4CNDr
未知数据1441 02或 63 00
未知数据22bf 00 或 72 00
未知数据3400 00 00 00
主机名长度4XX,字符2字节存储
主机名长度XX

6-5) 服务器提供的设备接口说明:

内容字节数值(字节反存)
层内数据长度4XX
标志403 00 00 00,表示控制信息
ASCII信息4SPDr
设备个数405 00 00 00
设备1标识201 00
设备1信息长度228 00,从标识开始计算
设备1中未知数据4内容见下表
4组设备信息8每组只有标识号变化,1可能表示有效0x 00 08 00 01 00 00 00

6-6) 服务器设备申请确认:除标志反位存储外,其他都与6-2)中所说相同。

6-7) 客户端设备提供的接口说明:除标志反位存储、ASCII信息和设备1信息中第11字节值是5之外,其他都与6-2中所说相同。

6-8) 客户端打印机映射申请:

内容字节数值(字节反存)
层内数据长度4XX
标志403 00 00 00,表示控制信息
ASCII信息4DADr
设备个数401 00 00 00
设备1标识401 00
设备1句柄4
设备1 ASCII信息4
空位4
此后数据长度4
未知数据1长度4
未知数据10x0a
驱动打印机名长度8
空位4
驱动名称XX
打印机名称XX

6-9) 服务器打印机设备映射成功确认:

内容字节数值(字节反存)
层内数据长度4XX
标志403 00 00 00,表示控制信息
ASCII信息4drDr
设备句柄401 00 00 00
空位400 00 00 00

###声音处理连接模块
RDP协议需要单独的虚拟通道传递关于声音的数据。为了能够在本地播放声音,需要进行声音处理模块的连接,但只有要声音回放时才开始连接。连接的内容是:客户端对这些信息进行反馈,以在客户端与服务器之间确定相应的参数。

7-1) 连接过程说明:服务器首先发送一系列的关于声卡的设置参数,以及声音数据的网络格式信息,客户端对本地声卡进行测试并发回可支持的设置参数;服务器得到反馈后再发送测试数据,测试成功则反馈连接成功。

7-2) 声卡设置参数询问结构:

内容字节数值(字节反存)
层内数据长4XX
标志403 00 00 00,表示控制信息
声音处理标志107 表示声卡设置参数询问
未知数据1100
此后数据长度2XX
声音数据标志407 00 00 00,表示此后是声卡参数
声音音量4f0 fa 8b 00
声音平衡量4E8 20 f3 77
UDP端口?25a ae
声卡参数组数2XX
未知数据21ff
状态值205 00
未知数据3176
XX组声卡参数XX*18XX

声卡参数结构:

内容字节数值(字节反存)
声道数21或2
频率4
nAvgBttesPerSec4
nBlockAlign2
wBitsPerSample2
cbSize2

7-3) 声卡设置参数反馈结构:

内容字节数值(字节反存)
层内数据长4XX
标志403 00 00 00,表示控制信息
声音处理标志107 表示声卡设置参数反馈
未知数据1100
此后数据长度2XX
声音数据标志403 00 00 00,表示此后是声卡参数反馈
声音音量480 4d 80 4d
声音平衡量400 00 00 00
UDP端口?204 0e?
声卡参数级数2XX
未知数据2100
状态值202 00
未知数据3100
XX组声卡参数XX*18XX

7-2) 声卡测试结构:

内容字节数值(字节反存)
层内数据长4XX
标志403 00 00 00,表示控制信息
声音处理标志106 表示声卡设置参数测试
未知数据1123
此后数据长度2XX
声音数据标志1216 d4
声音数据标志2200 04
测试数据XXXX

7-2) 声卡测试反馈结构:

内容字节数值(字节反存)
层内数据长408 00 00 00
标志403 00 00 00
操作标志206 00 表示接收反馈
其后数据长度1204 00
声音数据标志1216 d4
声音数据标志2200 04

五、各功能模块说明

任务标志说明:适用于所有非图形通道数据。

00 00 00 0001 00 00 0002 00 00 0003 00 00 0000 00 03 00
传输中传输开始传输结束传输控制传输反馈

1 licence身份模块:

在加密、解密验证通过以后,服务器发送licence信息进行系统的身份认证。身份证认证的加密、解密系统也是用RSA/RC4体系,但是与网络通信中的加密、解密系统分开的。licence认证中的密钥是临时的、单独的。

1-1) 连接过程说明:服务器端首先发送demand包,内容是随机数和一些系统相关的字符信息;客户端需要回复requset包,内容是随机数、空闲值、主机名、用户名;服务器再发送authreq包,内容包括token值和signature值;客户端需要回复authresq包,内容包括token值、hwid值和signature值。服务器通过后会发送result包,表明licence认证通过。

1-2) demand包:r

内容字节数
加密层480 02 86 00
Licence标志101,表示demand,licence认证要求
版本14.0->02,5.x->03
本层长度286 00
服务器随机数32XX
未知数据1402 00 05 00
公司信息长度42c 00 00 00
公司信息0x2c“Microsoft Corporation 0”,2字表示1字符
未知2长度408 00 00 00
未知数据2841 00 30 00 32 00 00 00,“A02 0x0”
未知数据380d 00 04 00 01 00 00 00
未知数据485c f5 00 00 01 00 00 00
未知数据540e 00 0e 00
网址信息0x0e“Microsoft.com0”,1字节表示1字符

1-3) request包:s

内容字节数
加密层480 00 00 00
Licence标志113,表示request,licence认证要求回复
版本14.0->02,5.x->03
本层长度28a 00
未知数据1801 00 00 00 00 00 01 ff
客户端随机数32全是0值
(mod+pad)长度448 00 00 00
Modulus值64全是0值
Padding值8全是0值
用户标志20f 00
用户名长度2XX
用户名长度值1字节表示1字符,例“YYY”
主机标志210 00
主机名长度2XX
主机名长度值1字节表示1字符,例“YYY”

1-4) authreq包:r

内容字节数
加密层480 02 26 00
Licence标志102,表示authreq,licence认证密钥
版本14.0->02,5.x->03
本层长度226 00
未知数据1646 53 f9 65 f1 7b
Token长度20a 00
Token值0x0aXX,10字节
Signature值0x10XX,16字节

1-5) authreq包:s

内容字节数
加密层480 00 00 00
Licence标志115,表示authreq,licence认证密钥
版本14.0->02,5.x->03
本层长度23a 00
标志201 00
Token长度20a 00
Token值0x0aXX,10字节
标志201 00
Hwid长度214 00
Hwid值0x14XX,20字节
Signature值0x10XX,16字节

1-6) result包:r 不处理

内容字节数
加密层480 02 10 00
Licence标志1ff,表示result,licence认证密钥
版本14.0->02,5.x->03
本层长度210 00
未知数据1407 00 00 00
未知数据2402 00 00 00
未知数据3404 00 00 00

2 加密解密模块:

在初始模块中对网络通信连接中所设定的加密信息提交给服务器。而RDP协议实现的加密形式是RSA/RC4。

当取得初始的加密、解密密钥(在发送初始连接信息后得到的),在初始连接结束后,客户端需要发送系统登录的初始信息,用以验证客户端加密、解密 的正确性。此后经过licence认证,通过认证后,所有的加密数据都经加密解密层处理。同时,密钥需要保存,因为加密数据包需要连续的正确加密或解密才能得到正确的数据。

3 图形处理模块

在图形处理中,客户端将所有的事件转换为固定格式的网络数据发送到服务器,服务器将处理的结果以图片形式发回服务器。在图形处理模块内部又分了较多的层次,叙述下面

3-1) 第一级层次

内容字节数
层内数据长度2XX
第一级类型标记217 00 代表具体数据,0000时跳过后4字节
基本通道号2ea 03,固定
基本通道号2ea 03,固定(share?)
未知数据1201 00
网络包顺序号2XX
此后数据长度2XX
具体数据类型1见说明
数据压缩类型100 不压缩
数据压缩长度200

说明:对于每一组命令,他们都取相应的系统状态,根据具体的情况进行处理。特别说明的是,颜色值是固定的3字节,根据深度值取相应的就可以。

3-2-2) 位图:前2字节是图片的数量。其后是图片数据,取出后画图片。

每一张图片的结构:

内容字节数
图片水平左坐标2XX
图片垂直上坐标2XX
图片水平右坐标2XX
图片垂直下坐标2XX
图片水平点数2XX
图片垂直点数2XX
图片点深度值2XX
图片压缩标志200 表示不压缩
压缩数据长度2XX
压缩数据段内容段据2-1XXXX

4打印数据模块

   RDP协议提供本地打印机映射到服务器功能。在用户通过终端连接服务器并映射本地打印机后,可在远程主机上使用本地的打印机。客户端需要将本地打印机的型号传送给服务器,只有当前的服务器含有此打印机型号驱动时,打印机才会映射成功,在通道建立之后,对于打印机映射还需要信息交互确认。

   服务器把需要打印的数据发送到打印机所在的网络连接终端,通过单独的虚拟通道传送到客户端,由客户端负责打印数据的处理。在终端连接初始建立时,需要发送映射本地打印机的请求,服务器接受映射后,客户端应申请相应的虚拟通道以进行打印数据的相关操作。将要打印的数据在网络传输中,是以PRN格式存放的。在用本地映射的打印机进行打印工作时,需要对打印机进行相应的连接,打印数据以PRN的形式从服务器发送到客户端,客户端只要把他们直接输出到打印机端口即可打印。对于打印的数据及其网络协议本身的控制信息需要客户端能够正确的分离、操作。

   本地设备操作说明:设备的每一个任务操作,服务器都会发送请求,当任务操作结束时,需要客户端正确回复确认。对于设备的每一次具体任务,都需要首先创建任务,当得到确定的答复以后才可能继续任务。任务创建后执行具体的内容。设备的功能操作又分读、写和控制;对于每一种功能操作,任务数据分开始、传输中和结束三种。需要顺序传送。每一小段数据传输结束后需要回复确认。当任务结束后,需要回复确认。
  • 12
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值