網(wǎng)絡安全編程基礎_第1頁
網(wǎng)絡安全編程基礎_第2頁
網(wǎng)絡安全編程基礎_第3頁
網(wǎng)絡安全編程基礎_第4頁
網(wǎng)絡安全編程基礎_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第1頁,第三章 網(wǎng)絡安全編程基礎,3.1 網(wǎng)絡安全編程概述 3.2 C語言發(fā)展的4個階段 3.3 網(wǎng)絡安全編程,第2頁,內容提要,網(wǎng)絡安全編程主要涉及的是操作系統(tǒng)編程,在Windows平臺下,目前主要采用C/C+語言。 本章將介紹Windows操作系統(tǒng)的基本原理以及C語言的四個發(fā)展階段,每一階段都用典型的案例說明。 詳細說明在網(wǎng)絡安全領域如何使用C/C+語言實現(xiàn)Socket編程、注冊表編程、定時器編程、駐留程序編程和多線程編程。,第3頁,網(wǎng)絡安全編程概述,從理論上說,任何一門語言可以在任何一個操作系統(tǒng)上編程,C語言可以在Windows下編程,同樣也可以在Linux下編程。 編程是一項比較綜合的

2、工作,除了熟練使用編程工具以外,還要了解系統(tǒng)本身的內部工作機理和編程語言。,第4頁,Windows內部機制,Windows是一個“基于事件的,消息驅動的”操作系統(tǒng)。在Windows下執(zhí)行一個程序,只要用戶進行了影響窗口的動作(如改變窗口大小或移動、單擊鼠標等)該動作就會觸發(fā)一個相應的“事件”。 系統(tǒng)每次檢測到一個事件時,就會給程序發(fā)送一個“消息”,從而使程序可以處理該事件。 每次檢測到一個用戶事件,程序就對該事件做出響應,處理完以后,再等待下一個事件的發(fā)生。,第5頁,八個基本概念,與Windows系統(tǒng)密切相關的八個基本概念分別是: 窗口、程序、進程、線程 消息、事件、句柄、API與SDK。,第

3、6頁,1、窗口,窗口是Windows本身以及Windows 環(huán)境下的應用程序的基本界面單位,但是很多人都誤以為只有具有標題欄、狀態(tài)欄、最大化、最小化按鈕這樣標準的方框才叫窗口。 其實窗口的概念很廣,例如按鈕和對話框等也是窗口哦,只不過是一種特殊的窗口罷了。,第7頁,2、程序,通常說的程序都是指一個能讓計算機識別的文件 接觸得最多的是以exe或者com作為擴展名的文件。,第8頁,3、進程,進程就是應用程序的執(zhí)行實例(或稱一個執(zhí)行程序),進程是程序動態(tài)的描述。 一個以exe作為擴展名的文件,在沒有被執(zhí)行的時候稱之為應用程序,當用鼠標雙擊執(zhí)行以后,就被操作系統(tǒng)作為一個進程執(zhí)行了。 當關機或者在任務欄

4、的圖標上單擊鼠標右鍵選“退出”時,進程便消亡,徹底結束了生命。 進程經歷了由“創(chuàng)建”到“消亡”的生命期,而程序自始至終存在于你的硬盤上,不管計算機是否啟動。,第9頁,4、線程,線程是進程的一個執(zhí)行單元,同一個進程中的各個線程對應于一組CPU指令、一組CPU寄存器以及一個堆棧。 進程本來就具有動態(tài)的含義,是通過線程來體現(xiàn)的。,第10頁,5、消息,消息是應用程序和計算機交互的途徑,在計算機上幾乎做每一個動作都會產生一個消息 鼠標被移動會產生WM_MOUSEMOVE消息,鼠標左鍵被按下會產生WM_LBUTTONDOWN的消息,鼠標右鍵按下便產生WM_RBUTTONDOWN消息等等。,第11頁,事件

5、句柄:,6、事件 從字面意思就可以明白它的含義,如在程序運行的過程中改變窗口的大小或者移動窗口等,都會觸發(fā)相應的“事件”,從而調用相關的事件處理函數(shù)。 7、句柄: 單單一個“柄”字便可以解釋它的意思了,句柄是一個指針,通過句柄就可以控制該句柄指向的對象。編寫程序總是要和各種句柄打交道的,句柄是系統(tǒng)用來標識不同對象類型的工具,如窗口、菜單等,這些東西在系統(tǒng)中被視為不同類型的對象,用不同的句柄將他們區(qū)分開來。,第12頁,8、API與SDK,API是英文Application Programming Interface 的縮寫,意思是“應用程序接口”,泛指系統(tǒng)為應用程序提供的一系列函數(shù)接口。 在編程

