999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種隱藏注入模塊的新方法*

2015-03-19 00:35:22建,劉
計算機工程與科學 2015年8期
關鍵詞:進程檢測方法

吳 建,劉 新

(湘潭大學信息工程學院“智能計算與信息處理”教育部重點實驗室,湖南 湘潭411105)

1 引言

在信息安全領域,對借助各類工具對惡意軟件進行動態(tài)跟蹤分析是安全專家的日常工作。但是,越來越多的惡意軟件會檢測自身進程空間中是否存在其他模塊來發(fā)現(xiàn)安全分析工具的存在。為對抗這種反監(jiān)控,安全分析工具需要通過Rootkits[1]和Anti Rootkits技術來隱藏注入模塊[2,3]。

注入是指讓目標進程非自愿地加載指定的模塊,進而執(zhí)行特定的代碼。Windows操作系統(tǒng)下的注入方法非常多,我們依據(jù)目標進程是否會被動地載入模塊,將注入方式劃分為“有模塊注入”和“無模塊注入”兩類。

“有模塊注入”的方法常用的有:消息鉤子注入、DLL劫持注入、注冊表注入、輸入法注入、內(nèi)核回調(diào)注入、依賴可信進程注入等等[2,4]?!坝心K注入”的優(yōu)點是注入手段多,并且可以做到在不向目標進程空間寫入任何數(shù)據(jù)的情況下,把DLL 模塊注入進去。由于這些注入方式是利用操作系統(tǒng)提供的一些特殊接口來實現(xiàn)的,而正常軟件也經(jīng)常利用這些注入方法來實現(xiàn)某些功能,所以惡意軟件很難區(qū)分出哪些注入是由安全分析工具發(fā)起的,也就無法抵抗這些注入行為。但是,這些注入方法會在目標進程里多出一個模塊,增加了暴露的可能性。

由于注入模塊在進程的整個生命周期中都存在(在任何時候使用ARK 工具對目標進程進行人工檢測,都很容易發(fā)現(xiàn)這個注入模塊),因此這種注入方式盡管可能暫時騙過惡意軟件的防御,但無法逃避經(jīng)驗豐富的惡意軟件編制者的檢測。惡意軟件如果想逃避監(jiān)控的話,可以通過定時掃描自身進程空間的方式來發(fā)現(xiàn)是否增加了監(jiān)控模塊,以便采取反監(jiān)控措施。

為了讓注入模塊更加隱蔽,安全技術人員提出了一種被稱為“無模塊注入”的技術,該技術的基本思想是去掉DLL模塊這個代碼的載體,直接把代碼寫入到目標進程。目前常用的“無模塊注入”方法有SHELLCODE[5]注入、自加載DLL 等。但 是,這些注入方法實現(xiàn)起來比較麻煩,并且要向目標進程寫入大量的數(shù)據(jù)。對于有內(nèi)存讀寫保護的進程,必須要把握住很好的時機(進程已經(jīng)創(chuàng)建,但保護還沒生效的時候),這種注入手段才能奏效。由于這些“無模塊注入”的方式一定要向目標進程寫入或者映射數(shù)據(jù),而正常軟件一般是不會有這種行為的,所以注入行為本身很容易被檢測到并且被阻止運行。

“無模塊注入”雖然在注入完成后可以很好地隱藏注入到目標進程的代碼,但它一定會有跨進程操作內(nèi)存的行為,而且這種行為是很危險的,所以安全軟件通常采用的注入方法依然是“有模塊注入”。為了更好地隱藏自己,在注入完成之后有必要把這個多出的DLL模塊給隱藏起來。

比較常見的隱藏模塊的方法有斷開鏈表的節(jié)點、Hook 枚 舉 模 塊 的API 函 數(shù)、抹 去PE 頭等[4,6],但這些隱藏方法都有各種各樣的缺點。

