基于Java的局域网监听软件设计开发

引言

1.1 课题背景

网络监听,在网络安全上一直是一个比较敏感的话题,作为一种发展比较成熟的技术,网络监听在协助网络管理员监测网络传输数据,排除网络故障等方面具有不可替代的作用,因而一直倍受网络管理员的青睐。然而,在另一方面网络监听也给以太网安全带来了极大的隐患,许多的网络入侵往往都伴随着以太网内网络监听行为,从而造成口令失窃,敏感数据被截获等等连锁性安全事件。

随着互联网技术的迅猛发展,网络给人们带来了很多便利,但是网络在给人们带来许多便利的同时,也给人们带来了最担忧的网络安全问题。保证网络及应用系统的安全也成了人们最为关心的问题。

网络监听技术就是提供给网络安全管理人员进行管理的工具,可以用来监视网络的状态、数据流动情况以及网络上传输的信息,以获取有用的信息。作为黑客来说,通过网络监听可以获取其所需的信息(比如密码等);对黑客活动和其他网络犯罪进行侦察、取证时,可以使用网络监听技术来获取必要的信息。因此,在目前研究和使用网络监听技术及相关工具,对于防护网络安全、打击网络犯罪具有重要的现实意义。

1.2 本课题研究的意义

我国的网络正在快速发展中,相应的问题也就显现出来,网络管理及相应的应用自然将越发重要,而监听技术正是网络管理和应用的基础,其意义当然重要,放眼当前相关工具,Linux 有snort tcpdump ,snift 等,window 有nexray, sniffer等无一不是国外软件,随着中国网络的发展,网络监听系统必将大有用武之地,因此监听技术的研究已是时事的要求。

中国入世,各种针对盗版的打击力度和对于正版软件的保护力度都将大大加强,windows的盗版软件随处可见的现象将会一去不返,面对这样的情况,大部分的公司只有两种选择:要么花大价钱向微软购买正版软件,要么是用开元操作系统Linux,特别是重要部门,如国家机关,政府部门,难道要把自己的办公系统操纵在国外大公司手里?北京的政府办公系统已经转用红旗Linux,而且Linux的界面也在不但的改进,更加友好,易操作,有理由相信Linux将在我国大有作为,这也是研究Linux下网络监听的原因。

1.3 本课题的研究方法

本毕业设计的目的主要是为了检查对以前所学知识(包括以前所学的一些关于网络技术、编程技术、网络与信息安全等知识)综合运用的能力,设计开发一个局域网监听软件。

在本系统的开发使用Eclipse 3.2开发工具,利用Java语言来编写一个具备数据包统计和分析功能的局域网监听软件。

由于核心Java API不能访问底层的网络数据,因此在使用Java编写网络监听程序时就必须借助一些工具。本设计借助Winpcap和Jpcap这两个工具来对网络底层进行访问,帮助实现网络监听程序。

1.4 本论文主要工作

本文主要介绍局域网监听软件设计与开发。在进行设计之前,必需了解一些必要的相关知识,所以本文先从基础知识开始介绍,然后一步一步地深入,最后开发出具有一定功能的网络监听软件。

本文的第二章对网络监听软件的设计有一个全面的需求分析,在写需求分析的时候,主要是对本软件的实现目标、运行环境和功能做一个具体的规划,其次对本软件的发展方向也做了一定的要求。

在第三章中,首先对网络监听的原理进行简单的介绍,了解到在网络中的数据是怎样的进行传输的、每一层的协议的作用等等。然后再就本次开发所必需的辅助工具(Winpcap和Jpcap)和它们在局域网监听软件中所起的作用,以及它们的使用方法做了一定的介绍。

具备了一定的基础知识后,在第四章中对局域网监听软件的设计做了一个整体的规划,对本次设计的进程有了一个初步的框架,然后再综合所学知识进行具体的设计。

在第五章中,开始介绍具体的设计步骤,首先将编写三个不同的包,每一个包完成的功能有所不同,但又互相联系,然后再编写主类和一些能将每个包,每个类联系起来的类,让其实现预期的效果,最终完成初步的设计。

第六章的主要工作是介绍如何测试所编写的程序是否能正常运行,确保所设计的程序能完成相关的功能,不断的对软件进行完善。测试完毕后,将所有代码进行封装打包,完成本次设计。

在本文的最后一章,主要介绍的是如何使用该软件,附带一些软件运行时的图片,对用户做一个具体的介绍。

2 需求分析

2.1 需求分析概述

需求分析是指理解用户需求,就软件功能与客户达成一致,估计软件风险和评估项目代价,最终形成开发计划的一个复杂过程。从广义上理解:需求分析包括需求的获取、分析、规格说明、变更、验证、管理的一系列需求工程。图1为需求分析的具体步骤。

