在.Net程序中注入代碼的方法和裝置的制作方法_第1頁
在.Net程序中注入代碼的方法和裝置的制作方法_第2頁
在.Net程序中注入代碼的方法和裝置的制作方法_第3頁
在.Net程序中注入代碼的方法和裝置的制作方法_第4頁
在.Net程序中注入代碼的方法和裝置的制作方法_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

在.Net程序中注入代碼的方法和裝置的制作方法專利名稱::在.Net程序中注入代碼的方法和裝置的制作方法技術(shù)領(lǐng)域::本發(fā)明涉及信息安全領(lǐng)域,特別涉及一種在.Net程序中注入代碼的方法和裝置。背景技術(shù)::.Net是微軟的新一代技術(shù)平臺(tái),是全新的基于互聯(lián)網(wǎng)的跨語言軟件開發(fā)平臺(tái),順應(yīng)了當(dāng)今軟件工業(yè)分布式計(jì)算、面向組件、企業(yè)級應(yīng)用、軟件服務(wù)化和以Web為中心等大趨勢。.Net并非開發(fā)語言,但是在.Net開發(fā)平臺(tái)上可以支持多門開發(fā)語言,如C#語言丄++、VisualBasic、Jscript等。.Net程序的編譯分為兩個(gè)階段,首先高級語言的.Net程序被編譯成一種稱作IL(中間代碼)的中間語言,然后將IL編譯成機(jī)器語言。與高級語言相比,IL更像是機(jī)器語言,然而,IL卻包含一些抽象概念,如類和異常等,這也是這種語言被稱為中間語言的原因?,F(xiàn)有技術(shù)在.Net程序中注入代碼時(shí),通常先將.Net程序的EXE文件反編譯成IL代碼,然后插入IL代碼,如加解密函數(shù)的IL代碼,最后再編譯成.Net程序。該方法需要經(jīng)過反編譯和編譯的過程,復(fù)雜繁瑣,效率較低,兼容性差,而且對.Net程序的限制比較多。比如,不能在匯編和IL混編的程序VC.NET編譯的程序中注入代碼。發(fā)明內(nèi)容為了克服現(xiàn)有技術(shù)的缺陷,本發(fā)明實(shí)施例提供了一種在.Net程序中注入代碼的方法和裝置。所述技術(shù)方案如下—種在.Net程序中注入代碼的方法,所述方法包括在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息;在所述.Net可執(zhí)行文件的導(dǎo)入地址表IAT中添加待注入代碼的地址,構(gòu)建成新的IAT;將所述.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為所述新的IAT的地址;修改所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。在導(dǎo)入地址表IAT中添加待注入代碼的地址,構(gòu)建成新的IAT,具體包括啟用一個(gè)新的地址,將所述.Net可執(zhí)行文件的導(dǎo)入地址表IAT的內(nèi)容復(fù)制到所述新的地址中;在復(fù)制的內(nèi)容之后添加待注入代碼的地址,構(gòu)建成新的IAT,所述新的IAT的地址為所述新的地址。修改所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求,具體包括將所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記修改為0,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息之前,還包括將.Net程序原碼編譯成.Net可執(zhí)行文件。所述信息包括所述待注入代碼的引擎動(dòng)態(tài)鏈接庫和所述待注入代碼對應(yīng)的函數(shù)?!N在.Net程序中注入代碼的裝置,所述裝置包括寫入模塊,用于在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息;構(gòu)建模塊,用于在所述.Net可執(zhí)行文件的導(dǎo)入地址表IAT中添加待注入代碼的地址,構(gòu)建成新的IAT,將所述.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為所述新的IAT的地址;修改模塊,用于修改所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。所述構(gòu)建模塊具體包括構(gòu)建單元,用于啟用一個(gè)新的地址,將所述.Net可執(zhí)行文件的導(dǎo)入地址表IAT的內(nèi)容復(fù)制到所述新的地址中,在復(fù)制的內(nèi)容之后添加待注入代碼的地址,構(gòu)建成新的IAT,所述新的IAT的地址為所述新的地址。所述修改模塊具體包括修改單元,用于將所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記修改為0,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。所述裝置還包括編譯模塊,用于在所述寫入模塊在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息之前,將.Net程序原碼編譯成.Net可執(zhí)行文件。所述信息包括所述待注入代碼的引擎動(dòng)態(tài)鏈接庫和所述待注入代碼對應(yīng)的函數(shù)。本發(fā)明實(shí)施例提供的上述技術(shù)方案,實(shí)現(xiàn)了在.Net可執(zhí)行文件中注入代碼,拋棄了對匯編和反匯編工具的依賴,容易實(shí)現(xiàn),解決了.Net可執(zhí)行文件注入代碼效率低、穩(wěn)定性和兼容性差的問題。圖1是本發(fā)明實(shí)施例1提供的一種在.Net程序中注入代碼的方法流程圖;圖2是本發(fā)明實(shí)施例1提供的另一種在.Net程序中注入代碼的方法流程圖;圖3是本發(fā)明實(shí)施例2提供的在.Net程序中注入代碼的裝置結(jié)構(gòu)圖。具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。實(shí)施例1參見圖l,本實(shí)施例提供了一種在.Net程序中注入代碼的方法,包括步驟101:在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息;步驟102:在.Net可執(zhí)行文件的導(dǎo)入地址表IAT中添加待注入代碼的信息的地址,構(gòu)建成新的IAT;步驟103:將.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為新的IAT的地址;步驟104:修改.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。本發(fā)明實(shí)施例中,待注入代碼是用戶根據(jù)需要預(yù)先設(shè)定的,具體內(nèi)容本發(fā)明實(shí)施例對此不做限定。通常設(shè)置為函數(shù),可以為一個(gè),也可以為多個(gè)。下面以待注入代碼為一個(gè)加解密函數(shù)為例,具體說明上述方法。參見圖2,本實(shí)施例提供的上述方法,可以具體包括步驟201:對.Net程序原碼進(jìn)行編譯,得到.Net程序原碼的可執(zhí)行文件。其中,.Net程序原碼的編譯分為兩個(gè)階段,首先是將高級語言.Net程序原碼編譯成一種IL代碼,再將IL代碼編譯成可執(zhí)行文件。通常,編譯后得到的.Net可執(zhí)行文件中包含有如下信息標(biāo)準(zhǔn)的可執(zhí)行文件信息、區(qū)塊表和元數(shù)據(jù)表等。其中,標(biāo)準(zhǔn)的可執(zhí)行文件信息是指可執(zhí)行文件中標(biāo)準(zhǔn)的PE(PortableExecutable,可移植的可執(zhí)行文件)文件頭和區(qū)塊表。該P(yáng)E文件頭可以用來識(shí)別當(dāng)前文件是否為可執(zhí)行文件,區(qū)塊表是用來存放代碼、資源、數(shù)據(jù)等,元數(shù)據(jù)表也可以位于區(qū)塊表中,用來存放各種.Net數(shù)據(jù),如類、參數(shù)和函數(shù)等等。例如,有一個(gè).Net程序原碼,內(nèi)容如下namespaceConsoleAppclassProgramstaticvoidMain(string[]args)Stringstr=〃Thisisatest!Console.WriteLine(str);將上述.Net程序原碼編譯后得到可執(zhí)行文件ConsoleApp.exe,該可執(zhí)行文件的組成如下表所示表1tableseeoriginaldocumentpage6tableseeoriginaldocumentpage7其中,DosHeader禾口NTHeader為PE文件頭;SectionHeaders為區(qū)塊表頭;區(qū)塊表頭下面的內(nèi)容為區(qū)塊表,存放有引入表、輸出表、資源表、代碼等信息;CLRHeader為元數(shù)據(jù)表頭;MetaTables為元數(shù)據(jù)表。弓l入表包括ImportPages禾口ImportInformation。輸出表包括-ExportPages禾口ExportInformation。資源表包括ResourcePages禾口ResourceInformation。無用區(qū)塊表在表1中未示出。.Net程序原碼的可執(zhí)行文件的引入表是PE文件格式中的一個(gè)概念,它描述了PE文件中引入的其它關(guān)聯(lián)DLL(DynamicLinkLibrary,動(dòng)態(tài)鏈接庫)以及DLL中的函數(shù)。其中,DLL是作為共享函數(shù)庫的可執(zhí)行文件為動(dòng)態(tài)鏈接提供的一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個(gè)DLL中,該DLL包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開存儲(chǔ)的函數(shù)。DLL還有助于共享數(shù)據(jù)和資源。多個(gè)應(yīng)用程序可同時(shí)訪問內(nèi)存中單個(gè)DLL副本的內(nèi)容。DLL是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫。通過使用DLL,程序可以實(shí)現(xiàn)模塊化,由相對獨(dú)立的組件組成。例如,一個(gè)計(jì)帳程序可以按模塊來銷售,可以在運(yùn)行時(shí)將各個(gè)模塊加載到主程序中。因?yàn)槟K是彼此獨(dú)立的,所以程序的加載速度更快,而且模塊只在相應(yīng)的功能被請求時(shí)才加載。步驟202:在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息,該信息包括待注入代碼的引擎動(dòng)態(tài)鏈接庫和待注入代碼對應(yīng)的函數(shù)。以上述可執(zhí)行文件ConsoleApp.exe為例,其已引入了一個(gè)外部的DLL:mscoree.dl1,且引入了該mscoree.dl1中的一個(gè)輸出函數(shù)_CorExeMain,該可執(zhí)行文件ConsoleApp.exe的引入表具體如下[ImportTablesDllNameOriginaFirstTh皿kTimeDateStampForwarderChainNamemscoree.dll0000A23000000000000000000000A24CFirstTh皿kTh皿kRVATh皿kOffsetTh皿kValueHintApiName0000A2280000A230000068300000A23E0000_CorExeMain引入表中的上述信息均為mscoree.dll的相關(guān)信息,其中包括引入的外部DLL庫的名稱mscoree.dll,以及引入的函數(shù)的名稱CorExeMain等等。其中,mscoree.dl1是NetFramework相關(guān)組件,該文件是一個(gè)瀏覽器插件(BHO),每次當(dāng)用戶打開互聯(lián)網(wǎng)瀏覽器時(shí)它都會(huì)自動(dòng)打開及啟動(dòng)。BHO因?yàn)闀?huì)被認(rèn)定為瀏覽器本身,所以都不會(huì)被個(gè)人防火墻所阻擋,廣告和間諜程序都會(huì)利用到這個(gè)形式。_CorExeMain函數(shù)用來指示W(wǎng)indows加載程序在可執(zhí)行映像中查找入口點(diǎn)。本實(shí)施例以待注入代碼為Startup函數(shù)為例進(jìn)行說明,該Startup函數(shù)的引擎鏈接庫為Engine,dll,則在上述引入表中加入該待注入代碼的相關(guān)信息,得到如下的引入表ImportTablesJDllNameOriginaFirstThunkTimeDateStampForwarderChainNamemscoree.dllEngine,dllFirstTh皿k0000A2280000B6120000A2300000B5C0ThunkRVA0000A2300000B5C0上述Startup函數(shù)的形式可以如下B00L在這里實(shí)現(xiàn)本函數(shù)的功能,如加解密功能;0000A24C0000B602Th皿kOffsetTh皿kValueHintApiName00006830000098300000A23E0000B5CE00000000_CorExeMainStartupreturnTRUE;上述Startup函數(shù)的DLL庫具體如下B00LAPIENTRYDllMain(MODULEhModule,DWORDulreasonforcall,LPVOIDlpReserved)switch(ul_reason_for—call)caseDLL_PROCESS_ATTACH:{breakjcaseDLL_THREAD_ATTACH:caseDLL_THREAD_DETACH:caseDLL_PR0CESS_DETACH:breakjreturnTRUE;步驟203:用上述.Net可執(zhí)行文件的IAT(ImportAddressTable,導(dǎo)入地址表)和待注入代碼的地址,構(gòu)建新的IAT,IAT中描述了.Net可執(zhí)行文件所有引用的導(dǎo)入函數(shù)的真實(shí)地址。導(dǎo)入函數(shù)是指被.Net程序調(diào)用但其執(zhí)行代碼又不在.Net程序中的函數(shù),這些函數(shù)的代碼位于一個(gè)或者多個(gè)DLL中,當(dāng).Net可執(zhí)行文件被裝入內(nèi)存的時(shí)候,Windows裝載器才將該DLL裝入,并將調(diào)用導(dǎo)入函數(shù)的指令和該函數(shù)實(shí)際所處的地址聯(lián)系起來,完成動(dòng)態(tài)鏈接。其中,將調(diào)用導(dǎo)入函數(shù)的指令和該函數(shù)實(shí)際所處的地址聯(lián)系起來,就是依靠IAT來完成的。本實(shí)施例中,由于要在.Net可執(zhí)行文件中注入代碼,因此,需要在IAT中添加待注入代碼的地址。對于上述例子而言,需要在IAT中添加函數(shù)Startup的地址,以便于后續(xù)調(diào)用該函數(shù)時(shí)完成該函數(shù)的關(guān)聯(lián)。其中,原來的IAT中僅包含了.Net可執(zhí)行文件引入的輸出函數(shù)—CorExeMain的地址,具體如下Address3EA2000000000000在該IAT中添加函數(shù)Startup的地址后,得到的新的IAT具體如下[O川]Address3EA20000CEB5000000000000通常,由于原有的IAT占用的存儲(chǔ)空間是大小固定的,無法直接將Startup函數(shù)的地址添加到該IAT中,因此,采用如下方法構(gòu)建新的IAT:啟用一個(gè)新的地址,即開辟一塊新的存儲(chǔ)空間,將.Net可執(zhí)行文件的原有的IAT的內(nèi)容復(fù)制到該新的地址中,在復(fù)制的內(nèi)容之后添加待注入代碼的地址,構(gòu)建成新的IAT,該新的IAT的地址就是上述啟用的新的地址。例如,原有IAT存儲(chǔ)于地址0X2000,長度為4個(gè)字節(jié),啟用一個(gè)新的地址0X5000,長度為8個(gè)字節(jié),先將原有IAT中的內(nèi)容共4個(gè)字節(jié)復(fù)制到地址0X5000中,然后在其后添加Startup函數(shù)的地址占用4個(gè)字節(jié),則得到8個(gè)字節(jié)的新的IAT,該新的IAT的地址為0X5000。原有的IAT則棄用。步驟204:將.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為上述新的IAT的地址。其中,.Net可執(zhí)行文件的入口點(diǎn)偏移地址指向的是IAT的地址,由于已構(gòu)建了新的IAT,放棄了原有的IAT,且新的IAT的地址不再是原有IAT的地址,因此,需要將.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為新的IAT的地址,從而保證.Net可執(zhí)行文件正常的運(yùn)行。本實(shí)施例中,將.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為新的IAT的地址,其代碼實(shí)現(xiàn)具體如下/氺EntryPoint氺/IMAGE_NT_HEADERS*pNtHeader=NULL;pNtHeader=RtllmageNtHeader(pvBase,dwSize);PBYTEpEntryPoint=亂L;pEntryPoint=RtllmageRvaToVa(p腿eader,pvBase,pNtHeader->OptionalHeader.AddressOfEntryPoint,0);pEntryPoint+=2;/氺FF25氺/DWORDdwEEIAT=0x400000+RtlGetlatRva();0128]memcpy(pEntryPoint,(PBYTE)&dwEEIAT,4);0129]步驟205:將.Net可執(zhí)行文件中元數(shù)據(jù)表頭CLRHeader數(shù)據(jù)結(jié)構(gòu)中的標(biāo)記FLAGS的值設(shè)置為0,使得.Net可執(zhí)行文件在執(zhí)行時(shí)滿足微軟認(rèn)證要求。0130]其中,CLRHeader是.Net可執(zhí)行文件中的元數(shù)據(jù)表頭,是一種數(shù)據(jù)結(jié)構(gòu),用來描述元數(shù)據(jù)信息,當(dāng)其中的FLAGS的值為1時(shí),表示ILONLY,即只存在IL代碼,當(dāng)該FLAGS的值為0時(shí),表示混合編碼程序集,可以保證.Net可執(zhí)行文件在執(zhí)行時(shí)滿足微軟的認(rèn)證要求。0131]上述修改FLAGS值的具體代碼實(shí)現(xiàn)如下/氺CorFlags氺/IMAGE_C0R20_HEADER*pCor=NULL;pCor=RtllmageCorHeaderForPE(pvBase,dwSize);if(!pCor){_LastError=RESULT_META_DECODER_FAILD;returnFALSE;0132]0133]0134]0135]0136]0137]0138]0139]IL0NLY)0140]0141]IL_LIBR0142]0143]0144]if((pCor->Flags&C0MIMAGE_FLAGS_IL0NLY):pCor->Flags'=C0MIMAGE_FLAGS_IL0NLY;if((pCor->Flags&COMIMAGE_FLAGS_IL_LIBRARY)C0MIMAGEFLAGSCOMIMAGEFLAGSARY)pCor->Flags=COMIMAGE_FLAGS_IL_LIBRARY;經(jīng)過上述步驟已完成向.Net程序注入代碼,且可以保證注入代碼后的.Net可執(zhí)行文件可以正常運(yùn)行。0145]實(shí)施例20146]參見圖3,本實(shí)施例提供了一種在.Net程序中注入代碼的裝置,包括0147]寫入模塊301,用于在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息;0148]構(gòu)建模塊302,用于在.Net可執(zhí)行文件的導(dǎo)入地址表IAT中添加待注入代碼的地吐,構(gòu)建成新的IAT,將.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為新的IAT的地址;0149]修改模塊303,用于修改.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。0150]本實(shí)施例中,所述信息包括待注入代碼的引擎動(dòng)態(tài)鏈接庫和待注入代碼對應(yīng)的函數(shù)。0151]其中,構(gòu)建模塊302具體包括0152]構(gòu)建單元,用于啟用一個(gè)新的地址,將.Net可執(zhí)行文件的導(dǎo)入地址表IAT的內(nèi)容復(fù)制到新的地址中,在復(fù)制的內(nèi)容之后添加待注入代碼的地址,構(gòu)建成新的IAT,新的IAT的地址為新的地址。0153]修改模塊303具體包括0154]修改單元,用于將.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記修改為O,使得.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。進(jìn)一步地,上裝置還可以包括編譯模塊304,用于在寫入模塊301在.Net可執(zhí)行文件的引入表中加入待注入代碼的信息之前,將.Net程序原碼編譯成.Net可執(zhí)行文件。本發(fā)明實(shí)施例提供的上述方法和裝置,實(shí)現(xiàn)了對.Net可執(zhí)行文件注入代碼,拋棄了對匯編和反匯編工具的依賴,容易實(shí)現(xiàn),解決了.Net可執(zhí)行文件注入代碼效率低、穩(wěn)定性和兼容性差的問題。本發(fā)明實(shí)施例提供的上述技術(shù)方案的全部或部分可以通過程序指令相關(guān)的硬件來完成,程序可以存儲(chǔ)在可讀取的存儲(chǔ)介質(zhì)中,該存儲(chǔ)介質(zhì)包括ROM、RAM、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求一種在.Net程序中注入代碼的方法,其特征在于,所述方法包括在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息;在所述.Net可執(zhí)行文件的導(dǎo)入地址表IAT中添加待注入代碼的地址,構(gòu)建成新的IAT;將所述.Net可執(zhí)行文件的入口點(diǎn)偏移地址修改為所述新的IAT的地址;修改所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在導(dǎo)入地址表IAT中添加待注入代碼的地址,構(gòu)建成新的IAT,具體包括啟用一個(gè)新的地址,將所述.Net可執(zhí)行文件的導(dǎo)入地址表IAT的內(nèi)容復(fù)制到所述新的地址中;在復(fù)制的內(nèi)容之后添加待注入代碼的地址,構(gòu)建成新的IAT,所述新的IAT的地址為所述新的地址。3.根據(jù)權(quán)利要求1所述的方法,其特征在于,修改所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求,具體包括將所述.Net可執(zhí)行文件中元數(shù)據(jù)表頭中的標(biāo)記修改為0,使得所述.Net可執(zhí)行文件在執(zhí)行時(shí)滿足認(rèn)證要求。4.根據(jù)權(quán)利要求1所述的方法,其特征在于,在.Net可執(zhí)行文件的引入表中寫入待注入代碼的信息之前,還包括將.Net程序原碼編譯成.Net可執(zhí)行文件。5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述信息包括所

溫馨提示

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

最新文檔

評論

0/150

提交評論