Hook枚舉模塊的函數(shù),修改函數(shù)返回值是一種比較“古老”的技術,目前已經(jīng)有了通用的方法來對抗這種隱藏,該方法被稱為“模塊重載技術”。因為無論是用戶態(tài)的DLL 模塊,還是內(nèi)核態(tài)的內(nèi)核模塊都是可以重載的,只需要重新加載一份DLL模塊或者內(nèi)核模塊,然后調(diào)用重新加載的模塊里的函數(shù),就可以繞過被安裝了鉤子的函數(shù)。所以,依靠Hook技術來隱藏自己是有局限性的。并且,在Windows 7 X64 操作系統(tǒng)的內(nèi)核里已經(jīng)有了PatchGuard[7],如果Hook內(nèi)核代碼,則會導致系統(tǒng)崩潰。所以,利用常規(guī)的Hook技術來實現(xiàn)對模塊的隱藏,作用越來越來小,限制越來越大。

抹去PE頭是用來對抗特征碼搜索的一種技術,這種方法通過清除模塊的結構特征來實現(xiàn)隱藏的效果,所以一般只能作為一種隱藏的輔助手段。

由于上面兩種方法存在上述缺陷,要想很好地隱藏自己的模塊,有必要從操作系統(tǒng)維護模塊信息的數(shù)據(jù)結構下手來處理。在RING3層,維護模塊信息的數(shù)據(jù)主要在_PEB_LDR_DATA 里,這個結構包含三個鏈表。下面是用WINDBG 在Windows XP 和Windows 7X86 下 查 看PEB_LDR_DATA 顯示的部分結構:

除此之外,在NTDLL 中還保存著一個叫做HashTable的鏈表,這個鏈表也保存著進程的模塊信息。所以,在RING3 層總共會有四個LDR_MODULE鏈保存著DLL模塊的信息。

容易想到,如果把保存模塊的信息的節(jié)點從這四個鏈表中摘除,就可以在RING3層實現(xiàn)對相應模塊的隱藏。但是,在內(nèi)核中還有一棵管理進程內(nèi)存空間的平衡二叉樹(VAD 樹),在這棵平衡二叉樹中,有一類節(jié)點保存著內(nèi)存映射(SECTION)的相關信息。并且在這類節(jié)點中,保存著一個與SECTION 關聯(lián) 的 文 件 對 象(FILE_OBJECT)[8]。而DLL模塊是以內(nèi)存映射(SECTION)的方式被加載的,所以通過在內(nèi)核態(tài)遍歷VAD 樹還是可以發(fā)現(xiàn)被隱藏模塊的。要想隱藏得更加徹底,還需要編寫驅動程序將VAD 樹中對應節(jié)點的文件對象中的路徑清零。由于這種隱藏模塊的方式需要編寫驅動程序,實現(xiàn)起來比較麻煩;并且在比較新的操作系統(tǒng)中,加載驅動程序越來越困難[9]。再加上在Windows 7X64系統(tǒng)中還有PatchGuard,修改這棵VAD 樹會導致系統(tǒng)崩潰。因此,通過斷開操作系統(tǒng)中用來維護模塊信息的鏈表來隱藏模塊,也越來越不適應新環(huán)境。

2 隱藏注入模塊的新方法

為了達到隱藏模塊的目的,需要尋找一個比較通用的、不在上述四條鏈表和VAD 樹中留下痕跡的加載模塊的方法。

一種思路是不調(diào)用操作系統(tǒng)的加載模塊的API函數(shù),直接把DLL 模塊中的代碼和數(shù)據(jù)寫入到目標進程,然后再自己處理導入表和重定位表。實驗表明,在惡意軟件沒有采取防御的情形下,這種方式是有效的。但是,因為這種方式有跨進程向內(nèi)存空間寫入數(shù)據(jù)的行為,所以很容易被惡意軟件防范。

還有一種思路是先讓DLL 模塊正常加載,然后復制一份完整的DLL 模塊的內(nèi)存映象,把原先的DLL模塊釋放掉,再以DLL模塊正常加載的基址為地址申請與原DLL模塊內(nèi)存映象相同大小的內(nèi)存,然后再把備份的映象復制回去。這樣該DLL模塊就在操作系統(tǒng)中消失了,并且免去了修復導入表和重定位的麻煩。但是,這種方式同樣需要操作目標進程的內(nèi)存,所以也會被惡意軟件防范。