图1 需求分析步骤

需求分析之所以重要,就因为它具有决策性,方向性,策略性的作用,在软件开发的过程中具有举足轻重的地位。在一个大型软件系统的开发中,他的作用要远远大于程序设计

2.2本软件的需求分析

2.2.1 本软件实现的目标

虽然计算机网络给人们带来了巨大的便利,但互联网是一个面向大众的开放系统,对信息的保密和系统的安全考虑得并不完备,存在着安全隐患,网络的安全形势日趋严峻。

因此,在Internet安全隐患中扮演重要角色之一的网络监听软件受到越来越大的关注,大多数的黑客为了探测内部网上的主机并取得控制权,甚至有些黑客为了控制整个网络,从而安装特洛伊木马和后门程序,并清除记录。他们经常使用的手段是安装网络监听软件。

在黑客和违法人员进行一些非法的操作(例如,盗取用户的密码和相关信息等)时,执法人员也可以利用同样的方法对其进行侦察和取证,并对其进行相关的处置,达到保护用户的重要资料和维护用户的个人利益,并保证网络的正常运行和预防一些违法操作。

本软件的设计就是为了达到基本的维护网络安全的作用,对网络上传输的数据进行捕获,然后从中得到有用的信息,以此来判断是否是恶意的信息,并对其进行过滤等相关操作,起到保护网络安全的作用。

2.2.2 本软件的运行环境要求

在编写本软件前,作者首先确定了所使用的语言——Java,并在开发工具Eclipse 3.2下进行开发,所以首先应该配置好Java的运行环境(安装j2sdk1.4.0或jre1.4.0以上版本),并在命令提示符检查是否正确配置好Java的运行环境(输入java或javac)。

由于Java API语言不能访问底层的网络数据,所以使用一些工具(如Winpcap和Jpcap)来帮助实现对底层网络数据的访问。在此,本软件必须首先安装Winpcap,然后在jre中配置好Jpcap的环境,值得注意的是,以上两个工具都是开元的,所以在很多地方可以查询到它们的使用方式。

2.2.3 本软件的功能要求

对于这个程序,开发人员希望它达到以下几个功能:

(1)能够截取本网段中传输的数据包;

(2)运用不同TCP/IP体系层次的协议解析类,将数据包逐步分解;

(3)将分析结果显示出来(协议字段、数据内容等);

(4)对截获的数据包的数量和大小进行统计(饼状图等);

(5)对指定的IP地址进行单独监听;

(6)可以进行界面选择。

2.2.4 本软件功能的扩充

完成了以上功能,只是初步达到了现有阶段的要求,在以后的操作中,可能会遇到许多更为复杂的问题,为此,在设计软件的同时,也应该根据系统的性能来分析将来很可能会提出来的要求,这样做的目的是在设计过程中对系统将来可能的扩充和修改预做准备,以便一旦需要时能比较容易地进行一些扩充和修改。

本软件虽然能够捕获到本网段的数据,并可以对捕获的数据进行简单的分析,还可以进行指定对象的监听和将结果显示出来等功能,但在实际的运用中,用户肯定会遇到更多的问题,以下是对本软件的扩充性能的一些初步预计:

(1)自动获取本机和网关的IP和MAC地址;

(2)监视所有主机的收发邮件记录收发邮件的Email地址、日期、主题等;

(3)对捕获到的数据进一步分析,得到非法数据;

(4)可以对局域网内的计算机进行一些简单的操作。

3 理论基础与相关工具介绍

3.1 网络监听原理介绍

Ethernet协议(以太网协议)的工作方式是将要发送的数据包发往连接在一起的所有主机。在包头中包括有应该接收数据包的主机的正确地址,因为只有与数据包中目标地址一致的那台主机才能接收到数据包,但是当主机工作在监听模式下,不管数据包中的目标物理地址是什么,主机都将可以接收到。

数据包并不能在协议栈的高层直接发送出去,要发送的数据包必须从TCP/IP协议的IP层交给网络接口,也就是所说的数据链路层。网络接口不会识别IP地址的。因此,在网络接口由IP层传输过来的带有IP地址的数据包将增加了一部分以太帧的帧头的信息。在帧头中,有两个域分别为只有网络接口才能识别的源主机和目的主机的物理地址,这是一个48位的地址,这个48位的地址是与IP地址相对应的,换句话说就是一个IP地址也会对应一个物理地址。