6、的時候可以直接調用,而不必知道其內部實現(xiàn)的過程,只知道它的原型和返回值就可以了。 SDK是英文Software Development Kit的縮寫,意思是“軟件開發(fā)工具包”,微軟提供了許多專門的SDK開發(fā)包,比如DirectX開發(fā)包和語音識別開發(fā)包等等。,第13頁,學習Windows下編程,學習語言,選擇語言和工具是第一步,而且是非常重要的一步工作,目前的編程語言那么多,有C、C+、C#、Java和匯編語言等等。 雖然有很多語言,只要精通一門就夠了。從實用的角度來講,C/C+是最好的選擇,而微軟公司的Visual C+和Insprise公司(原Borland公司)的C+ Builder是其相

7、應開發(fā)工具的兩大主流。,第14頁,開發(fā)工具,在開發(fā)工具上,選擇比較流行的VC+6.0,而且最好是英文版本,主界面如圖3-2所示。,第15頁,學習編程需要經歷三大步,學習編程需要經歷三大步:一、讀程序;二、寫程序;三、積累功能代碼段。 1、讀程序 在沒有閱讀過一份完整的源代碼之前,別指望能寫出有多好的程序!讀程序必須具備一定的語言基礎知識,基礎知識主要是指語法知識,最起碼要能讀懂程序的每一行意思。有沒有程序的設計思想,在這個時期并不重要,只要具備一定的語法基礎就可以了。 學一門語言并不需要刻意去記條條框框的語法,看代碼的時候,遇到了不明白的地方再去查相關的資料,補充基礎知識再配合源程序的思路,這

8、時的理解才是最深刻的。 2、寫程序 剛開始寫程序,不要奢望一下子寫出很出色的程序來,“萬丈高樓平底起”,編程貴在動手,只要動手去寫就可以了。此外,還要依照自身的能力循序漸進地寫,開始的時候寫一點功能簡單的、篇幅短小的代碼,力求簡潔、完整,然后在此基礎上進行擴充,一點點的添加功能。 3、積累功能代碼 積累非常的重要,將平時自己寫的和自己已經讀通的程序分類保存起來,建一個屬于自己的代碼庫,需要相關功能的時候,就到代碼庫中找相關的代碼。這樣既提高編碼的效率又提高了正確率。,第16頁,選擇編程工具,目前流行兩大語法體系:Basic語系和C語系。同一個語系下語言的基本語法是一樣。兩大語系如圖3-3所示。

9、 C語系中,目前兩大語言如日中天:C+和Java。C+適宜做系統(tǒng)軟件的開發(fā)、Java更適宜做網(wǎng)絡應用開發(fā)。 雖然VC+.NET已經面世很久了,但是C+的開發(fā)工具目前主流依然是VC+6.0和C+ Builder6.0。 Java流行的開發(fā)工具比較多,比如:IBM公司的Visual Age和Websphere Studio,Insprise公司JBuilder等等。,第17頁,VC+6.0,VC+是基于C/C+的集成開發(fā)工具,目前最常用的版本是VC+6.0。VC+有一套集成開發(fā)工具,其中包括各種編輯器、編譯工具、集成調試器等等。在編寫程序的過程中,各種操作都可以通過單擊相應的菜單完成。,第18頁,

10、新建的是一個控制臺程序,可以看到許多工程類型,這里新建的是一個控制臺程序,選擇“Win32 Console Application”,選擇工程存放的路徑,然后輸入工程名“proj3_1”,然后點擊按鈕“OK”。出現(xiàn)的界面如圖3-5所示。 在圖3-5的界面下選擇創(chuàng)建工程的模板,選擇空模板“An empty project”,點擊按鈕“Finish”,出現(xiàn)工程總結窗口,如圖3-6所示。,第19頁,編程工具的使用,案例名稱:編程工具的使用 程序名稱:proj3_1.cpp #include void main() cout Hello C+endl; ,第20頁,編程工具的使用,程序proj3_1.

