欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【大学课件】网络安全编程基础.ppt

    • 资源ID:5680657       资源大小:1.68MB        全文页数:64页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【大学课件】网络安全编程基础.ppt

    第1页,第三章 网络安全编程基础,3.1 网络安全编程概述3.2 C语言发展的4个阶段3.3 网络安全编程,http:/,第2页,内容提要,网络安全编程主要涉及的是操作系统编程,在Windows平台下,目前主要采用C/C+语言。本章将介绍Windows操作系统的基本原理以及C语言的四个发展阶段,每一阶段都用典型的案例说明。详细说明在网络安全领域如何使用C/C+语言实现Socket编程、注册表编程、定时器编程、驻留程序编程和多线程编程。,http:/,第3页,网络安全编程概述,从理论上说,任何一门语言可以在任何一个操作系统上编程,C语言可以在Windows下编程,同样也可以在Linux下编程。编程是一项比较综合的工作,除了熟练使用编程工具以外,还要了解系统本身的内部工作机理和编程语言。,http:/,第4页,Windows内部机制,Windows是一个“基于事件的,消息驱动的”操作系统。在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会触发一个相应的“事件”。系统每次检测到一个事件时,就会给程序发送一个“消息”,从而使程序可以处理该事件。每次检测到一个用户事件,程序就对该事件做出响应,处理完以后,再等待下一个事件的发生。,http:/,第5页,八个基本概念,与Windows系统密切相关的八个基本概念分别是:窗口、程序、进程、线程消息、事件、句柄、API与SDK。,http:/,第6页,1、窗口,窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位,但是很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。其实窗口的概念很广,例如按钮和对话框等也是窗口哦,只不过是一种特殊的窗口罢了。,http:/,第7页,2、程序,通常说的程序都是指一个能让计算机识别的文件接触得最多的是以exe或者com作为扩展名的文件。,http:/,第8页,3、进程,进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。一个以exe作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。当关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。,http:/,第9页,4、线程,线程是进程的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。进程本来就具有动态的含义,是通过线程来体现的。,http:/,第10页,5、消息,消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息鼠标被移动会产生WM_MOUSEMOVE消息,鼠标左键被按下会产生WM_LBUTTONDOWN的消息,鼠标右键按下便产生WM_RBUTTONDOWN消息等等。,http:/,第11页,事件 句柄:,6、事件从字面意思就可以明白它的含义,如在程序运行的过程中改变窗口的大小或者移动窗口等,都会触发相应的“事件”,从而调用相关的事件处理函数。7、句柄:单单一个“柄”字便可以解释它的意思了,句柄是一个指针,通过句柄就可以控制该句柄指向的对象。编写程序总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。,http:/,第12页,8、API与SDK,API是英文Application Programming Interface 的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口。在编程的时候可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了。SDK是英文Software Development Kit的缩写,意思是“软件开发工具包”,微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等等。,http:/,第13页,学习Windows下编程,学习语言,选择语言和工具是第一步,而且是非常重要的一步工作,目前的编程语言那么多,有C、C+、C#、Java和汇编语言等等。虽然有很多语言,只要精通一门就够了。从实用的角度来讲,C/C+是最好的选择,而微软公司的Visual C+和Insprise公司(原Borland公司)的C+Builder是其相应开发工具的两大主流。,http:/,第14页,开发工具,在开发工具上,选择比较流行的VC+6.0,而且最好是英文版本,主界面如图3-2所示。,http:/,第15页,学习编程需要经历三大步,学习编程需要经历三大步:一、读程序;二、写程序;三、积累功能代码段。1、读程序在没有阅读过一份完整的源代码之前,别指望能写出有多好的程序!读程序必须具备一定的语言基础知识,基础知识主要是指语法知识,最起码要能读懂程序的每一行意思。有没有程序的设计思想,在这个时期并不重要,只要具备一定的语法基础就可以了。学一门语言并不需要刻意去记条条框框的语法,看代码的时候,遇到了不明白的地方再去查相关的资料,补充基础知识再配合源程序的思路,这时的理解才是最深刻的。2、写程序刚开始写程序,不要奢望一下子写出很出色的程序来,“万丈高楼平底起”,编程贵在动手,只要动手去写就可以了。此外,还要依照自身的能力循序渐进地写,开始的时候写一点功能简单的、篇幅短小的代码,力求简洁、完整,然后在此基础上进行扩充,一点点的添加功能。3、积累功能代码积累非常的重要,将平时自己写的和自己已经读通的程序分类保存起来,建一个属于自己的代码库,需要相关功能的时候,就到代码库中找相关的代码。这样既提高编码的效率又提高了正确率。,http:/,第16页,选择编程工具,目前流行两大语法体系:Basic语系和C语系。同一个语系下语言的基本语法是一样。两大语系如图3-3所示。C语系中,目前两大语言如日中天:C+和Java。C+适宜做系统软件的开发、Java更适宜做网络应用开发。虽然VC+.NET已经面世很久了,但是C+的开发工具目前主流依然是VC+6.0和C+Builder6.0。Java流行的开发工具比较多,比如:IBM公司的Visual Age和Websphere Studio,Insprise公司JBuilder等等。,http:/,第17页,VC+6.0,VC+是基于C/C+的集成开发工具,目前最常用的版本是VC+6.0。VC+有一套集成开发工具,其中包括各种编辑器、编译工具、集成调试器等等。在编写程序的过程中,各种操作都可以通过单击相应的菜单完成。,http:/,第18页,新建的是一个控制台程序,可以看到许多工程类型,这里新建的是一个控制台程序,选择“Win32 Console Application”,选择工程存放的路径,然后输入工程名“proj3_1”,然后点击按钮“OK”。出现的界面如图3-5所示。在图3-5的界面下选择创建工程的模板,选择空模板“An empty project”,点击按钮“Finish”,出现工程总结窗口,如图3-6所示。,http:/,第19页,编程工具的使用,案例名称:编程工具的使用程序名称:proj3_1.cpp#include void main()cout Hello C+endl;,http:/,第20页,编程工具的使用,程序proj3_1.cpp代码包括三行第一行:“#include”意思是引入C+的基本输入输出函数库,在C语言中引入的是“stdio.h”库。在iostream.h文件中定义了cout的功能是输出,endl的功能是回车换行。第二行:“void main()”,main()函数是C/C+的主函数,void表示该函数没有返回值。第四行:“cout Hello C+endl;”,“cout”功能是向屏幕输出。,http:/,第21页,C语言发展的四个阶段,C语言经过不断的发展,在编程体系中可以将其分成四个阶段。1、面向过程的C语言。2、面向对象的C+语言。3、SDK编程。4、MFC编程(Microsoft Foundation Class:微软基类库)。,http:/,第22页,面向过程的C语言,C语言功能非常强大,Linux/Unix操作系统就是用C语言写的,C语言直接调用操作系统提供的API函数可以编写非常前大的程序。C和C+的最主要区别是:C语言中没有类的概念,C+在C的语法基础上引入了类(Class),所以C+和C的语法是基本相同的。面向过程编程,最基本的程序用C语言编写如proj3_2.cpp所示。案例名称:使用C语言编程程序名称:proj3_2.cpp#include main()printf(Hello DOSn);,http:/,第23页,案例3-1 读取命令行参数,main函数是程序的主函数,程序执行的时候先从main函数开始。该函数可以带参数,第一个参数是int型的,第二个参数是字符指针,具体使用方法如proj3_3.cpp所示。案例名称:读取命令行参数程序名称:proj3_3.cpp#include int main(int argc,char*argv)int i;for(i=1;i argc;i+)printf(%sn,argvi);return 0;,http:/,第24页,面向对象的C+语言,面向对象程序设计语言可以将一些变量和函数封装到类(Class)中,当变量被类封装后,称之为属性或者数据成员,当函数被类封装后,称之为方法或者成员函数。定义好的一个类,然后定义一个类的实例,这个实例就叫做对象,在C+中可以用类定义对象,使用方法如程序proj3_4.cpp所示。,http:/,第25页,在C+中使用类,案例名称:在C+中使用类程序名称:proj3_4.cpp#include class personpublic:int heart;char*name;int run()/定义成员函数run()heart=heart+20;return heart;,http:/,第26页,void main()int iRunStop;person ZhangSan;ZhangSan.name=张三;ZhangSan.heart=72;cout姓名:ZhangSan.name endl;cout跑步前心跳ZhangSan.heartendl;/run()为对象的方法iRunStop=ZhangSan.run();cout跑步后心跳iRunStopendl;,http:/,第27页,SDK编程,C库提供了许多函数,可以直接拿来使用。比如利用C库提供的DeleteFile函数来删除一个文件,如程序proj3_6.cpp所示。案例名称:调用C库函数程序名称:proj3_6.cpp#include#include int main()DeleteFile(C:test.txt);printf(删除成功n);return 0;,http:/,第28页,编写窗口应用程序,案例名称:编写对话框程序名称:proj3_7.cpp#include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)MessageBox(NULL,TEXT(Hello,Windows!),TEXT(HelloMsg),MB_OK);return 0;,http:/,第29页,编写窗口应用程序,参数一:hInstance 是当前实例的句柄。句柄是windows编程极其重要的概念。它是一个整数,用于标识程序、窗口和资源等。在这里hInstance表示应用程序本身。参数二:hPrevInstance总是为NULL,在Windows早期版本中,当多次同时运行同一个程序时,系统会创建该程序的多个“实例”,同一程序的所有实例共享代码和内存。程序需要检查hPrevInstance来判断自身的其他实例是否正在运行,以便从已经存在的实例中获取数据。在32位版本中,统一程序运行方式改变了,不在需要了!参数三:lpCmdLine是运行程序的命令行。用户可以单击”开始”菜单中的”运行“选项,然后输入命令来运行一个程序,并且可以指定运行程序所需的参数,这里的命令由lpCmdLine传入。参数四:nCmdShow用于指定程序窗口最初的显示模式,可以正常显示,也可以在初始化就最大化或者最小化。,http:/,第30页,利用SDK函数创建窗口,#include WNDCLASS wc;HWND h_wnd;MSG msg;/*消息处理函数wndProc的声明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain 函数的声明*/int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show)/*初始化wndclass结构变量*/wc.lpfnWndProc=WindowProc;wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;,http:/,第31页,/*注册WndClass结构变量*/RegisterClass(,http:/,第32页,MFC编程,SDK的功能非常强大,需要记很多的函数,当面向对象编程成为主流的时候,微软将SDK的函数分类进行封装,这样就诞生了MFC(Microsoft Foundation Class)。MFC程序的最基本的程序骨架如proj3_9.cpp所示。,http:/,第33页,MFC编程,#includeclass sample:public CFrameWndpublic:sample()/构造函数Create(NULL,My Window);MessageBox(My Window,CFrame constructor);class App:public CWinApppublic:BOOL InitInstance();BOOL ExitInstance();,http:/,第34页,/InitInstance函数的定义/BOOL App:InitInstance()MessageBox(0,My Window,InitInstance,MB_OK|MB_ICONASTERISK);sample*obj;obj=new sample;m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);return TRUE;/ExitInstance函数定义BOOL App:ExitInstance()MessageBox(0,My Window,ExitInstance,MB_OK|MB_ICONHAND);return TRUE;/创建应用程序对象App appobject;,http:/,第35页,网络安全编程,网络安全基础编程技术主要包括6个方面:Socket编程注册表编程文件系统编程定时器编程驻留程序编程多线程编程。,http:/,第36页,Socket编程,谈网络安全编程离开网络编程就会大失其味,凡是基于网络应用的程序都离不开Socket。Socket的意思是套接字,是计算机与计算机之间通信的接口。使用Winsock提供的API函数是最基本的网络编程技术,程序proj3_11.cpp利用Socket获得本机的IP地址和机器名。,http:/,第37页,Socket编程,案例名称:使用Socket得到IP地址程序名称:proj3_11.cpp#include#include void CheckIP(void)/CheckIP函数,用于获取本机IP地址WORD wVersionRequested;/WORD类型变量,用于存放Winsock版本的值WSADATA wsaData;char name255;/用于存放主机名PHOSTENT hostinfo;wVersionRequested=MAKEWORD(2,0);/调用MAKEWORD()函数获得Winsock的版本,用于加载Winsock库int main()CheckIP();/调用CheckIP()函数获得并输出IP地址return 0;,http:/,第38页,if(WSAStartup(wVersionRequested,/卸载Winsock库,并释放所有资源,http:/,第39页,注册表编程,注册表在计算机中由键名和键值组成,注册表中存储了Window操作系统的所有配置。黑客90%以上对Windows的攻击手段都离不开读写注册表。在运行窗口中输入“regedit”命令可以进入注册表,注册表的界面如图3-37所示。,http:/,第40页,注册表编程,注册表的句柄可以由调用RegOpenKeyEx()和RegCreateKeyEx()函数得到的,通过函数RegQueryValueEx()可以查询注册表某一项的值通过函数RegSetValueEx()可以设置注册表某一项的值。RegCreateKeyEx()函数和RegSetValueEx()函数的使用方法如程序proj3_12.cpp所示。,http:/,第41页,操作注册表,#include#include main()HKEY hKey1;DWORD dwDisposition;LONG lRetCode;/创建lRetCode=RegCreateKeyEx(HKEY_LOCAL_MACHINE,SOFTWAREMicrosoftWindows NTCurrentVersionIniFileMappingWebSecurity,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,http:/,第42页,/设置第一个键值lRetCode=RegSetValueEx(hKey1,Hack_Name,0,REG_SZ,(byte*)sixage,100);/设置第二个键值lRetCode=RegSetValueEx(hKey1,Hack_Hobby,0,REG_SZ,(byte*)Running,100);/如果创建失败,显示出错信息 if(lRetCode!=ERROR_SUCCESS)printf(Error in setting Section1 valuen);return(0);printf(注册表编写成功!n);return(0);,http:/,第43页,判断是否中了“冰河”,中了“冰河”的计算机注册表都将被修改了,修改了扩展名为txt的文件的打开方式,在注册表中txt文件的打开方式定义在HKEY_CLASSES_ROOT主键下的“txtfileshellopencommand”中,如图3-40所示。,http:/,第44页,案例3-6 更改登录用户名,当用户登录系统以后,注册表中就会自动记下用户名,下次登录时再把登录名显示出来,如图3-42所示。,http:/,第45页,案例3-6 更改登录用户名,当非法入侵计算机以后,同样会留下非法登录的用户名,所以需要将用户名修改会原来的值。该用户名记录在注册表的HKEY_LOCAL_MACHINE主键下的SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon子键中,键的名称是:DefaultUserName,如图3-43所示。,http:/,第46页,更改系统登录用户,案例名称:更改系统登录用户程序名称:proj3_14.cpp#include#include main()HKEY hKey1;LONG lRetCode;lRetCode=RegOpenKeyEx(HKEY_LOCAL_MACHINE,SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon,0,KEY_WRITE,http:/,第47页,lRetCode=RegSetValueEx(hKey1,DefaultUserName,0,REG_SZ,(byte*)Hacker_sixage,20);if(lRetCode!=ERROR_SUCCESS)printf(Error in setting Section1 valuen);return(0);printf(已经将登录名该成Hacker_sixage);return(0);,http:/,第48页,文件系统编程,文件系统编程非常的重要,可以在DOS命令行下执行的操作都可以使用程序实现。在DOS命令行下使用命令“net user Hacker/add”添加一个用户,同样可以在程序中实现,如程序proj3_15.cpp所示。案例名称:添加系统用户程序名称:proj3_15.cpp,http:/,第49页,#include#include main()char*szCMD=net user Hacker/add;BOOL bSuccess;PROCESS_INFORMATION piProcInfo;STARTUPINFO Info;Info.cb=sizeof(STARTUPINFO);Info.lpReserved=NULL;Info.lpDesktop=NULL;Info.lpTitle=NULL;Info.cbReserved2=0;Info.lpReserved2=NULL;bSuccess=CreateProcess(NULL,szCMD,NULL,NULL,false,NULL,NULL,NULL,http:/,第50页,文件拷贝和移动,案例名称:文件拷贝和移动程序名称:proj3_16.cpp#include#include main()CopyFile(C:File1.txt,C:File2.txt,TRUE);MoveFile(C:File1.txt,C:File3.txt);return 1;,http:/,第51页,系统时间,案例名称:系统时间程序名称:proj3_17.cpp#include#include main()SYSTEMTIME sysTime;GetLocalTime(,http:/,第52页,定时器编程,著名的“CIH病毒”每年定时发作,其中需要利用定时器来控制程序的执行。定时器程序分成两大类,一类是循环执行另一类是根据条件只执行一次。在程序中加载定时器,如程序proj3_18所示。,http:/,第53页,定时器编程,案例名称:定时器编程程序名称:proj3_18.cpp#include WNDCLASS wc;HWND h_wnd;MSG msg;/*消息处理函数wndProc的声明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain 函数的声明*/int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR,http:/,第54页,p_CmdLine,int m_Show)/*初始化wndclass结构变量*/wc.lpfnWndProc=WindowProc;wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;/*注册WndClass结构变量*/RegisterClass(#define ID_TIMER 1,http:/,第55页,定时器编程,/*定义消息处理函数*/long WINAPI WindowProc(HWND h_wnd,UINT WinMsg,WPARAM w_param,LPARAM l_param)static BOOL fFlipFlop=FALSE;HBRUSH hBrush;HDC hdc;PAINTSTRUCT ps;RECT rc;switch(WinMsg)case WM_CREATE:SetTimer(h_wnd,ID_TIMER,1000,NULL);return 0;case WM_TIMER:MessageBeep(-1);fFlipFlop=!fFlipFlop;InvalidateRect(h_wnd,NULL,FALSE);return 0;,http:/,第56页,case WM_PAINT:hdc=BeginPaint(h_wnd,http:/,第57页,案例3-7“冰河”原型,第一种方法实现起来比较简单,注册表的自启动项的键值在“HKEY_LOCAL_MACHINE”主键下的“SOFTWAREMicrosoftWindowsCurrentVersion Run”子键中,如图3-51所示。,http:/,第58页,多线程编程,用多线程技术编程有两大优点:1、提高CPU的利用率。由于多线程并发运行,用户在做一件事情的时候还可以做另外一件事。特别是在多个CPU的情况下,更可以充分地利用硬件资源的优势,将一个大任务分成几个任务,由不同的CPU来合作完成。2、采用多线程技术,可以设置每个线程的优先级,调整工作的进度。在实际开发过程中,一定要有一个主进程,其他线程可以共享该进程也可以独立运行,每个线程占用CPU的时间有限制,可以设置运行优先级别。,http:/,第59页,独立线程程序的编写,案例名称:独立线程程序的编写程序名称:proj3_21.cpp#include#include#include int addem(int);int main(int argc,char*argv)_beginthread(void(*)(void*)addem,0,(void*)10);_beginthread(void(*)(void*)addem,0,(void*)11);addem(12);return 0;,http:/,第60页,int addem(int count)inti;long sum;sum=0;for(i=0;i=count;+i)printf(The value of%d is%dn,count,i);sum+=i;printf(The sum is%dn,sum);return 0;,http:/,第61页,多个线程共享参数,案例名称:多个线程共享参数程序名称:proj3_22.cpp#include#include#include int addem(int);int x;/全局变量int main(int argc,char*argv)x=0;_beginthread(void(*)(void*)addem,0,(void*)1);_beginthread(void(*)(void*)addem,0,(void*)2);addem(3);return 0;,http:/,第62页,int addem(int index)while(x=50)x=x+1;printf(%d:%dn,index,x);return 0;,http:/,第63页,本章总结,本章需要重点掌握Windows操作系统的内部机制,理解C语言四个阶段编程的特点。重点掌握网络安全编程领域的Socket编程、注册表编程、驻留程序的编程和多线程编程。,http:/,第64页,本章习题,【1】、简述Windows操作系统的内部机制。【2】、简述学习Windows下编程的注意点。【3】、比较C语言四个发展阶段编程的特点。【4】、用程序说明MFC的事件处理机制。【5】、编写程序实现功能:清除“冰河”程序和文本文件的关联。(上机完成)【6】、编写程序实现功能:在每天夜里十二点,自动删除C盘下的File4.txt文件。(上机完成)【7】、编写程序实现功能:当登录系统以后,自动执行一个程序,该程序将系统登录名改成Administrator。(上机完成)【8】、编写程序实现功能:当用户用鼠标双击一个文本文件的时候,自动删除该文件。(上机完成),http:/,

    注意事项

    本文(【大学课件】网络安全编程基础.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开