传输数据时,包含物理地址的帧从网络接口(网卡)发送到物理的线路上,如果局域网是由一条粗缆或细缆连接而成,则数字信号在电缆上传输,能够到达线路上的每一台主机。当使用集线器时,由集线器再发向连接在集线器上的每一条线路,数字信号也能到达连接在集线器上的每一台主机。当数字信号到达一台主机的网络接口时,正常情况下,网络接口读入数据帧,进行检查,如果数据帧中携带的物理地址是自己的或者是广播地址,则将数据帧交给上层协议软件,也就是IP层软件,否则就将这个帧丢弃。对于每一个到达网络接口的数据帧,都要进行这个过程。 

当连接在同一条电缆或集线器上的主机被逻辑地分为几个子网的时候,那么要是有一台主机处于监听模式,它还将可以接收到发向与自己不在同一个子网(使用了不同的掩码、IP地址和网关)的主机的数据包,在同一个物理信道上传输的所有信息都可以被接收到。  

以太网上的数据帧主要涉及TCP/IP协议,针对以下几个协议的分析:IP,ARP,RARP,IPX,其中重点在于IP和 ARP协议,这两个协议是多数网络协议的基础。

在本软件的监听过程中,将监听到的数据包利用工具和所编写的方法进行逐层分析,并解析出每一层、每一协议、每一字段的数据,从中得到自己想要的信息,最后将其显示出来,并进行动态的更新。

3.2 TCP/IP的层次结构

3.2.1 OSI 与 TCP/IP体系结构的比较

OSI(Open System Interconnect)是开放式系统互联,为了解决不同体系结构的网络的互联问题,国际标准化组织ISO于1981年制定了开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM)。OSI把网络通信的工作分为7层,它们由低到高分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presen tation Layer)和应用层(Application Layer)。每层完成一定的功能,每层都直接为其上层提供服务,并且所有层次都互相支持。

TCP/IP协议(Transmission Control Protocol/Internet Protocol)是传输控制/网际协议,这个协议是Internet国际互联网络的基础。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:

(1)应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等;

(2)传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收;

(3)互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP);

(4)网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

TCP/IP各层的描述如表1所示。

表1 TCP/IP各层描述

TCP/IP的描述

主要协议

主要功能

应用层

Http、Telnet、FTP和e-mail等

负责把数据传输到传输层或接收从传输层返回的数据

传输层

TCP和UDP

主要为两台主机上的应用程序提供端到端的通信,TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。UDP则为应用层提供一种简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据能到达另一端。

网络层

ICMP、IP和IGMP

有时称作互联网层,主要为数据包选择路由,其中IP是TCP/IP协议族中最核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输

链路层

ARP、RARP和设备驱动程序及接口卡

发送时将IP包作为帧发送;接收时把接收到的位组装成帧;提供链路管理;错误检测等

OSI模型与TCP/IP协议的区别如下:

(1)TCP/IP一开始就考虑到多种异构网的互联问题,并将网际协议IP作为TCP/IP的重要组成部分。但ISO和CCITT最初只考虑到全世界都使用一种统一的标准公用数据网将各种不同的系统互连在一起。后来,ISO认识到了网际协议IP的重要性,然而已经来不及了,只好在网络层中划分出一个子层来完成类似TCP/IP中的IP的作用;

(2)TCP/IP一开始就对面向连接服务和无连接服务并重,而OSI在开始只强调面向连接这一种服务。一直到很晚OSI才开始制定另一种无连接服务的有关标准;

(3)TCP/IP较早就有较好的网络管理功能,而OSI到后来才开始考虑这个问题。

OSI 与 TCP/IP体系结构的比较如图2所示。

图2  OSI 与 TCP/IP体系结构的对比

3.2.2 TCP/IP 四层协议的表示方法举例

图3  TCP/IP 四层协议的表示方法举例

在许多文献中,也常见到TCP/IP的四层协议的表示方法。例如,在讨论两个主机通过两个网络用路由器连在一起时,可以使用如图3所示的层次关系。图3中的逻辑链路控制和物理层都简化为网络接口层。实际上,现在插在主机中的网络接口板上的硬件和软件就是实现了数据链路层和物理层这两层的功能。应当注意的是,在网络互连中起重要作用的路由器则没有应用层和运输层,其数据链路层和物理层也是在网络接口板上实现的。

3.2.3 使用TCP/IP进行通信的示意图

在TCP/IP的应用层协议使用的是客户-服务器方式。客户(Client)和服务器(Server)都是指通信中所涉及的两个应用进程。客户-服务器方式所描述的是进程之间服务和被服务的关系。当A进程需要B进程的服务时就主动呼叫B进程,在这种情况下,A是客户而B是服务器。这里最重要的特征就是:客户是服务请求方,服务器是服务提供方。