11、cpp代碼包括三行 第一行:“#include ”意思是引入C+的基本輸入輸出函數(shù)庫,在C語言中引入的是“stdio.h”庫。在iostream.h文件中定義了cout的功能是輸出,endl的功能是回車換行。 第二行:“void main()”,main()函數(shù)是C/C+的主函數(shù),void表示該函數(shù)沒有返回值。 第四行:“cout Hello C+endl;”,“cout”功能是向屏幕輸出。,第21頁,C語言發(fā)展的四個階段,C語言經過不斷的發(fā)展,在編程體系中可以將其分成四個階段。 1、面向過程的C語言。 2、面向對象的C+語言。 3、SDK編程。 4、MFC編程(Microsoft Found

12、ation Class:微軟基類庫)。,第22頁,面向過程的C語言,C語言功能非常強大,Linux/Unix操作系統(tǒng)就是用C語言寫的, C語言直接調用操作系統(tǒng)提供的API函數(shù)可以編寫非常前大的程序。 C和C+的最主要區(qū)別是:C語言中沒有類的概念,C+在C的語法基礎上引入了類(Class),所以C+和C的語法是基本相同的。面向過程編程,最基本的程序用C語言編寫如proj3_2.cpp所示。 案例名稱:使用C語言編程 程序名稱:proj3_2.cpp #include main() printf(Hello DOSn); ,第23頁,案例3-1 讀取命令行參數(shù),main函數(shù)是程序的主函數(shù),程序執(zhí)行

13、的時候先從main函數(shù)開始。 該函數(shù)可以帶參數(shù),第一個參數(shù)是int型的,第二個參數(shù)是字符指針,具體使用方法如proj3_3.cpp所示。 案例名稱:讀取命令行參數(shù) 程序名稱:proj3_3.cpp #include int main(int argc, char *argv ) int i; for (i = 1; i argc; i+) printf(%sn, argvi); return 0; ,第24頁,面向對象的C+語言,面向對象程序設計語言可以將一些變量和函數(shù)封裝到類(Class)中,當變量被類封裝后,稱之為屬性或者數(shù)據(jù)成員,當函數(shù)被類封裝后,稱之為方法或者成員函數(shù)。 定義好的一個類

14、,然后定義一個類的實例,這個實例就叫做對象,在C+中可以用類定義對象,使用方法如程序proj3_4.cpp所示。,第25頁,在C+中使用類,案例名稱:在C+中使用類 程序名稱:proj3_4.cpp #include class person public: int heart; char *name; int run()/定義成員函數(shù)run() heart=heart+20; return heart; ;,第26頁,void main() int iRunStop; person ZhangSan; ZhangS = 張三; ZhangSan.heart = 72; cout

15、姓名:ZhangS endl; cout跑步前心跳ZhangSan.heartendl; /run()為對象的方法 iRunStop = ZhangSan.run(); cout跑步后心跳iRunStopendl; ,第27頁,SDK編程,C庫提供了許多函數(shù),可以直接拿來使用。比如利用C庫提供的DeleteFile函數(shù)來刪除一個文件,如程序proj3_6.cpp所示。 案例名稱:調用C庫函數(shù) 程序名稱:proj3_6.cpp #include #include int main() DeleteFile(C:test.txt); printf(刪除成功n); return 0;

16、,第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 ; ,第29頁,編寫窗口應用程序,參數(shù)一:hInstance 是當前實例的句柄。句柄是windows編程極其重要的概念。它是一個整數(shù),用于標識程序、窗

17、口和資源等。在這里hInstance表示應用程序本身。 參數(shù)二:hPrevInstance總是為NULL,在Windows早期版本中,當多次同時運行同一個程序時,系統(tǒng)會創(chuàng)建該程序的多個“實例”,同一程序的所有實例共享代碼和內存。程序需要檢查hPrevInstance來判斷自身的其他實例是否正在運行,以便從已經存在的實例中獲取數(shù)據(jù)。在32位版本中,統(tǒng)一程序運行方式改變了,不在需要了! 參數(shù)三:lpCmdLine是運行程序的命令行。用戶可以單擊”開始”菜單中的”運行“選項,然后輸入命令來運行一個程序,并且可以指定運行程序所需的參數(shù),這里的命令由lpCmdLine傳入。 參數(shù)四:nCmdShow用于

18、指定程序窗口最初的顯示模式,可以正常顯示,也可以在初始化就最大化或者最小化。,第30頁,利用SDK函數(shù)創(chuàng)建窗口,#include WNDCLASS wc; HWND h_wnd; MSG msg; /* 消息處理函數(shù)wndProc的聲明*/ long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM); /* winMain 函數(shù)的聲明*/ int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show) /*初始化wndclass結構

