国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

NDIS深層網(wǎng)絡(luò)封包截取研究

2012-10-17 03:07:24鄒菊紅
關(guān)鍵詞:傳輸層封包驅(qū)動(dòng)程序

鄒菊紅

四川省水利職業(yè)技術(shù)學(xué)院 四川 611830

0 前言

隨著計(jì)算機(jī)技術(shù)和通信技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)信息已滲透到社會(huì)生活的各個(gè)領(lǐng)域,隨之而來的安全問題也日益嚴(yán)重,一旦網(wǎng)絡(luò)安全問題發(fā)生,可能帶來非常嚴(yán)重后果。由于互聯(lián)網(wǎng)發(fā)展的歷史原因,TCP/IP 協(xié)議及 HTTP、FTP 等基于 TCP/IP 協(xié)議的各種應(yīng)用層協(xié)議,在協(xié)議設(shè)計(jì)之初均未考慮安全傳輸問題。隨著互聯(lián)網(wǎng)的發(fā)展,國(guó)際標(biāo)準(zhǔn)組織雖陸續(xù)推出了 SSL、HTTP1.1 等具有安全傳輸能力的應(yīng)用層協(xié)議,但作為應(yīng)用層承載協(xié)議的 TCP/IP 協(xié)議仍存在著固有的安全缺陷,造成至今未能有徹底的、低成本的、不需硬件支持的互聯(lián)網(wǎng)安全傳輸解決方案。正是由于網(wǎng)絡(luò)傳輸安全問題的現(xiàn)實(shí)存在,推動(dòng)著黑客攻擊技術(shù)、防火墻技術(shù)的不斷發(fā)展。

1 NDIS的介紹

1.1 NDIS技術(shù)

Microsoft網(wǎng)絡(luò)驅(qū)動(dòng)程序接口規(guī)范(NDIS)的設(shè)計(jì)目的是通過將不同的協(xié)議從網(wǎng)絡(luò)接口卡上拆除,使得用戶可以訪問不同的協(xié)議。在設(shè)計(jì)過程中,協(xié)議并不需要了解關(guān)于網(wǎng)絡(luò)卡的任何信息。NDIS程序庫(kù)(NDIS.sys)提供了一個(gè)面向NIC驅(qū)動(dòng)程序的完全抽象的接口,網(wǎng)卡驅(qū)動(dòng)程序與協(xié)議層驅(qū)動(dòng)程序及操作系統(tǒng)通過這個(gè)接口進(jìn)行通信。

網(wǎng)絡(luò)封包截獲,涉及驅(qū)動(dòng)編程技術(shù)、核心態(tài)編程技術(shù)、系統(tǒng)動(dòng)態(tài)鏈接庫(kù)編程技術(shù)、協(xié)議生成與解析編程技術(shù)等,集中體現(xiàn)了網(wǎng)絡(luò)應(yīng)用的核心技術(shù),是防火墻等高級(jí)網(wǎng)絡(luò)應(yīng)用開發(fā)的基礎(chǔ)?;赪indows 2000和Windows XP的網(wǎng)絡(luò)封包截獲技術(shù)主要分為三種: WinSock2 動(dòng)態(tài)鏈接庫(kù)重載、傳輸層過濾驅(qū)動(dòng)、中間層驅(qū)動(dòng)。

1.2 動(dòng)態(tài)數(shù)據(jù)庫(kù)重載

WinSock2動(dòng)態(tài)鏈接庫(kù)重載:系統(tǒng)的WinScok2動(dòng)態(tài)鏈接庫(kù),隨系統(tǒng)啟動(dòng)而載入內(nèi)存,提供 29個(gè)用于網(wǎng)絡(luò)傳輸?shù)墓δ芎瘮?shù)。IE等普通上層應(yīng)用程序,調(diào)用WinScok2動(dòng)態(tài)鏈接庫(kù)中的WSPSend、WSPRecv等函數(shù),實(shí)現(xiàn)網(wǎng)絡(luò)收、發(fā)功能。修改注冊(cè)表中 HKEY_LOCAL_MACHINE/SYSTM/CURRENTCONTROLS ET/SERVICES/WinSock2項(xiàng),建立新的自定義WSPStartup入口函數(shù),可以重載winsock.dll。通過重載winsock.dll中的有關(guān)網(wǎng)絡(luò)收、發(fā)函數(shù),增加網(wǎng)絡(luò)封包收、發(fā)前、后的自定義處理功能,實(shí)現(xiàn)網(wǎng)絡(luò)封包截獲。