客户与服务器的通信关系一旦建立,通信就可是双向的,客户和服务器都可以发送和接收信息,如图4所示。

图4  客户进程和服务器进程使用TCP/IP协议进行通信

3.3 Winpcap简介

Winpcap(windows packet capture)是Windows平台下一个免费,公共的网络访问系统。开发Winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:

(1)捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;

(2)在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;

(3)在网络上发送原始的数据报;

(4)收集网络通信过程中的统计信息。

Winpcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据报。也就是说,Winpcap不能阻塞、过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于服务质量QoS调度程序或个人防火墙。目前,Winpcap开发的主要对象是Windows NT/2000/XP,这主要是因为在使用Winpcap的用户中只有一小部分使用Windows 95/98/Me,并且微软也已经放弃了对win9x的开发。其实Winpcap中的面向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使用Unicode编码。

Winpcap提供给用户两个不同级别的编程接口:一个基于libpcap的wpcap.dll,另一个是较底层的packet.dll。对于一般的要与UNIX平台上libpcap兼容的开发来说,使用wpcap.dll是当然的选择。下面几个库是与lipcap相关的:libnet1.0.2——数据包的发送构造过程;libnids——实现了ids的一些框架;libicmp——icmp数据包处理。

操作系统拦截数据包的技术有很多,现在很多文章都是介绍编写IM DRIVER阿在NDIS中间层对MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截。这是微软提供的一种技术但编写该过滤程序拦截程序非常地复杂,安装也很麻烦。

现在简单的介绍基于NDIS包拦截技术。NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,并调用NDIS API函数NdisRegisterProtocol进行注册。现在来关注一下NDIS_PROTOCOL_CHARACTERISTICS这张表,这张表中存有所有协议驱动程序与底层的派发函数的入口。如BindAdapterHandler,SendHandler, ReceiveHandler等,当网卡有数据包进入时,会通过表中ReceiveHandle或ReceivePacketHandler通知协议驱动程序有一个该协议的数据包进入,反之协议驱动程序是通过Send Handler或SendPacketsHandler函数向网卡驱动发送数据包到网络上去的。虽然在程序中是调用NdisSend或NdisSendPackets函数发送,但是通过查看NDIS.H的头文件里对这两个函数的定义就知道了,它们都是一个宏定义,实际还是通过这表中Send Handler或SendPacketsHandler发送的。现在要做的事情应该很清楚了,只要能够将每一个协议程序所填写的NDIS_PROTOCOL_CHARACTERISTICS表里的派发函数指向自己的函数,就能成功的对数据包进行拦截。

Winpcap也是用NDIS(Windows的通信协议程序(比如TCP/IP)和网络设备驱动器之间通信的规范)的,将自己注册为一个协议处理驱动。Winpcap的使用非常方便,但是它有一个致命的缺陷就是只适用于共享式以太网络,对于交换式网络下的数据则无能为力。经过测试,在使用交换机连接的局域网下,Winpcap只能监听到本网段内的数据,而对于来自其他网段的数据则无法监听,除非你把probe接到交换机之前或者接到交换机的console口上,不过那样的弊端是显而易见的,所以,Winpcap的应用还是有局限性的。

3.4 Jpcap简介

由于核心Java API不能直接访问网络底层,因此需要借助一种工具来为Java和网络底层提供一个桥梁。Jpcap就是一种提供在Windows或UNIX系统上进行网络底层访问的Java API。Jpcap不是一种纯粹的Java解决方案,它依赖本地库的使用。在Windows 或 UNIX上,用户必须有必要的第三方库,分别是WinPcap或libpcap。

Jpcap的工作原理是使用一个事件模型让你对数据包进行处理。首先必须创建一个执行接口jpcap.JpcapHandler的类:

public class JpcapTip implements JpcapHandler {

    public void handlePacket(Packet packet){

        System.out.println(packet);

    }

 }

为了捕获包,用户需要告诉Jpcap想用哪个网络设备来监听。API提供了jpcap.Jpcap. getDeviceList()方法以满足这一目的。这个方法返回一列字符串,用户可以像如下的方法使用它:

String[] devices = Jpcap.getDeviceList();

一旦用户有了一个设备名称的目录,用户必须选取一个用来监听:

String deviceName = devices[0];

选择一个设备之后,通过Jpcap.openDevice()方法打开它。openDevice()方法需要四个参数:即将打开的设备名,从设备上一次读取的最大字节数,说明是否将设备设为混杂模式(可以接受任意的包)的Boolean值和以后调用processPacket()方法要使用到的超时值。