19、變量*/ wc.lpfnWndProc =WindowProc; wc.hInstance =h_CurInstance; wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName =TheMainClass;,第31頁,/* 注冊WndClass結構變量*/ RegisterClass( ,第32頁,MFC編程,SDK的功能非常強大,需要記很多的函數(shù),當面向對象編程成為主流的時候,微軟將SDK的函數(shù)分類進行封裝,這樣就誕生了MFC(Microsoft Foundation Class)。 MFC程序的最基本

20、的程序骨架如proj3_9.cpp所示。,第33頁,MFC編程,#include class sample:public CFrameWnd public: sample() /構造函數(shù) Create(NULL,My Window); MessageBox(My Window,CFrame constructor); ; class App:public CWinApp public: BOOL InitInstance(); BOOL ExitInstance(); ;,第34頁,/InitInstance函數(shù)的定義/ BOOL App :InitInstance() MessageBox(

21、0,My Window,InitInstance, MB_OK|MB_ICONASTERISK); sample *obj; obj=new sample; m_pMainWnd=obj; obj-ShowWindow(SW_SHOWMAXIMIZED); return TRUE; /ExitInstance函數(shù)定義 BOOL App:ExitInstance() MessageBox(0,My Window,ExitInstance, MB_OK|MB_ICONHAND); return TRUE; /創(chuàng)建應用程序對象 App appobject;,第35頁,網(wǎng)絡安全編程,網(wǎng)絡安全基礎編程技

22、術主要包括6個方面: Socket編程 注冊表編程 文件系統(tǒng)編程 定時器編程 駐留程序編程 多線程編程。,第36頁,Socket編程,談網(wǎng)絡安全編程離開網(wǎng)絡編程就會大失其味,凡是基于網(wǎng)絡應用的程序都離不開Socket。 Socket的意思是套接字,是計算機與計算機之間通信的接口。 使用Winsock提供的API函數(shù)是最基本的網(wǎng)絡編程技術,程序proj3_11.cpp利用Socket獲得本機的IP地址和機器名。,第37頁,Socket編程,案例名稱:使用Socket得到IP地址 程序名稱:proj3_11.cpp #include #include void CheckIP(void) /Che