上面的兩種注入方法可以歸類為“無模塊注入”,可以比較好地隱藏被注入的代碼。但是,它有個致命的危險行為:操作不屬于自己的內(nèi)存空間,進而被惡意軟件防范。

既然“無模塊注入”的致命缺點是有跨進程操作內(nèi)存空間的行為,如果能夠在目標進程內(nèi)部進行代碼的去模塊化操作,由于惡意軟件無法察覺這種進程內(nèi)部操作內(nèi)存的行為,那么這種去模塊化的方法從理論上來看應該能夠繞過惡意軟件的防御。

系統(tǒng)中任何一個軟件為了能在系統(tǒng)中生存和正常運行下去,總會允許一些“有模塊注入”行為注入到自身(比如輸入法的調(diào)用,就是一種“有模塊注入”)。對于“有模塊注入”,惡意軟件很難鑒別出哪些注入是系統(tǒng)必須的,哪些注入是由安全軟件發(fā)起的,所以不可能阻止所有的注入行為。亦即任何軟件都無法有效地防御所有的“有模塊注入”,因此可以把“有模塊注入”和代碼的去模塊化操作結合起來。并且通過在無模塊化的代碼中釋放被注入的模塊,可以解決“有模塊注入”在目標進程中會多出一個模塊的缺點,從而達到很好的隱藏效果。

根據(jù)以上分析,形成了以下思路:先通過“有模塊注入”的方式在目標進程中注入一個類似“加載器”的模塊,然后在“加載器”中實現(xiàn)無模塊化加載主功能模塊,最后把“加載器”模塊釋放掉,實現(xiàn)去模塊化操作。

2.1 隱藏模塊的實現(xiàn)步驟

本方法需要用到兩個DLL,第一個DLL 是包含監(jiān)控功能的DLL,為了描述方便,將其命名為main.dll;第二個DLL 用來加載主main.dll,并實現(xiàn)對main.dll的隱藏,這個DLL 命名為load.dll。以下是實現(xiàn)步驟:

步驟1采取一種惡意軟件無法進行有效防御的“有模塊注入”方法(比如輸入法注入)注入load.dll到目標進程。

步驟2在load.dll中加載main.dll,此時main.dll會完成對全局變量以及堆的初始化。

步驟3復制一份main.dll到其他區(qū)域作為備份。

步驟4直接修改main.dll的入口函數(shù)為返回,再釋放main.dll。此時在目標進程內(nèi)已經(jīng)不存在main.dll,也就檢測不到main.dll了。

步驟5在main.dll原基址申請同樣大小的地址空間,把備份數(shù)據(jù)復制到原地址空間。

步驟6執(zhí)行main.dll的一個導出函數(shù),在這個函數(shù)內(nèi)釋放load.dll,并執(zhí)行一些初始化操作。至此,load.dll和main.dll都已從目標進程內(nèi)釋放,但main.dll內(nèi)的代碼還可以正常執(zhí)行。

步驟7為了達到更加隱蔽的效果,還需要把main.dll的整個PE頭部清零。

2.2 抹掉PE頭,對抗暴力枚舉

注入到目標進程的DLL 模塊,會有比較明顯的結構特征。惡意軟件通過遍歷整個內(nèi)存空間,然后搜索特征碼的方式,可以發(fā)現(xiàn)被隱藏的模塊。這種檢測方式可以稱之為“暴力枚舉”。為了對抗這種暴力枚舉,需要將模塊的結構特征清除掉。

PE 文件是Windows操作系統(tǒng)上的程序文件(Portable Executable)的 統(tǒng) 稱,DLL 模 塊 就 是 按PE文件格式[10]組織的,常見的EXE、DLL、OCX、SYS、COM 都是PE文件。圖1描述了PE 文件的基本結構。

Figure 1 Structure of PE file圖1 PE文件結構