1.3 傳輸層過濾驅(qū)動(dòng)

傳輸層過濾驅(qū)動(dòng):使用 NDIS技術(shù),又稱 TDI編程(Transport Driver Interface傳輸層驅(qū)動(dòng)接口編程)。Windows2000和WindowsXP中,TCP/IP協(xié)議作為系統(tǒng)驅(qū)動(dòng)程序(../system32/TcpIp.sys),在系統(tǒng)啟動(dòng)時(shí)載入系統(tǒng)內(nèi)存,以TCP/IP設(shè)備對(duì)象的形式供應(yīng)用程序或其它系統(tǒng)程序調(diào)用。傳輸層過濾驅(qū)動(dòng)程序創(chuàng)建一個(gè)或多個(gè)設(shè)備對(duì)象,直接掛接到TCP/IP設(shè)備對(duì)象之上。掛接成功后,當(dāng)其它程序使用網(wǎng)絡(luò)傳輸功能,調(diào)用TCP/IP設(shè)備對(duì)象時(shí),操作系統(tǒng)首先將該調(diào)用映射到TCP/IP設(shè)備對(duì)象之上所掛接的傳輸層過濾驅(qū)動(dòng)程序。通過傳輸層過濾驅(qū)動(dòng)程序,再調(diào)用下層的TCP/IP設(shè)備對(duì)象,從而完成網(wǎng)絡(luò)訪問功能。同樣,從TCP/IP層上傳至應(yīng)用程序的網(wǎng)絡(luò)封包,也要經(jīng)傳輸層過濾驅(qū)動(dòng)程序后,再轉(zhuǎn)發(fā)至目標(biāo)應(yīng)用程序端口?;诖斯ぷ髟?,可以在傳輸層過濾驅(qū)動(dòng)程序中實(shí)現(xiàn)網(wǎng)絡(luò)封包截獲,完成網(wǎng)絡(luò)封包的過濾及加解密處理。

1.4 中間層驅(qū)動(dòng)概述

中間層驅(qū)動(dòng):與傳輸層過濾驅(qū)動(dòng)實(shí)現(xiàn)基本原理一致,也是使用 NDIS 技術(shù)。主要差別在于,中間層驅(qū)動(dòng)程序,掛接在協(xié)議設(shè)備對(duì)象(包括 TCP/IP 設(shè)備對(duì)象)和網(wǎng)卡設(shè)備對(duì)象之間。任何進(jìn)出網(wǎng)卡的網(wǎng)絡(luò)封包,均必須首先經(jīng)過中間層驅(qū)動(dòng)程序的處理。從某種意義上分析,中間層驅(qū)動(dòng)程序更像一個(gè)虛擬網(wǎng)卡。該虛擬卡封裝了物理網(wǎng)卡,對(duì)物理網(wǎng)卡的一切網(wǎng)絡(luò)訪問操作,均必須先經(jīng)虛擬卡處理。

2 基于NDIS深層封包截取的設(shè)計(jì)與實(shí)現(xiàn)

根據(jù)前面的介紹,本文采用VC++程序進(jìn)行設(shè)計(jì)實(shí)現(xiàn)。

2.1 初始化

DriverEntry()函數(shù)是整個(gè)驅(qū)動(dòng)程序的入口,它是在驅(qū)動(dòng)程序被加載的時(shí)候由系統(tǒng)自動(dòng)執(zhí)行的。這個(gè)函數(shù)里面主要是進(jìn)行一些驅(qū)動(dòng)程序初始化的操作。

(1) 在Global結(jié)構(gòu)里面記錄函數(shù)傳入的RegisterPath參數(shù)。

(2) 調(diào)用 IoCreateDevice為這個(gè)驅(qū)動(dòng)程序創(chuàng)建一個(gè)DeviceObject,記錄在Globals.ControlDeviceObject里面,這個(gè)DeviceObject是為了今后控制這個(gè)驅(qū)動(dòng)程序用的(上層應(yīng)用可以調(diào)用DeviceIoControl來對(duì)驅(qū)動(dòng)程序的一些參數(shù)進(jìn)行設(shè)置)。