Jpcapjpcap = Jpcap.openDevice(deviceName, 1028, false, 10000);

openDevice()方法将一个参数返回到用以捕获的Jpcap对象。既然有了Jpcap实例,可以调用processPacket()或loopPacket()开始监听了。这两种方式都带有两个参数:捕获的最大包数可以是−1(说明没有限制);执行JpcapHandler的一个类的实例。

如果调用processPacket(),那么Jpcap将一直捕获包,直到超过openDevice中规定的时限或达到了规定的最大包数;loopPacket()则将一直捕获包,直到达到最大包数,如果没有最大数限制,它将永远运行下去。就像下面这样调用:

jpcap.loopPacket(-1, new JpcapTip());

为了执行可用类,必须确保虚拟机可以找到Jpcap的本地库。在Windows上,如果jpcap.dll在库地址目录中,Java命令如下:

java -Djava.library.path=lib -cp lib\jpcap.jar;. JpcapTip

运用Jpcap将会使开发人员在利用Java开发网络程序的时候,不必过多关注与底层网络的接口复杂的连接细节,而注重在对Jpcap简单而强大接口的使用以及程序界面和功能。

4 设计思路

4.1 设计框架图

经过对Winpcap和Jpcap的了解,知道了如何截获数据包并进行处理,现在就要编写代码,将这些步骤嵌入到一个框架中,将数据包的处理结果显示出来,根据本软件所要实现的功能,本设计所需要实现的类结构如图5所示。

图5 类结构

4.2 设计步骤

4.2.1 整体规划

现在对程序进行如下设计:

(1)使用Eclipse 3.2开发的基于J2SE Swing的图形用户界面程序;

(2)允许多个窗口同时运行,因此用向量来存储已创建的窗口。为了使各个窗口间的监听不相互干扰,因此为每一个监听过程都开辟一个新的线程,在线程中完成从截获数据包到分析数据包到最后将结果显示出来的全部过程。

(3)将所有截获的数据包用向量存储,当然定义了数量上限。预计监听结果的显示如下:使用JTable组件显示每条分析完后的数据包,并进行动态更的新;若选中表格中的某一条记录时,则在JTree组件中将它所具有的全部协议显示出来,父结点为协议名,子结点为协议字段名,叶子结点为字段取值,同时将数据包的内容转换为字符串显示在JTextArea组件中。

4.2.2 程序运行流程

(1)程序的开始

程序主类为JSniffer,整个程序由此类中的main()函数进入,进行初始化,出现主界面,即JDFrame类的实例,然后等待主界面中的事件响应。

(2)准备监听

当主界面中执行开始监听事件时,创建JDCaptor类实例,这个类实际上就是数据包截获器。JDCaptor类首先调用JDCaptureDialog类,这是一个选择设备对话框,在JDCaptureDialog中使用Jpcap.getDeviceList()和Jpcap.getDeviceDescription()获取设备,根据界面选择设备,然后使用openDevice函数打开设备,返回Jpcap对象给调用它的JDCaptor实体。

(3)截获数据包

JDCaptor类开启一条线程,用来进行截获数据包处理。在此线程中使用刚才得到的Jpcap对象的processPacket()函数截获数据包。

(4)分析数据包

使用Jpcap类的包处理接口JpcapHandler handlePacket()进行截获的数据包的初步处理,每截获一个数据包都放入数据包向量packets中,则packets中存放的就是一次监听过程中所监听到的所有数据包。然后将packets传递给analyzer包中的所有类,即每截获一个数据包,就用所有已经定义的协议进行分析。

(5)分析结果显示

使用JTable控件来显示截获的数据包进过分析后的信息,每分析完一条,显示一条,至于显示哪些信息,由菜单中的“协议查看”下面的选项来决定。当执行选择table中某一行的事件时,用tree控件来显示此数据包对应于各层的协议,并用textarea控件将此数据包的内容转换为字符串完整的显示。

(6)流量统计

使用向量来存储每一个协议的所有的数据包,每分析完一个数据包后,在它所包含的协议的向量中加一。然后绘制每一层协议的饼状图,饼状图动态更新。

(7)数据更新

使用Timer类的start(),setRepeats()来进行动态更新,并通过此类中的事件响应来进行更新时的操作,即提示表格更新。

(8)指定对象监听

指定对象监听就是使用JSourceDialog来得到指定监听的主机的IP地址,监听内容是源IP为指定IP的数据包,如果符合条件则处理,不符合则丢弃。这个过滤处理在分析数据包JpcapHandler handlePacket()中完成。

后续实现步骤就不细说了,有需要的可评论或者私聊,源代码直接公开

  • 34
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值