經(jīng) 過 實 驗,把“DOS HEADER”和“PE HEADER”清零后,DLL 模塊中的代碼是可以正常工作的。下面是清零的關鍵代碼。

2.3 釋放DLL同時保留DLL的資源

通過調(diào)用釋放模塊的API函數(shù),可以把DLL模塊的信息從目標進程和系統(tǒng)的相關數(shù)據(jù)結構內(nèi)刪除。這個時候,無論是在用戶態(tài)還是內(nèi)核態(tài),都無法通過常規(guī)方法發(fā)現(xiàn)被隱藏的模塊。但同時,模塊占用的內(nèi)存區(qū)域和一些資源也會被釋放掉,這樣會導致程序不能正常執(zhí)行。

為解決內(nèi)存被釋放的問題,可以備份整個模塊的數(shù)據(jù)和重新分配內(nèi)存?,F(xiàn)在就只剩下一個關鍵問題:在調(diào)用釋放模塊函數(shù)的時候,如何阻止操作系統(tǒng)釋放DLL模塊的資源。

操作系統(tǒng)提供的釋放資源的API函數(shù)freelibrary(),會執(zhí)行下面兩個操作:

(1)把DLL模塊所占用的由系統(tǒng)分配的資源釋放掉(比如堆heap)。為了阻止這種資源釋放,可以在調(diào)用釋放模塊的API函數(shù)之前,把DLL 模塊的入口點的指令修改為RET 指令。代碼如下:

(2)減少依賴的其他DLL模塊的計數(shù),進而可能會導致這些DLL模塊被釋放。為了使注入的模塊更加隱蔽,應該在這個DLL 模塊中盡可能少依賴其它DLL。在用VS 編譯DLL 時,選擇“多線程/MT”選項,可以做到編譯出來的DLL 模塊只有KERNEL32.DLL 和USER32.DLL 兩個依賴項。而在被注入的進程里,一般也會有這兩個DLL,從而可以解決依賴的DLL 模塊被釋放的問題。

2.4 保持模塊“活性”

把DLL模塊注入到目標進程后,如果得不到運行機會,這塊代碼就是“死的”,是一種無效注入。必須要讓DLL 模塊里的代碼不斷地得到進入CPU 的機會去執(zhí)行一些操作,這種注入才是有效的。我們把這種爭取CPU 控制權的行為稱為“保持活性”。

要保持模塊的活性,一種思路是Hook被注入進程經(jīng)常會調(diào)用的一些函數(shù)(比如消息響應函數(shù)WINPROC),這樣可以讓注入的代碼經(jīng)常有機會得到執(zhí)行。但是,這種方法不能準確地確定注入的代碼被執(zhí)行的時機,并且有時還會觸發(fā)被注入進程的一些保護機制。

還有一種方法就是在DLL 模塊被初始化時,創(chuàng)建一個線程。在這個線程里,定時地執(zhí)行注入的代碼;并且還可以使用同步對象(EVENT、MUTEX 等)和內(nèi)存映射等機制與外部進程進行實時的通信和交互,就相當于在目標進程中插入了一個間諜。采用這種方式注入代碼的執(zhí)行時間可控,而且可以主動運行,比第一種方法更好。但是,這種方法也有個比較明顯的缺點:在目標進程中會多出一個線程,并且這個線程是無模塊的,惡意軟件作者可以發(fā)現(xiàn)這個線程。因此,還需要進一步地改進,使得該注入線程看上去更像一個普通線程。

2.5 線程偽裝

線程是調(diào)度的基本單位,要完全隱藏線程,基本上不可能真正實現(xiàn)。不過,目前絕大多數(shù)程序都是多線程的,在目標進程多出一個線程即便經(jīng)驗豐富的專業(yè)技術人員也很難辨別其是否為注入,因此沒有必要把線程給徹底隱藏。只需要把“線程沒有對應的模塊”這個問題給解決了,就能達到很好的隱蔽效果。