(3) 為上面所建立的 DeviceObject建立 SymbolLink。它的作用是為了讓上層的應(yīng)用程序可以調(diào)用到所建立的DeviceObject(由于 Windows的層次關(guān)系,上層應(yīng)用無法直接控制核心態(tài)的驅(qū)動(dòng)程序,必須通過符號(hào)連接實(shí)現(xiàn)對(duì)核心的調(diào)用)。

(4) 逐一設(shè)置protocolChar結(jié)構(gòu)中的每一個(gè)域。這些域一些是驅(qū)動(dòng)程序所必需的版本號(hào)、名字等信息,另外一些是函數(shù)指針,它們指定了一些NDIS自動(dòng)執(zhí)行的函數(shù)入口地址。這里指定的每一個(gè)函數(shù)在程序中必須有它的具體實(shí)現(xiàn)。

(5) 調(diào)用NdisRegisterProtocol函數(shù)注冊(cè)這個(gè)驅(qū)動(dòng)程序,這個(gè)函數(shù)執(zhí)行之后,這個(gè)驅(qū)動(dòng)程序被加入到系統(tǒng)的設(shè)備列表中,以后的應(yīng)用程序可以使用這個(gè)驅(qū)動(dòng)程序了。

(6) 指定驅(qū)動(dòng)程序的主功能(MajorFunction)代碼處理函數(shù)。它是一個(gè)數(shù)組,主要指定在上層應(yīng)用調(diào)用 CreateFile,ReadFile, WriteFile, DeviceIoControl和CloseHandle等函數(shù)的時(shí)候,下層驅(qū)動(dòng)程序怎樣處理。

(7) 指定驅(qū)動(dòng)程序卸載時(shí)候的處理函數(shù)。

(8) 返回,如果遇到錯(cuò)誤,進(jìn)行錯(cuò)誤處理。錯(cuò)誤處理的主要內(nèi)容就是判斷錯(cuò)誤出現(xiàn)的位置以及已經(jīng)分配的資源,對(duì)已經(jīng)分配的資源進(jìn)行釋放。

2.2 綁定

PacketBindAdapter()函數(shù)是驅(qū)動(dòng)程序中必不可少的函數(shù),它是操作系統(tǒng)自動(dòng)調(diào)用的函數(shù)。在驅(qū)動(dòng)程序加載的時(shí)候,操作系統(tǒng)自動(dòng)查找當(dāng)前機(jī)器上安裝的網(wǎng)卡驅(qū)動(dòng)程序,并對(duì)每一個(gè)網(wǎng)卡自動(dòng)運(yùn)行這個(gè)函數(shù),其目的是在驅(qū)動(dòng)程序中對(duì)每個(gè)網(wǎng)卡進(jìn)行記錄,以備以后的使用。因此,這個(gè)函數(shù)中的主要內(nèi)容就是實(shí)現(xiàn)對(duì)網(wǎng)卡的登記注冊(cè)。

(1) 從DeviceName中取得網(wǎng)卡的名字,并分配空間存儲(chǔ)起來。

(2) 調(diào)用IoCreateDevice為這個(gè)網(wǎng)卡建立一個(gè)設(shè)備對(duì)象。

(3) 創(chuàng)建 deviceobject->deviceExtention 為 Open_Instance結(jié)構(gòu),用來記錄這個(gè)設(shè)備一切信息。

(4) 為這個(gè)設(shè)備對(duì)象建立符號(hào)聯(lián)接。

(5) 調(diào)用NdisAllocatePacketPool為這個(gè)設(shè)備分配包緩沖池。

(6) 初始化Open_Instance結(jié)構(gòu)(open變量)的一些域。

(7) 調(diào)用NdisOpenAdapter完成這個(gè)設(shè)備的初始化工作。

(8) 設(shè)置Open_Instance結(jié)構(gòu)中的一些域的初值。

(9) 把這個(gè)設(shè)備加入到Globals.AdapterList的隊(duì)列中去。

(10) 錯(cuò)誤處理。

2.3 I/O控制

