![sniffer設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/898428d4-f382-4328-9b6d-da6288cd3e4d/898428d4-f382-4328-9b6d-da6288cd3e4d1.gif)
![sniffer設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/898428d4-f382-4328-9b6d-da6288cd3e4d/898428d4-f382-4328-9b6d-da6288cd3e4d2.gif)
![sniffer設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/898428d4-f382-4328-9b6d-da6288cd3e4d/898428d4-f382-4328-9b6d-da6288cd3e4d3.gif)
![sniffer設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/898428d4-f382-4328-9b6d-da6288cd3e4d/898428d4-f382-4328-9b6d-da6288cd3e4d4.gif)
![sniffer設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/898428d4-f382-4328-9b6d-da6288cd3e4d/898428d4-f382-4328-9b6d-da6288cd3e4d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序?qū)嵺`四網(wǎng)絡(luò)安全與網(wǎng)絡(luò)管理實(shí)踐報(bào)告軟件學(xué)院實(shí)驗(yàn)成績(jī)表2010年版1. 實(shí)踐目的(1) 掌握sniffer程序原理;(2) 學(xué)習(xí)Wincap編程(3) 能夠使用Wincap實(shí)現(xiàn)數(shù)據(jù)包的捕獲(4) 設(shè)計(jì)和實(shí)現(xiàn)一個(gè)sniffer程序(5) 掌握ARP欺騙原理,并能夠?qū)嵤〢RP欺騙2. 實(shí)踐內(nèi)容(1)使用Winpcap實(shí)現(xiàn)數(shù)據(jù)包的捕獲:;(2)分析數(shù)據(jù)包:處理捕獲的數(shù)據(jù)包,解析出其協(xié)議類型、源MAC地址、目的MAC地址、源IP地址、目的IP地址、源端口、目的端口和數(shù)據(jù)部分,然后將這些信息保存在文件中。最終根據(jù)文件內(nèi)容統(tǒng)計(jì)以下協(xié)議的數(shù)據(jù)流量:網(wǎng)絡(luò)層:IP,ICMP;傳輸層:TCP,UDP。(3)將捕獲
2、的信息存放在數(shù)據(jù)庫(kù)中,根據(jù)捕獲的信息進(jìn)行流量統(tǒng)計(jì);(4)ARP欺騙:截獲網(wǎng)絡(luò)上的數(shù)據(jù)包,對(duì)其進(jìn)行分析,獲取源和目的地址,用該數(shù)據(jù)包的目的IP地址來偽裝自己的IP地址,并按照ARP報(bào)文格式,對(duì)該數(shù)據(jù)包的發(fā)送者發(fā)送ARP欺騙包,并驗(yàn)收ARP欺騙成功。(5)界面化:利用MFC構(gòu)建圖形界面,便于用戶操作。3. 實(shí)踐過程1 Sniffer網(wǎng)絡(luò)嗅探器使用MFC構(gòu)建圖形界面,工程基于對(duì)話框模式建立。工程共有兩個(gè)對(duì)話框,分別為主對(duì)話框IDD_WINCAPA_DLG,其類名為CWincapaDlg,以及新建的對(duì)話框IDD_DIALOG,其類名為CAdapaterSelDlg,其作用是在進(jìn)入主對(duì)話框之前選擇網(wǎng)卡設(shè)
3、備。 類CAdapaterSelDlg:如截圖顯示,對(duì)話框內(nèi)使用了Combo Box控件,并在ClassWizard里定義了CComboBox的變量m_selAdapter,在類CAdapaterSelDlg中定義了一個(gè)public的變量int m_selIndex。在ClassWizard中添加三個(gè)成員函數(shù):virtual void OnOK();/把選中的設(shè)備的序號(hào)賦值到m_selIndex中virtual BOOL OnInitDialog();/初始化對(duì)話框,把已經(jīng)查找出來的網(wǎng)絡(luò)設(shè)備顯示在下拉列表中virtual void OnCancel();/彈出對(duì)話框,并退出程序 獲取本地網(wǎng)卡列
4、表所使用的函數(shù)以及代碼在實(shí)驗(yàn)指導(dǎo)書中都有,這里就不過多介紹了。主對(duì)話框:主對(duì)話框中使用了check box控件,list control控件,以及五個(gè)button控件。在ClassWizard里定義變量:list control控件變量CListCtrlm_list,BOOL型的check box變量m_arpFilter;m_icmpFilter;m_ipFilter;m_tcpFilter; m_udpFilter。在WincapaDlg.cpp中定義結(jié)構(gòu)體:struct ETHDR/以太網(wǎng)頭部 u_char eh_dst6; u_char eh_src6; u_short eh_type
5、;/IP?ARP?;typedef struct ip_header/* IPv4 header */ u_char ver_ihl; / Version (4 bits) + Internet header length (4 bits) u_char tos; / Type of service u_short tlen; / Total length u_short identification; / Identification u_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits) u_char ttl; / Ti
6、me to live u_char proto; / Protocol u_short crc; / Header checksum u_int saddr; / Source address u_int daddr; / Destination address u_int op_pad; / Option + Paddingip_header;struct TCPPacketHead /* TCP header*/u_short SourPort;u_short DestPort;u_int SeqNo;u_int AckNo;u_char HLen;u_char Flag;u_short
7、WndSize;u_short ChkSum;u_short UrgPtr;struct UDPPacketHead/* UDP header*/ u_short sport; / Source port u_short dport; / Destination port u_short len; / Datagram length u_short crc; / Checksum;struct ICMPPacketHead /*ICMP header*/u_char type;u_char code;u_short chkSum;typedef struct ARP_header/ARP he
8、aderu_char hardware;u_char proto; / Protocolu_short haddresslen;u_short paddresslen;u_char type;u_char smaddr6;/source mac addressu_int saddr;/soure ip addressu_char dmaddr6;/destination mac addressu_int daddr;/destination ip addressARP_header;在ClassWizard里添加成員函數(shù): OnInitDialog(), OnSysCommand(UINT n
9、ID, LPARAM lParam),OnPaint(),HCURSOR OnQueryDragIcon()等。下面會(huì)做具體介紹:BOOL CWincapaDlg:OnInitDialog()函數(shù)中,對(duì)對(duì)話框進(jìn)行初始化,主要是對(duì)list control控件的初始化操作,添加“數(shù)據(jù)”,“大小”,“目的端口”,“目的MAC地址”,“目的地址”,“源端口”,“源MAC地址”,“源地址”,“序號(hào)”共十列。主要代碼如下:m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);m_list.InsertColumn(0,"
10、數(shù)據(jù)",LVCFMT_LEFT,335);m_list.InsertColumn(0,"大小",LVCFMT_LEFT,40);CFont *font = CFont:FromHandle(HFONT):GetStockObject(DEFAULT_GUI_FONT);void CWincapaDlg:OnStart()函數(shù)是在ClassWizard對(duì)IDD_START按鈕添加的響應(yīng)函數(shù),主要是進(jìn)行數(shù)據(jù)包的捕獲,因?yàn)镸FC中對(duì)pcap_loop()函數(shù)不兼容,所以在工程中我使用了線程函數(shù),如上代碼所示,而在OnStart()函數(shù)中調(diào)用線程AfxBeginThrea
11、d(threadFunc, (LPVOID)this);即可是捕獲數(shù)據(jù)包。流程圖中為wincap捕獲數(shù)據(jù)包的流程:線程函數(shù)UINT threadFunc (LPVOID p)CWincapaDlg *pDlg = static_cast<CWincapaDlg *>(p) ;int res;struct pcap_pkthdr *header;const u_char *pkt_data;while(!isStop && (res = pcap_next_ex(adhandle, &header, &pkt_data) >= 0)if(res
12、= 0)/Timeout elapsed continue;u_char a= 's'pDlg->intepretPacket(&a, header, pkt_data);/解釋報(bào)文if(res = -1)CString tmp;tmp.Format("Error reading the packets: %sn", pcap_geterr(adhandle);AfxMessageBox(tmp);exit(1);pcap_close(adhandle);return -1;void CWincapaDlg:applyFilter(pcap_t
13、 *fp, char *packet_filter, bpf_u_int32 NetMask, struct bpf_program fcode)函數(shù)設(shè)置過濾規(guī)則。在OnStart()函數(shù)中調(diào)用此函數(shù)。通過m_arpFilter; m_icmpFilter; m_ipFilter; m_tcpFilter; m_udpFilter,當(dāng)選中其中某項(xiàng)時(shí),變量的值變?yōu)門RUE型(默認(rèn)為FALSE),把過濾表達(dá)式線程相應(yīng)的網(wǎng)絡(luò)協(xié)議類型。比如,選中arp協(xié)議項(xiàng),通過判斷m_arpFilter=TRUE,strcpy(packet_filter,"arp");將過濾表達(dá)式設(shè)置為arp,
14、使用pcap_compile(fp, &fcode, packet_filter, 1, NetMask)以及pcap_setfilter(fp, &fcode)設(shè)置過濾規(guī)則。void CWincapaDlg:intepretPacket(u_char *param, const pcap_pkthdr *header, const u_char *pkt_data)函數(shù),主要是分析數(shù)據(jù)包,根據(jù)接收的數(shù)據(jù)包的字段類型進(jìn)行分類。如線程代碼所示,在線程中調(diào)用此函數(shù)。將分析出的數(shù)據(jù)包的協(xié)議, 源MAC地址,目的MAC地址,源地址,源端口,目的地址,目的端口,大小, 數(shù)據(jù)等信息都通過格
15、式化xx.Format()函數(shù)轉(zhuǎn)換為其對(duì)應(yīng)的格式,添加到list control列表中。下面的流程圖為區(qū)分四種協(xié)議的流程圖。ARP:以太網(wǎng)的協(xié)議類型值為0x0806;IP:以太網(wǎng)的協(xié)議類型值為0x0800;UDP:IP的協(xié)議類型值為17;TCP: IP的協(xié)議類型值為6;ICMP IP的協(xié)議類型值為1。void CWincapaDlg:insertData( CString s1, CString s2, CString s3, CString s4, CString s5, CString s6, CString s7, CString s8,CString s9,CString s10)函數(shù)
16、將分析出的數(shù)據(jù)包信息寫入list control列表,函數(shù)在intepretPacket()中調(diào)用。部分代碼如下:int index;index = m_list.InsertItem(0,s1);m_list.SetItem(index,1,LVIF_TEXT,s2, 0, 0, 0,0);void CWincapaDlg:OnStop()函數(shù)是在ClassWizard對(duì)IDD_STOP按鈕添加的響應(yīng)函數(shù),停止捕獲數(shù)據(jù)包,并顯示已經(jīng)捕獲的不同協(xié)議數(shù)據(jù)包的數(shù)量。在工程中定義4個(gè)static int的全局變量,c_tcp,c_udp,c_icmp,c_arp,在OnStart函數(shù)中對(duì)其值初始化為
17、0,在intepretPacket函數(shù)中在相應(yīng)的協(xié)議中進(jìn)行累加,最后用MessageBox把其值顯示出來。以下為設(shè)置ARP過濾的捕獲停止的截圖:void CWincapaDlg:OnClear()函數(shù)是在ClassWizard對(duì)IDD_CLEAR按鈕添加的響應(yīng)函數(shù),清除list control列表中的數(shù)據(jù)內(nèi)容,使用m_list.DeleteAllItems()。void CWincapaDlg:OnSavelist()函數(shù)在ClassWizard對(duì)IDD_SAVELIST按鈕添加的響應(yīng)函數(shù),用于將list control列表中的數(shù)據(jù)內(nèi)容存放在數(shù)據(jù)庫(kù)中。我所使用的數(shù)據(jù)庫(kù)為MYSQL,在數(shù)據(jù)庫(kù)中建
18、立了命名為sniffer的表單,在安裝數(shù)據(jù)庫(kù)時(shí),設(shè)定用戶名為root,密碼為123。連接數(shù)據(jù)庫(kù)使用的代碼:if(m_list.GetItemCount()=0)MessageBox("沒有數(shù)據(jù)要存儲(chǔ)!");return;u_int i;MYSQL *db;db=mysql_init(0);/初始化數(shù)據(jù)庫(kù)CString str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,sqls;if(mysql_real_connect(db,"localhost","root","123&
19、quot;,"sniffer",3306,NULL,0)/連接數(shù)據(jù)庫(kù)for(i=1;i<=num;i+)str1=m_list.GetItemText(num-i,0);str2=m_list.GetItemText(num-i,1);str3=m_list.GetItemText(num-i,2);/把列表中的數(shù)據(jù)插入數(shù)據(jù)庫(kù)中sqls="INSERT INTO sniffer VALUES('"+str1+"','"+str2+"','"+str3+"
20、9;,'"+str4+"',)"mysql_query(db,sqls);MessageBox("存儲(chǔ)成功!");截圖如下:存儲(chǔ)顯示數(shù)據(jù)庫(kù)內(nèi)容:void CWincapaDlg:OnExit()函數(shù)是在ClassWizard對(duì)IDD_EXIT按鈕添加的響應(yīng)函數(shù),退出程序。SendMessage(WM_CLOSE);關(guān)閉對(duì)話框。2 ARP欺騙ARP工作原理首先,每臺(tái)主機(jī)都會(huì)在自己的ARP緩沖區(qū)中建立一個(gè) ARP列表,以表示IP地址和MAC地址的對(duì)應(yīng)關(guān)系。當(dāng)源主機(jī)需要將一個(gè)數(shù)據(jù)包要發(fā)送到目的主機(jī)時(shí),會(huì)首先檢查自己 ARP列表中是否存
21、在該 IP地址對(duì)應(yīng)的MAC地址,如果有就直接將數(shù)據(jù)包發(fā)送到這個(gè)MAC地址;如果沒有,就向本地網(wǎng)段發(fā)起一個(gè)ARP請(qǐng)求的廣播包,查詢此目的主機(jī)對(duì)應(yīng)的MAC地址。此ARP請(qǐng)求數(shù)據(jù)包里包括源主機(jī)的IP地址、硬件地址、以及目的主機(jī)的IP地址。網(wǎng)絡(luò)中所有的主機(jī)收到這個(gè)ARP請(qǐng)求后,會(huì)檢查數(shù)據(jù)包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此數(shù)據(jù)包;如果相同,該主機(jī)首先將發(fā)送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已經(jīng)存在該IP的信息,則將其覆蓋,然后給源主機(jī)發(fā)送一個(gè) ARP響應(yīng)數(shù)據(jù)包,告訴對(duì)方自己是它需要查找的MAC地址;源主機(jī)收到這個(gè)ARP響應(yīng)數(shù)據(jù)包后,將得到的目的主機(jī)的
22、IP地址和MAC地址添加到自己的ARP列表中,并利用此信息開始數(shù)據(jù)的傳輸。如果源主機(jī)一直沒有收到ARP響應(yīng)數(shù)據(jù)包,表示ARP查詢失敗。ARP欺騙過程ARP協(xié)議并不只在發(fā)送了ARP請(qǐng)求才接收ARP應(yīng)答。當(dāng)計(jì)算機(jī)接收到ARP應(yīng)答數(shù)據(jù)包的時(shí)候,就會(huì)對(duì)本地的ARP緩存進(jìn)行更新,將應(yīng)答中的IP和MAC地址存儲(chǔ)在ARP緩存中。所以在網(wǎng)絡(luò)中,有人發(fā)送一個(gè)自己偽造的ARP應(yīng)答,網(wǎng)絡(luò)可能就會(huì)出現(xiàn)問題。設(shè)一個(gè)網(wǎng)絡(luò)環(huán)境中,網(wǎng)內(nèi)有三臺(tái)主機(jī),分別為主機(jī)A、B、C。主機(jī)詳細(xì)信息如下描述: 02 MAC: 00-16-d3-fb-8c-c5B的地址為:IP:.101 MAC: 00-1e-ec-94-e8-0cC的地址為:
23、IP:.103 MAC: 00-22-15-22-81-88正常情況下A和C之間進(jìn)行通訊,但是此時(shí)B向A發(fā)送一個(gè)自己偽造的ARP應(yīng)答,而這個(gè)應(yīng)答中的數(shù)據(jù)為發(fā)送方IP地址是03(C的IP地址),MAC地址是00-1e-ec-94-e8-0c(C的MAC地址本來應(yīng)該是00-22-15-22-81-88,這里被偽造了)。當(dāng)A接收到B偽造的ARP應(yīng)答,就會(huì)更新本地的ARP緩存(A被欺騙了),這時(shí)B就偽裝成C了。同時(shí),B同樣向C發(fā)送一個(gè)ARP應(yīng)答,應(yīng)答包中發(fā)送方IP.102(A的IP地址),MAC地址是00-1e-ec-94-e8-0c(A的MAC地址本來應(yīng)該是00-16-d3-f
24、b-8c-c5),當(dāng)C收到B偽造的ARP應(yīng)答,也會(huì)更新本地ARP緩存(C也被欺騙了),這時(shí)B就偽裝成了A。這樣主機(jī)A和C都被主機(jī)B欺騙,A和C之間通訊的數(shù)據(jù)都經(jīng)過了B。實(shí)驗(yàn)截圖:欺騙成功實(shí)驗(yàn)關(guān)鍵代碼(發(fā)送ARP數(shù)據(jù)包):arp_packet packet;/設(shè)置目的MAC地址packet.eth.dest_mac0=00;packet.eth.dest_mac1=16;packet.eth.dest_mac2=d3;packet.eth.dest_mac3=fb;packet.eth.dest_mac4=8c;packet.eth.dest_mac5=c5;/假設(shè)源MAC地址為本地IP地址pa
25、cket.eth. source_mac 0=00;packet.eth. source_mac 1=1e;packet.eth. source_mac 2=ec;packet.eth. source_mac 3=94;packet.eth. source_mac 4=e8;packet.eth. source_mac 5=0c;/填充數(shù)據(jù)包packet.eth.eh_type=htons(0x0806);/ARPpacket.arp.hardware_type=htons(0x0001);tocol_type=htons(0x0800);packet.arp.ad
26、d_len=0x06;_len=0x04;packet.arp.option=htons(0x0002);packet.arp.saddr=arp->daddr;packet.arp.daddr=arp->saddr;memcpy(packet.arp.dest_addr,arp->sour_addr,6);memcpy(packet.arp.sour_addr,packet1,6); for (i = 0; i <18; i+)packet.arp.paddingi = 1;psend=(unsigned char*)&packet
27、;/強(qiáng)制轉(zhuǎn)換發(fā)送的數(shù)據(jù)包的類型/發(fā)送數(shù)據(jù)包pcap_sendpacket(adhandle,psend,sizeof(psend);3 試驗(yàn)中出現(xiàn)的問題以及解決方案(1) Combo Box控件無(wú)法下拉工程運(yùn)行時(shí)發(fā)現(xiàn),對(duì)話框中的下拉列表只能顯示第一個(gè)網(wǎng)卡的信息。解決方法:把鼠標(biāo)放在下拉列表的處,當(dāng)光標(biāo)的形狀變成上下箭頭時(shí),點(diǎn)擊下拉框的中間白點(diǎn),向下拉即可。(2) Wincap中的部分函數(shù)與MFC中的函數(shù)redefine,重定義在link過程中,出現(xiàn)wincap中的一些函數(shù)以及變量重定義的錯(cuò)誤,比如pcap_complile等。#define WIN32_LEAN_AND_MEAN#includ
28、e<windows.h>#include<winsock2.h>(3)編譯時(shí)出現(xiàn)如下問題: packet32.h(231) : error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage' 解決方法:1.向winpcap庫(kù)的packet32.h文件中加入如下代碼,且應(yīng)位于“struct npf_if_addr”定義之前: #ifndef _SS_PAD1SIZE
29、60; struct sockaddr_storage u_char sa_len; u_char sa_family;
30、0; u_char padding128; ; #endif 2.將sockaddr_storage 改成 sockaddr。 (4)添加mysql時(shí)出現(xiàn)錯(cuò)誤解決方式:把mysql的Include,Lib.debug目錄添加進(jìn)VC6.0的環(huán)境變量中;針對(duì)每一個(gè)項(xiàng)目,先用VC打開項(xiàng)目,然后在"Project->Settings",擇"Link",在"Object/library modules"的輸入框里添加"libmysql.lib "。在StdAfx.h文件中加上 #i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)生體育運(yùn)動(dòng)項(xiàng)目的成效評(píng)估與反饋
- 教育領(lǐng)域中的家庭烹飪教育課程設(shè)計(jì)
- 高效農(nóng)產(chǎn)品營(yíng)銷團(tuán)隊(duì)的組建與培訓(xùn)
- 城市公共空間設(shè)計(jì)-第2篇-深度研究
- 數(shù)字貨幣經(jīng)濟(jì)學(xué)-深度研究
- 消費(fèi)金融風(fēng)險(xiǎn)評(píng)估模型-深度研究
- 藥店裝修簡(jiǎn)易合同范本
- LED控制與驅(qū)動(dòng)產(chǎn)品項(xiàng)目融資渠道探索
- 合成材料中間體項(xiàng)目融資渠道探索
- 新一代智能合約運(yùn)營(yíng)模式推廣合同
- 湖北省十堰市城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末質(zhì)量檢測(cè)綜合物理試題(含答案)
- 小學(xué)科學(xué)項(xiàng)目化學(xué)習(xí)活動(dòng)作業(yè)方案案例設(shè)計(jì)《設(shè)計(jì)制作動(dòng)力小車項(xiàng)目化學(xué)習(xí)》
- 茶與健康 第二講 茶成分課件
- 復(fù)工條件驗(yàn)收?qǐng)?bào)告
- 小學(xué)生作文稿紙A4打印稿
- 2023理論學(xué)習(xí)、理論武裝方面存在問題及原因剖析18條
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第三章運(yùn)動(dòng)能力與個(gè)體差異
- (部編)五年級(jí)語(yǔ)文下冊(cè)小練筆(21篇)
- 《企業(yè)人力資源管理師考試用書考試通過必備一級(jí)》
- 2023年高考英語(yǔ)考前必練-非謂語(yǔ)動(dòng)詞(含近三年真題及解析)
- 高??萍汲晒D(zhuǎn)化政策與案例分享
評(píng)論
0/150
提交評(píng)論