把線程從一個模塊轉移到另一個模塊的方法被稱為線程偽裝,用這種方法可以很好地解決無主線程的問題。系統(tǒng)判斷線程所在的模塊,是通過先取得線程的開始地址,然后再用這個開始地址去定位相應的模塊。因此,只要偽造一個假的線程開始地址,就可以讓這個線程“屬于相應的模塊”。具體方法如下:在目標進程已經(jīng)存在的模塊中尋找一個地址(比如模塊入口函數(shù)),在這個地址處構造一個跳轉指令,直接跳到線程函數(shù)的起始地址。然后,在創(chuàng)建線程的時候,用找到的這個“跳板地址”作為創(chuàng)建線程的參數(shù)。等這個線程運行起來以后,再恢復被修改的指令。這樣,被隱藏的模塊的線程就不再是“無主線程”。

通過這種方法,可以很好地解決駐留線程被檢測的問題。下面這份代碼讓“無主線程”thread-Start成功轉嫁到了kernel32.DLL上。

2.6 兩個特殊問題的解決

把注入的DLL模塊給隱藏后,系統(tǒng)的API函數(shù)GetmoduleHandle、GetModuleFileName 等 需要枚舉模塊的函數(shù)均無法定位到這個模塊,可能會導致注入的代碼出現(xiàn)一些異常。下面是在實驗過程中遇到過的兩種問題:

(1)如果DLL模塊中是有資源的,系統(tǒng)在加載資源前會要求先定位到這個DLL 模塊,然后才會加載資源。但是,這個DLL模塊已經(jīng)被隱藏,會導致程序出錯。

(2)操作系統(tǒng)在進行異常分發(fā)時,也需要定位異常指令所在的模塊。但是,由于該模塊已被隱藏,所以異常處理代碼不能發(fā)揮作用。

我們的解決方法是在定位模塊的函數(shù)中安裝鉤子,然后進行堆?;厮輽z測,如果發(fā)現(xiàn)是自己的模塊在定位自己時,就返回正確的信息。但是,這個方法需要安裝鉤子,處理不夠隱蔽。

更隱蔽一點的方法就是在這個被隱藏的DLL模塊中既不攜帶資源,也不進行異常處理。由于注入的代碼一般不是很多,因此要做到既無資源,又無異常,還是比較容易實現(xiàn)的。

3 實驗結果與分析

XueTr是一款廣受好評的ARK 工具,它對模塊和線程有很強大的檢測能力。本實驗就用XueTr來觀察隱藏模塊的效果。

前面已經(jīng)介紹了Hook枚舉模塊的函數(shù)、斷開進程的LDR_MODULE 鏈、修改SECTION 類型的內(nèi)存區(qū)域節(jié)點等實現(xiàn)隱藏模塊的方法。有的方法達不到隱藏效果,有的方法在低版本的Windows操作系統(tǒng)(比如Windows XP)下可以實現(xiàn)模塊隱藏,但在一些高版本的操作系統(tǒng)(比如Windows 7X64)中卻無法實現(xiàn)。本次實驗采用了“斷開進程的LDR_MODULE鏈”這種方法,與我們設計的方法進行對比。

在不隱藏模塊的情況下,實驗結果如圖2 所示,main.dll會被檢測出(圖中的第一行)。

采用“斷開進程的LDR_MODULE鏈”來隱藏模塊,如圖3所示。第一行是被隱藏的模塊,并且被XueTr標記為危險狀態(tài)(危險狀態(tài)顯示為紅色,但在黑白印刷中,看不出紅色,下同)。

而用我們的方法來隱藏被注入的模塊,可以達到很好的隱藏效果。從圖4可以看出,注入的模塊已經(jīng)完全被隱藏。

Figure 2 Effect of not hiding the injected modules圖2 不隱藏模塊的效果

Figure 3 Effect of hiding the injected modules by disconnecting chains圖3 斷鏈隱藏模塊的效果

Figure 4 Effect of hiding the injected modules by our method圖4 我們的方法隱藏模塊的效果

再來看線程偽裝的效果。圖5是在沒有進行線程偽裝之前,XueTr檢測到的線程信息。可以看到,第一行顯示出駐留線程是“無主線程”并且被標記為危險狀態(tài)。