實(shí)現(xiàn)對(duì)驅(qū)動(dòng)程序以及它所綁定的設(shè)備的控制。究竟是對(duì)驅(qū)動(dòng)程序本身還是對(duì)它綁定的設(shè)備是由傳入的參數(shù)DeviceObject決定,如果它等于Global->ControlDeviceObject,那么它就是對(duì)驅(qū)動(dòng)程序的控制,否則是對(duì)指定綁定設(shè)備的控制。程序開始,首先確定控制類型。由于用戶態(tài)和核心態(tài)程序的信息交換是通過IRP來實(shí)現(xiàn)的,所以這個(gè)功能代碼是存放在IRP的IO堆棧單元中。

2.3.1 枚舉網(wǎng)絡(luò)適配器

主要是通過PacketGetAdapterList函數(shù)來實(shí)現(xiàn)。這個(gè)功能在PacketIoControl函數(shù)中實(shí)現(xiàn)以下功能。

(1) 判斷設(shè)備變量是否為全局控制設(shè)備變量,如不是,說明上層調(diào)用錯(cuò)誤。返回錯(cuò)誤信息。

(2) 調(diào)用PacketGetAdapterList尋找網(wǎng)絡(luò)適配器列表,放到輸出緩沖區(qū)中。

(3) 執(zhí)行標(biāo)準(zhǔn)語(yǔ)句組完成IRP。

2.3.2 記錄上層應(yīng)用程序的Start按鈕是否按下

這個(gè)功能主要通過修改設(shè)備結(jié)構(gòu)中的變量Start來實(shí)現(xiàn)。

(1) 取設(shè)備信息結(jié)構(gòu)變量。

(2) 判斷Start域的值,根據(jù)要求修改。

(3) 完成IRP,返回。

2.3.3 設(shè)置緩沖區(qū)大小

這個(gè)功能的實(shí)現(xiàn)主要是通過修改設(shè)備結(jié)構(gòu)中的變量bufsize來實(shí)現(xiàn)。

(1) 取設(shè)備信息結(jié)構(gòu)變量。

(2) 取要設(shè)置的bufsize的值,修改open->bufsize。

(3) 完成IRP,返回。

2.3.4 重置適配器

這個(gè)功能主要是調(diào)用系統(tǒng)函數(shù)NdisReset來實(shí)現(xiàn)。不過在此之前,這個(gè)函數(shù)把當(dāng)前的這個(gè)重置請(qǐng)求加入到了ResetIrpList中,這樣做的目的主要是幫助PacketResetComplete函數(shù)找到IRP。

注意,當(dāng)NDIS執(zhí)行完Reset操作要完成IRP的時(shí)候,它必須知道是哪個(gè)IRP要求的Reset操作。而IRP是作為參數(shù)傳到PacketIoControl函數(shù)中的,PacketResetComplete無法知道這個(gè) IRP。這樣就需要一個(gè)數(shù)據(jù)結(jié)構(gòu)記錄這個(gè) IRP,這個(gè)數(shù)據(jù)結(jié)構(gòu)就是ResetIrpList。在PacketIoControl函數(shù)中,把當(dāng)前IRP加入到ResetIrpList中,然后執(zhí)行NdisReset后馬上返回。過了一段時(shí)間,Reset操作完成,NDIS自動(dòng)調(diào)用PacketResetComplete函數(shù),從ResetIrpList取出這個(gè)IRP,執(zhí)行標(biāo)準(zhǔn)語(yǔ)句組,完成IRP。

2.3.5 實(shí)現(xiàn)NDIS請(qǐng)求

NDIS請(qǐng)求主要有兩類。(1) 設(shè)置OID;(2) 查詢OID。

這兩個(gè)功能主要是通過調(diào)用系統(tǒng)函數(shù)NdisRequest實(shí)現(xiàn)。

(1) 從系統(tǒng)緩沖區(qū)中取出要進(jìn)行操作的OID結(jié)構(gòu)。

(2) 分配一個(gè) pRequest變量,用來存儲(chǔ) IRP和當(dāng)前的Request內(nèi)容(OID的內(nèi)容)。

(3) 判斷OID的數(shù)據(jù)結(jié)構(gòu)長(zhǎng)度是否正確。

(4) 判斷請(qǐng)求是設(shè)置OID還是查詢OID,并針對(duì)相應(yīng)的請(qǐng)求進(jìn)行相應(yīng)的變量設(shè)置。