23、ckIP函數(shù),用于獲取本機IP地址 WORD wVersionRequested;/WORD類型變量,用于存放Winsock版本的值 WSADATA wsaData; char name255;/用于存放主機名 PHOSTENT hostinfo; wVersionRequested = MAKEWORD( 2, 0 ); /調用MAKEWORD()函數(shù)獲得Winsock的版本,用于加載Winsock庫 int main() CheckIP();/調用CheckIP()函數(shù)獲得并輸出IP地址 return 0; ,第38頁,if ( WSAStartup( wVersionRequested,

24、 /卸載Winsock庫,并釋放所有資源 ,第39頁,注冊表編程,注冊表在計算機中由鍵名和鍵值組成,注冊表中存儲了Window操作系統(tǒng)的所有配置。黑客90%以上對Windows的攻擊手段都離不開讀寫注冊表。 在運行窗口中輸入“regedit”命令可以進入注冊表,注冊表的界面如圖3-37所示。,第40頁,注冊表編程,注冊表的句柄可以由調用RegOpenKeyEx()和RegCreateKeyEx()函數(shù)得到的,通過函數(shù)RegQueryValueEx()可以查詢注冊表某一項的值 通過函數(shù)RegSetValueEx()可以設置注冊表某一項的值。RegCreateKeyEx()函數(shù)和RegSetVal

25、ueEx()函數(shù)的使用方法如程序proj3_12.cpp所示。,第41頁,操作注冊表,#include #include main() HKEY hKey1; DWORD dwDisposition; LONG lRetCode; /創(chuàng)建 lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftWindows NTCurrentVersionIniWebSecurity, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, ,第42頁,/設置第一個鍵值 lRetCode

26、= RegSetValueEx ( hKey1, Hack_Name, 0, REG_SZ, (byte*)sixage, 100); /設置第二個鍵值 lRetCode = RegSetValueEx ( hKey1, Hack_Hobby, 0, REG_SZ, (byte*)Running, 100); /如果創(chuàng)建失敗,顯示出錯信息 if (lRetCode != ERROR_SUCCESS) printf ( Error in setting Section1 valuen); return (0) ; printf(注冊表編寫成功!n); return(0); ,第43頁,判斷是否中

27、了“冰河”,中了“冰河”的計算機注冊表都將被修改了,修改了擴展名為txt的文件的打開方式,在注冊表中txt文件的打開方式定義在HKEY_CLASSES_ROOT主鍵下的“txtopencommand”中,如圖3-40所示。,第44頁,案例3-6 更改登錄用戶名,當用戶登錄系統(tǒng)以后,注冊表中就會自動記下用戶名,下次登錄時再把登錄名顯示出來,如圖3-42所示。,第45頁,案例3-6 更改登錄用戶名,當非法入侵計算機以后,同樣會留下非法登錄的用戶名,所以需要將用戶名修改會原來的值。 該用戶名記錄在注冊表的HKEY_LOCAL_MACHINE主鍵下的SOFTWAREMicrosoftWindows N

28、TCurrentVersionWinlogon子鍵中,鍵的名稱是:DefaultUserName,如圖3-43所示。,第46頁,更改系統(tǒng)登錄用戶,案例名稱:更改系統(tǒng)登錄用戶 程序名稱:proj3_14.cpp #include #include main() HKEY hKey1; LONG lRetCode; lRetCode = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon, 0, KEY_WRITE, ,第47頁,lRetCode = RegSetValueEx (

29、 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); ,第48頁,文件系統(tǒng)編程,文件系統(tǒng)編程非常的重要,可以在DOS命令行下執(zhí)行的操作都可以使用程序實現(xiàn)。 在DOS命令行下使用命令“net user Hacker /add”添加一個用戶,同樣可以在程序中實現(xiàn),如程序p

30、roj3_15.cpp所示。 案例名稱:添加系統(tǒng)用戶 程序名稱:proj3_15.cpp,第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.lpReser

31、ved2=NULL; bSuccess=CreateProcess(NULL,szCMD,NULL,NULL,false,NULL,NULL,NULL, ,第50頁,文件拷貝和移動,案例名稱:文件拷貝和移動 程序名稱:proj3_16.cpp #include #include main() CopyFile(C:,C:,TRUE); MoveFile(C:,C:); return 1; ,第51頁,系統(tǒng)時間,案例名稱:系統(tǒng)時間 程序名稱:proj3_17.cpp #include #include main() SYSTEMTIME sysTime; GetLocalTime( ,第52頁,

32、定時器編程,著名的“CIH病毒”每年定時發(fā)作,其中需要利用定時器來控制程序的執(zhí)行。定時器程序分成兩大類, 一類是循環(huán)執(zhí)行 另一類是根據(jù)條件只執(zhí)行一次。在程序中加載定時器,如程序proj3_18所示。,第53頁,定時器編程,案例名稱:定時器編程 程序名稱:proj3_18.cpp #include WNDCLASS wc; HWND h_wnd; MSG msg; /* 消息處理函數(shù)wndProc的聲明*/ long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM); /* winMain 函數(shù)的聲明*/ int PASCAL WinMain(HINSTANC

33、E h_CurInstance, HINSTANCE h_PrevInstance,LPSTR,第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,第55頁,定時

34、器編程,/* 定義消息處理函數(shù)*/ 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) ;

35、fFlipFlop = !fFlipFlop ; InvalidateRect (h_wnd, NULL, FALSE) ; return 0 ;,第56頁,case WM_PAINT : hdc = BeginPaint (h_wnd, ,第57頁,案例3-7 “冰河”原型,第一種方法實現(xiàn)起來比較簡單,注冊表的自啟動項的鍵值在“HKEY_LOCAL_MACHINE”主鍵下的“SOFTWAREMicrosoftWindowsCurrentVersion Run”子鍵中,如圖3-51所示。,第58頁,多線程編程,用多線程技術編程有兩大優(yōu)點: 1、提高CPU的利用率。由于多線程并發(fā)運行,用戶在做一件事情的時候還可以做另外一件事。特別是在多個CPU的情況下,更可以充分地利用硬件資源的優(yōu)勢,將一個大任務分成幾個任務,由不同的CPU來合作完成。 2、采用多線程技術,可以設置每個線程的優(yōu)先級,調整工作的進度。 在實際開發(fā)過程中,一定要有一個主進程,其他線程可以共享該

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論