Figure 5 Effect before camouflaging thread圖5 沒有線程偽裝的效果

線程偽裝之后的效果如圖6所示。駐留線程已經(jīng)“屬于了”kernel32.DLL這個模塊。

Figure 6 Effect after camouflaging thread圖6 線程偽裝后的效果

從實驗結果可以看出,本文中的方法比目前的主流方法隱蔽性更好。并且這種方法在Windows XP及其以后的Windows系列平臺都適用。

4 結束語

本文將“有模塊注入”和“無模塊注入”結合起來,形成了一種突破性強、隱藏性好、兼容性好的隱藏注入模塊的方法,并且對這種隱藏方法進行了實驗。用這種方法實現(xiàn)對被注入模塊的隱藏,突破防御的能力強,能夠兼容各種版本的Windows操作系統(tǒng),并且隱蔽性比目前的通用方法都要好。

不過,本文的方法還存在一些小的不足:用這種方法實現(xiàn)模塊的隱藏時,在目標進程會多出一塊內(nèi)存。要處理得更加隱蔽,可以考慮把這塊內(nèi)存也隱藏起來。

另外,如果被注入進程有檢測機制,并且在常用的函數(shù)處安裝了鉤子,然后在堆棧中回溯出調(diào)用鏈,也能定位到被隱藏的模塊。但是,這種自我檢測會對程序的運行效率造成比較大的影響,所以一般很少有程序采用。同時,為了對抗這種檢測,可以考慮在調(diào)用常用的系統(tǒng)函數(shù)前構造一條假的調(diào)用鏈[4]。另外,還有可以從根本上繞過這種堆?;厮輽z測的方法:重載有所依賴的系統(tǒng)DLL 模塊。為了更加隱蔽,在重載系統(tǒng)DLL的時候,也可以把重載的系統(tǒng)DLL做無模塊化處理。

以上這些問題,將在后續(xù)的研究中逐步解決。

[1] Gong Guang,Li Zhou-jun,Hu Chao-jian,et al.Research on stealth technology of Windows kernel level rootkits[J].Computer Science,2010,37(4):59-62.(in Chinese)

[2] Xu Ming,Yang Tong,Zheng Lian-qing,et al.Concealing technology of Trojan horses and prevention[J].Computer Engineering and Design,2011,32(2):489-492.(in Chinese)

[3] He Zhi,F(xiàn)an Ming-yu,Luo Bin-jie.Research on remote-thread injection based hidden process technology[J].Computer Applications,2008,28(6):92-94.(in Chinese)

[4] Xu Sheng.Game plugin art[M].Beijing:Electronic Industry Press,2013.(in Chinese)

[5] Wang Ying,Li Xiang-h(huán)e,Guan Long,et al.Attack and defending technology of shellcode [J].Computer Engineering,2010,36(18):163-168.(in Chinese)

[6] Doug W.Methods for detecting kernel rootkits[D].University of Louisville,2007.

[7] Han Zhuo,Ran Xiao-min,LüWen-gao.Kernel integrity verification of Windows 7[J].Journal of Information Engineering University,2011,12(6):764-768.(in Chinese)

[8] Mao De-cao.Windows kernal scenario analysis—using open source code ReactOS[M].Beijing:Electronic Industry Press,2009.(in Chinese)

[9] Zhang Zhi,Cai Wan-dong.Excution method of unsigned driver on Windows x64[J].Microelectronics &Computer,2014,31(2):101-105.(in Chinese)

[10] Qi Li.Windwos PE authoritative guide[M].Beijing:Mechanical Industry Press,2011.(in Chinese)

附中文參考文獻:

[1] 龔廣,李舟軍,忽朝儉,等.Windows內(nèi)核級Rootkits隱藏技術的研究[J].計算機科學,2010,37(4):59-62.

[2] 許名,楊仝,鄭連清,等.木馬隱藏技術與防范方法[J].計算機工程與設計,2011,32(2):489-492.

[3] 何志,范明鈺,羅彬杰.基于遠程線程注入的進程隱藏技術研究[J].計算機應用,2008,28(6):92-94.