(5) 調(diào)用 NdisRequest。

(6) 錯(cuò)誤處理。

(7) 類似Reset請(qǐng)求,如果NdisRequest已經(jīng)完成,那么驅(qū)動(dòng)程序要顯式的調(diào)用PacketRequestComplete函數(shù)完成IRP。

2.4 數(shù)據(jù)接收

自然的設(shè)計(jì)思想是每當(dāng)上層應(yīng)用程序請(qǐng)求讀取數(shù)據(jù)時(shí),就為該請(qǐng)求生成一個(gè)相應(yīng)的IRP,并將此IRP置于一個(gè)讀取等待隊(duì)列之中。當(dāng)NIC從網(wǎng)絡(luò)上接收到數(shù)據(jù)包時(shí),由NDIS負(fù)責(zé)調(diào)用相應(yīng)的接收函數(shù)。接收函數(shù)從讀取等待隊(duì)列的首部取出一個(gè) IRP,并將從網(wǎng)絡(luò)上接收到的數(shù)據(jù)拷貝到由該 IRP所指定的緩沖區(qū)中。至此,上層應(yīng)用程序便成功接收到了它所需要的數(shù)據(jù)。

這種接收方式的天生缺陷就是丟包。如果上層應(yīng)用程序一直沒有讀取數(shù)據(jù)的請(qǐng)求,那么NIC從網(wǎng)絡(luò)上接收到的數(shù)據(jù)就會(huì)直接被丟棄。

本程序的設(shè)計(jì)思路是協(xié)議驅(qū)動(dòng)程序負(fù)責(zé)維護(hù)一個(gè)接收緩沖區(qū),該緩沖區(qū)以隊(duì)列的形式組織。當(dāng)NIC通知NDIS已從網(wǎng)絡(luò)上接收到數(shù)據(jù)包時(shí),可以先將這些數(shù)據(jù)緩存起來。當(dāng)上層應(yīng)用程序需要讀取數(shù)據(jù)時(shí),該讀操作的數(shù)據(jù)源不是直接從網(wǎng)絡(luò)得到,而是經(jīng)過有效管理的存放著數(shù)據(jù)的緩沖區(qū)。這樣,丟包的問題便得以解決。

當(dāng)然,如果上層應(yīng)用程序還是一直沒有讀取數(shù)據(jù)的請(qǐng)求,或者上層應(yīng)用程序處理數(shù)據(jù)的速度低于NIC從網(wǎng)絡(luò)上接收數(shù)據(jù)的速度,再或者網(wǎng)絡(luò)出現(xiàn)峰值流量時(shí),緩沖區(qū)自然會(huì)逐漸被填滿,最終還是會(huì)出現(xiàn)丟包的情況。但是在正常情況下,這種增設(shè)緩沖的方法已經(jīng)足以避免丟包情況的發(fā)生了。

當(dāng)NIC從網(wǎng)絡(luò)上接收到數(shù)據(jù)并通知NDIS時(shí),作為已經(jīng)在 protocolChar結(jié)構(gòu)中注冊(cè)過的函數(shù),NDIS將調(diào)用PacketReceiveIndicate或 PacketReceivePacket二者之一作為接收處理函數(shù)將NIC從網(wǎng)絡(luò)上接收到的數(shù)據(jù)緩存起來。其中,PacketReceiveIndicate作為協(xié)議驅(qū)動(dòng)程序的 ProtocolReceive函數(shù)是必須要提供的,而PacketReceivePacket作為協(xié)議驅(qū)動(dòng)程序的ProtocolReceivePacket函數(shù)提供與否是可選的。二者的主要區(qū)別在于當(dāng) NIC支持一次接收多個(gè)數(shù)據(jù)包時(shí)使用ProtocolReceivePacket更富效率。

2.5 解碼引擎接口實(shí)現(xiàn)

CPDEDecodeEngine提供解碼所有字段、解碼概要信息、解碼字段,共三種方式解碼接口。

以下引自CSPDEOBJ.h頭文件中對(duì)該類的定義,提供給模塊用戶的主要功能。

2.6 解碼引擎類的實(shí)現(xiàn)

3 結(jié)束語(yǔ)