[4] 徐勝.游戲外掛攻防藝術[M].北京:電子工業(yè)出版社,2013.

[5] 王穎,李祥和,關龍,等.Shellcode攻擊與防范技術[J].計算機工程,2010,36(18):163-168.

[7] 韓卓,冉曉旻,呂文高.Windows7內(nèi)核完整性驗證機制研究[J].信息工程大學學報,2011,12(6):764-768.

[8] 毛德操.Windows內(nèi)核情景分析——采用開源代碼ReactOS(上、下冊)[M].北京:電子工業(yè)出版社,2009.

[9] 張智,蔡皖東.Windows x64無簽名驅動程序運行方法[J].微電子學與計算機,2014,31(2):101-105.

[10] 戚利.Windows PE權威指南[M].北京:機械工業(yè)出版社,2011.

猜你喜歡
進程檢測方法
“不等式”檢測題
“一元一次不等式”檢測題
“一元一次不等式組”檢測題
債券市場對外開放的進程與展望
中國外匯(2019年20期)2019-11-25 09:54:58
小波變換在PCB缺陷檢測中的應用
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
捕魚
社會進程中的新聞學探尋
民主與科學(2014年3期)2014-02-28 11:23:03
我國高等教育改革進程與反思
主站蜘蛛池模板: 欧美色亚洲| 国产精品自在在线午夜| 亚洲侵犯无码网址在线观看| 最新国产精品鲁鲁免费视频| 国产精品白浆无码流出在线看| 国产精品专区第一页在线观看| 国产成人综合久久精品下载| 久久国产精品波多野结衣| 欧美精品亚洲精品日韩专区va| 1024你懂的国产精品| 性视频一区| 日韩成人免费网站| 香蕉蕉亚亚洲aav综合| 亚洲成A人V欧美综合天堂| 欧美h在线观看| 欧美成一级| 日韩第九页| 性视频久久| 免费99精品国产自在现线| 国产成人艳妇AA视频在线| 欧美精品啪啪| 亚洲国产精品日韩专区AV| 国产丝袜丝视频在线观看| 国产精品人人做人人爽人人添| 草逼视频国产| 国产精品自在线天天看片| 国产成人精品日本亚洲77美色| 国产黄网永久免费| 色噜噜狠狠色综合网图区| 亚洲欧美国产五月天综合| 国产精品一区不卡| 欧美成人精品在线| 麻豆精品在线| 欧类av怡春院| 国产乱人视频免费观看| 亚洲高清中文字幕| 国产91视频免费| 在线观看热码亚洲av每日更新| 亚洲欧洲AV一区二区三区| 91美女视频在线| 91精品情国产情侣高潮对白蜜| 性视频一区| 亚洲中文字幕23页在线| 动漫精品啪啪一区二区三区| 97视频免费看| 国产91丝袜在线观看| 不卡视频国产| 99精品国产电影| 青青青国产在线播放| 丰满人妻久久中文字幕| 91亚瑟视频| 久热中文字幕在线| 九九久久精品免费观看| 亚洲六月丁香六月婷婷蜜芽| 色婷婷成人网| 拍国产真实乱人偷精品| 亚洲国产一成久久精品国产成人综合| 久久国产精品国产自线拍| 国产区免费精品视频| 免费无码AV片在线观看中文| 日本成人一区| 亚洲免费福利视频| 57pao国产成视频免费播放| Jizz国产色系免费| 亚洲av无码成人专区| 91区国产福利在线观看午夜| 日韩精品少妇无码受不了| 凹凸国产熟女精品视频| 欧美精品高清| 成人综合在线观看| 91青青草视频| a在线观看免费| 欧美va亚洲va香蕉在线| 日韩经典精品无码一区二区| vvvv98国产成人综合青青| 久久久久中文字幕精品视频| 伊人精品成人久久综合| 伊人久久久大香线蕉综合直播| 成人午夜亚洲影视在线观看| 超碰精品无码一区二区| 国产99免费视频| 超碰色了色|