本文對(duì)NDIS中間層驅(qū)動(dòng)程序進(jìn)行擴(kuò)展研究,實(shí)現(xiàn)了對(duì)底層的網(wǎng)絡(luò)數(shù)據(jù)包的截獲,經(jīng)過該項(xiàng)目的實(shí)際應(yīng)用檢驗(yàn),結(jié)果表明,系統(tǒng)運(yùn)行穩(wěn)定,為信息安全和數(shù)據(jù)安全提供了有效的保障,對(duì)網(wǎng)絡(luò)管理人員和網(wǎng)絡(luò)安全有很大的幫助。使網(wǎng)絡(luò)管理從原來的被動(dòng)防御變成了現(xiàn)在的主動(dòng)抵抗,從傳統(tǒng)觀念上也有了很大的改變,具有進(jìn)一步研究的價(jià)值和廣闊的應(yīng)用前景。

[1]祁云嵩,劉永良,華偉.VC++程序設(shè)計(jì)解析與訓(xùn)練[M]].華東理工大學(xué)出版社.2005.

[2]孫鑫,余安萍.VC++深入詳解[M].電子工業(yè)出版社.2006.

[3]辛長(zhǎng)安,梅林編著.VC++編程技術(shù)與難點(diǎn)剖析[M].清華大學(xué)出版社.2002.

[4]張忠?guī)浘幹?VC++ 2008專題應(yīng)用程序開發(fā)實(shí)例精講[M].電子工業(yè)出版社.2008.

[5]宋金珂,高麗華,張迎新.VC++程序設(shè)計(jì)基礎(chǔ)教程[M].清華大學(xué)出版社.2010.

[6]賈振華.VC++程序設(shè)計(jì)項(xiàng)目實(shí)踐[M],清華大學(xué)出版社.2010.

[7]張惠娟.Windows環(huán)境下的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì).西安電子科技大學(xué)出版社.2009.

[8]斯諾譯.Windows2000設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)指南.北京:機(jī)械工業(yè)出版社.2006.

[9]李德全.拒絕服務(wù)攻擊[M].電子工業(yè)出版社.2007.

[10]冀振燕.UML 系統(tǒng)分析與設(shè)計(jì)教程[M].人民郵電出版社.2010.

[11]李雙華.C++編程思想[M].電子工業(yè)出版社.2009.

[12]陳宗斌等譯,Michael J.Donahoo Kenneth L.Calvert著.TCP/IPSockets編程[M].清華大學(xué)出版社.2009.

[13]TCP-IP詳解卷3:TCP事務(wù)協(xié)議,HTTP,NNTP和UNIX域協(xié)議.2009.

猜你喜歡
傳輸層封包驅(qū)動(dòng)程序
中藥封包在急診老年急性胃腸炎患者中的臨床應(yīng)用
基于Python語(yǔ)言的網(wǎng)絡(luò)傳輸層UDP協(xié)議攻擊性行為研究
ZnO電子傳輸層在有機(jī)無機(jī)雜化鈣鈦礦太陽(yáng)能電池中的應(yīng)用
護(hù)膚 巧用保鮮膜
無沖突規(guī)則校園網(wǎng)絡(luò)安全系統(tǒng)的設(shè)計(jì)
門窗(2019年12期)2019-04-20 16:06:52
物聯(lián)網(wǎng)無線通信傳輸層動(dòng)態(tài)通道保障機(jī)制
基于物聯(lián)網(wǎng)GIS的消防智能巡檢系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
NS2條件網(wǎng)絡(luò)性能分析實(shí)踐
電腦與電信(2013年1期)2013-08-06 02:14:52
驅(qū)動(dòng)程序更新與推薦
驅(qū)動(dòng)程序更新與推薦
纳雍县| 黔江区| 江西省| 台江县| 日喀则市| 南充市| 九寨沟县| 章丘市| 神农架林区| 天水市| 邛崃市| 霍山县| 荆门市| 静宁县| 社会| 常熟市| 耒阳市| 阜康市| 龙泉市| 封丘县| 南江县| 南投县| 旬阳县| 邢台市| 靖安县| 勃利县| 体育| 西安市| 广饶县| 宽城| 嘉鱼县| 永济市| 山西省| 高陵县| 东乌| 永春县| 都兰县| 铜鼓县| 柳州市| 永德县| 额敏县|