版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
麥洛克菲移動(dòng)安全培訓(xùn)
第二課
分析技術(shù)友情提示上課時(shí)間請(qǐng)勿:--請(qǐng)將您手機(jī)改為“震動(dòng)”
避免在課室里使用手機(jī)--交談其他事宜--隨意進(jìn)出教室請(qǐng)勿在室內(nèi)吸煙上課時(shí)間歡迎:--提問題和積極回答問題--隨時(shí)指出授課內(nèi)容的不當(dāng)之處提綱基礎(chǔ)知識(shí)分析方法分析工具基礎(chǔ)知識(shí)導(dǎo)引分析主要是分析出目標(biāo)是什么東西,采用了什么原理,最終達(dá)到我們能夠檢測(cè),發(fā)現(xiàn),偽造或者仿制一個(gè)。只要我們思路正確,基本上都能分析清楚目標(biāo)分析本身是一個(gè)自我學(xué)習(xí),自我認(rèn)知的過程總結(jié)一句話:分析就是為了搞清楚目標(biāo)是什么?為什么以及怎么做的問題
分析總體思路目標(biāo)從何處而來?目標(biāo)是什么?目標(biāo)為什么這樣做?自己實(shí)現(xiàn)一個(gè)應(yīng)該怎么做?
移動(dòng)平臺(tái)由于實(shí)時(shí)性,便攜性等要求,一般采用RISC體系,主要有armcpu,少量的mips,主要的操作系統(tǒng)有l(wèi)inux和ios,少量的wince和wphone。我們主要關(guān)注arm體系,linux和iOS操作系統(tǒng)。目標(biāo)是什么?在確定目標(biāo)是什么之前我們要研究目標(biāo)從何處得到1.從網(wǎng)絡(luò)抓包中得到2.從內(nèi)存中dump得到3.從文件系統(tǒng)中得到從1,2中得到可能只是有效的加密數(shù)組或者是文件的內(nèi)存鏡像,從3中得到的如果能運(yùn)行必須滿足目標(biāo)體系的運(yùn)行要求,就是說有些不僅僅是一個(gè)文件還有配置文件,其他信息目標(biāo)是什么?移動(dòng)平臺(tái)抓包1.用tcpdump直接傳到root或者越獄的iphone上,使用以下命令抓包./tcpdump-iany-p-s0-w/sdcard/capture.pcap上面命令最后一個(gè)是存放的文件路徑,在iphone可以放在/var/root/下。2.抓http的包,可以用Charles做代理,抓包,適用ios和windows3.用筆記本做熱點(diǎn),然后讓手機(jī)連入這個(gè)熱點(diǎn),用Wiresharks對(duì)這個(gè)虛擬出的wifi地址抓包。適用windows和ios目標(biāo)是什么??jī)?nèi)存抓取主要用在殼的分析上,比如移動(dòng)平臺(tái)的加固分析。根據(jù)不同的時(shí)機(jī),使用ida的腳本功能dump需要的數(shù)據(jù)。目標(biāo)是什么?文件分析Linux:file,strings,hexdump,010editor,dd,binwalk,idaldd,nm,readelf,objdumpWindows下的linux工具使用借助cgywin目標(biāo)是什么?Android:dex2jar:dex轉(zhuǎn)換成jarjd:查看jar的源碼JEB:查看源碼的綜合工具vst:smali源碼修改dexdump:系統(tǒng)自帶的查看dex格式的工具
目標(biāo)是什么?Mac:Otools:查看mach-o格式的machOView:查看mach-o文件格式的函數(shù)class-dump:dump類信息和函數(shù)dyld-decache:解密系統(tǒng)decache的工具dyldinfo:查看動(dòng)態(tài)鏈接庫(kù)Clutch:移除appstore保護(hù)目標(biāo)是什么HelloJni.apkUnflod.dylibCalculator目標(biāo)是什么Classes.dexjava代碼在android上面的表現(xiàn),看懂需要了解一種叫smali的opcodeLib/hellojni.soc語言編譯出的,看懂需要了解一種叫arm的匯編代碼AndroidManifest.xml看懂需要了解android語言的一些知識(shí)目標(biāo)是什么?dex2jar.shclasses.dexJar–jarAXMLPrinter2.jarAndroidManifest.xmlBaksmali 通過baksmali,在smail格式上的修改可以重新生成對(duì)應(yīng)的dexjava-jarbaksmali-x.x.x.jarclasses.dexjava-jarsmali-x.x.x.jarout_file目標(biāo)是什么HelloJni.apkfileHelloJni.apkHelloJni.apk:Ziparchivedata,atleastv2.0toextractxxx:toolsberry$fileUnflod.dylibUnflod.dylib:Mach-Odynamicallylinkedsharedlibraryarmxxx:toolsberry$fileCalculatorCalculator:Mach-O64-bitexecutablex86_64目標(biāo)是什么berry$stringsUnflod.dylib</plist>5allocinitrelease/WebObjects/MZFinance.woa/wa/authenticateHTTP/1.1<key>appleId</key><key>password</key>目標(biāo)是什么目標(biāo)是什么思考:1.從上一個(gè)圖表中我們能看出什么?2.為什么ida6.1以后版本能反匯編dex文件,而以前版本不能,怎么樣支持一個(gè)未知格式的文件反匯編?目標(biāo)是什么:總結(jié)拿到目標(biāo)后,我們先確定目標(biāo)從哪里來,如果從文件里來,查看文件的格式,是有格式文件還是加密數(shù)據(jù),如果是有格式文件,找到對(duì)應(yīng)的文檔說明,找到查看文件格式的工具
或者反編譯目標(biāo)文件格式,分析文件格式內(nèi)
的匯編代碼或者opcode
基礎(chǔ)知識(shí):opcode1.dex格式:smaliopcode2.elf格式:
armopcode3.macho格式此節(jié)我們只講smaliopcode和armopcode在下一講開發(fā)種講解dex格式和elf格式 Smali語法
smali語法
一種包含DavlikOpcodes的類匯編語言格式語法,可以看成Dex文件反編譯對(duì)應(yīng)的偽代碼通過smali語法構(gòu)成類匯編語言。可以理解如下: JAR javabytecodes DexDavlikopcodes
smali語法
這種語法類似于jasmin語法(/),可以通過學(xué)習(xí)Davlikopcodes和Jasmin語法(/instructions.html)來讀懂Smali,還可以參考http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html smali語法Davlik字節(jié)碼中,寄存器都是32位的,能夠支持任何類型,64位類型(Long/Double)用2個(gè)寄存器表示:
Dalvik字節(jié)碼有兩種類型:原始類型;引用類型(包括對(duì)象和數(shù)組)原始類型:vvoid只能用于返回值類型
ZbooleanBbyteSshortCcharIintJlong(64位)
FfloatDdouble(64位) smali語法對(duì)象類型:Lpackage/name/ObjectName;相當(dāng)于java中
的.ObjectName;解釋如下:
L:表示這是一個(gè)對(duì)象類型package/name:該對(duì)象所在的包,:表示對(duì)象名稱的結(jié)束數(shù)組的表示形式: [I:表示一個(gè)整形的一維數(shù)組,相當(dāng)于java的int[];
對(duì)于多維數(shù)組,只要增加[就行了,[[I=int[][];注:每一維最多255個(gè);對(duì)象數(shù)組的表示形式: [Ljava/lang/String表示一個(gè)String的對(duì)象數(shù)組; smali語法方法的表示形式:Lpackage/name/ObjectName;——>methodName(III)Z詳解如下:Lpackage/name/ObjectName表示類型methodName表示方法名III表示參數(shù)(這里表示為3個(gè)整型參數(shù))說明:方法的參數(shù)是一個(gè)接一個(gè)的,中間沒有隔開;
字段的表示形式:Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String表示:包名,字段名和各字段類型 smali語法有兩種方式指定一個(gè)方法中有多少寄存器是可用的:.registers指令指定了方法中寄存器的總數(shù).locals指令表明了方法中非參寄存器的總數(shù),出現(xiàn)在方法中的第一方法的傳參:當(dāng)一個(gè)方法被調(diào)用的時(shí)候,方法的參數(shù)被置于最后N個(gè)寄存器中;例如,一個(gè)方法有2個(gè)參數(shù),5個(gè)寄存器(v0~v4)那么,參數(shù)將置于最后2個(gè)寄存器(v3和v4)非靜態(tài)方法中的第一個(gè)參數(shù)總是調(diào)用該方法的對(duì)象;一般都為p0說明:對(duì)于靜態(tài)方法除了沒有隱含的this參數(shù)外,其他都一樣 smali語法寄存器的命名方式:
V命名P命名第一個(gè)寄存器就是方法中的第一個(gè)參數(shù)寄存器比較:使用P命名是為了防止以后如果在方法中增加寄存器,需要對(duì)參數(shù)寄存器重新進(jìn)行編號(hào)的缺點(diǎn)特別說明一下:Long和Double類型是64位的,需要2個(gè)寄存器例如:對(duì)于非靜態(tài)方法LMyObject——>myMethod(IJZ)V;有4個(gè)參數(shù):LMyObject,int,long,bool;需要5個(gè)寄存器來存儲(chǔ)參數(shù);P0thisP1I(int)P2,P3J(long) -空間對(duì)齊,long需要2個(gè)寄存器P4Z(bool)逆向:voidMyObject->myMethod(int,long,bool) smali語法#staticfields
定義靜態(tài)變量的標(biāo)記#instancefields
定義實(shí)例變量的標(biāo)記#directmethods
定義靜態(tài)方法的標(biāo)記#virtualmethods
定義非靜態(tài)方法的標(biāo)記
arm匯編學(xué)習(xí)arm匯編我們主要關(guān)注兩點(diǎn):1.arm調(diào)用規(guī)范
2.arm匯編指令集 arm函數(shù)調(diào)用約定
要想理解匯編代碼,首先重要的事情就是理解代碼之間的交互——意思是一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)的方式。這包括了參數(shù)如何傳遞以及如何從函數(shù)返回結(jié)果——稱之為調(diào)用的約定。編譯器必須嚴(yán)格的遵守相關(guān)標(biāo)準(zhǔn)進(jìn)行代碼編譯,這樣生成的代碼,才能夠相互兼容。上面討論過,寄存器是的存儲(chǔ)空間非常少,并且靠近CPU——用來存儲(chǔ)當(dāng)前使用的一些值。ARMCPU有16個(gè)寄存器:r0到r15。每個(gè)寄存器為32bit。調(diào)用約定規(guī)定了這些寄存器的特定用途。如下:r0–r3:存儲(chǔ)傳遞給函數(shù)的參數(shù)值。r4–r11:存儲(chǔ)函數(shù)的局部變量。r12:是內(nèi)部過程調(diào)用暫時(shí)寄存器(intra-procedure-callscratchregister)。r13:存儲(chǔ)棧指針(sp)。在計(jì)算機(jī)中,棧非常重要。這個(gè)寄存器保存著棧頂?shù)闹羔?。這里可以看到更多關(guān)于棧的信息。r14:鏈接寄存器(linkregister)。存儲(chǔ)著當(dāng)被調(diào)用函數(shù)返回時(shí),將要執(zhí)行的下一條指令的地址。r15:用作程序計(jì)數(shù)器(programcounter)。存儲(chǔ)著當(dāng)前執(zhí)行指令的地址。每條執(zhí)行被執(zhí)行后,該計(jì)數(shù)器會(huì)進(jìn)行自增(+1)。 arm函數(shù)調(diào)用約定函數(shù)的返回值放到r0中?,F(xiàn)在我們查看剛進(jìn)入函數(shù)的時(shí)候:pc總是包含下一個(gè)要被執(zhí)行的指令的位置。arm7采用三級(jí)流水(1)取指(fetch)取指級(jí)的任務(wù)是從程序存儲(chǔ)器中讀取指令。(2)譯碼(decode)譯碼級(jí)完成對(duì)指令的分析,并為下一個(gè)周期準(zhǔn)備數(shù)據(jù)路徑需要的控制信號(hào)。在這一級(jí),指令占用譯碼邏輯,不占用數(shù)據(jù)通路。(3)執(zhí)行(excute)完成指令要求的操作,并根據(jù)需要將結(jié)果寫回寄存器。指令占用數(shù)據(jù)路徑,寄存器堆被讀取,操作數(shù)在桶行移位器中被移位。運(yùn)算器產(chǎn)生運(yùn)算結(jié)果并回寫到目的寄存器中,運(yùn)算器根據(jù)指令需求和運(yùn)輸結(jié)果更改狀態(tài)寄存器的條件位
arm7中執(zhí)行和取指是隔了一級(jí)譯碼級(jí),那一級(jí)不讀取數(shù)據(jù),當(dāng)前PC=原PC+8lr(總是)包含函數(shù)返回時(shí)要裝載的地址。 arm匯編指令我們主要講幾個(gè)重要的指令1.跳轉(zhuǎn)指令2.LDM和STM指令3.LDR和STR指令
跳轉(zhuǎn)指令
在ARM中有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn),一種是使用跳轉(zhuǎn)指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實(shí)現(xiàn)跳轉(zhuǎn)。跳轉(zhuǎn)指令有跳轉(zhuǎn)指令B,帶鏈接的跳轉(zhuǎn)指令BL帶狀態(tài)切換的跳轉(zhuǎn)指令BX。表A-6給出全部的ARM跳轉(zhuǎn)指令 LDM和STM指令
LDM:LoadfrommemoryintoregisterLDMFD
SP!,
{R0,R1,R2}把sp指向的3個(gè)連續(xù)地址段(應(yīng)該是3*4=12字節(jié)(因?yàn)闉閞0,r1,r2都是32位))中的數(shù)據(jù)拷貝到r0,r1,r2這3個(gè)寄存器中去STM:S的含義仍然是STORE,與LDM是配對(duì)使用STMFD
SP!,
{R0}把R0保存到堆棧(sp指向的地址)中sp后面的!,作用是指命令執(zhí)行完后,對(duì)應(yīng)的地址值賦給sp,對(duì)于例程的SDM,是說最后sp的值應(yīng)該是sp+3*4=sp+12 LDR和STR指令
LDR和STR
加載/存儲(chǔ)字和無符號(hào)字節(jié)指令。使用單一數(shù)據(jù)傳送指令(STR和LDR)來裝載和存儲(chǔ)單一字節(jié)或字的數(shù)據(jù)從/到內(nèi)存。LDR指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中;STR指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存。LDRR1,[R0,#0x12];將R0+0x12地址處的數(shù)據(jù)讀出,保存到R1中(R0的值不變)
STRR1,[R0];保存變量值
總結(jié)
關(guān)于smali和arm的指令,要想快速學(xué)習(xí),請(qǐng)用相應(yīng)的語言自己寫出程序的基本結(jié)構(gòu),然后對(duì)著指令手冊(cè),依次把反編譯后的opcode恢復(fù)成對(duì)應(yīng)的高級(jí)語言??梢詤⒖?lt;<Android軟件安全與逆向分析>>相關(guān)介紹
思考既然java是語言,他是怎么與操作系統(tǒng)交互的,他能不能調(diào)用c函數(shù)?
能,使用jni接口(javanativeinterface)
如果這樣的話,java和c之間是通過什么接
口或者規(guī)范調(diào)用的
jni接口如果要讀懂smali語法,除了要了解jasmin語法外,還要了解
AndroidJNI和Java方法描述的知識(shí)Andoird中使用了一種不同傳統(tǒng)JavaJNI的方式來定義其native的函數(shù)。其中很重要的區(qū)別是Andorid使用了一種Java和C函數(shù)的映射表數(shù)組,并在其中描述了函數(shù)的參數(shù)和返回值。這個(gè)數(shù)組的類型是JNINativeMethod jni接口
定義如下:typedefstruct{constchar*name;/*Java中函數(shù)的名字*/constchar*signature;/*描述了函數(shù)的參數(shù)和返回值*/void*fnPtr;/*函數(shù)指針,指向C函數(shù)*/
}JNINativeMethod;其中比較難以理解的是第二個(gè)參數(shù),例如"()V”"(II)V"
"(Ljava/lang/String;Ljava/lang/String;)V”
jni接口實(shí)際上這些字符是與函數(shù)的參數(shù)類型一一對(duì)應(yīng)的。"()"中的字符表示參數(shù),后面的則代表返回值。例如"()V"就表示voidFunc();"(II)V"表示voidFunc(int,int);字符Java類型C類型VvoidvoidZjbooleanbooleanIjintint
Jjlonglong
Djdoubledouble
FjfloatfloatBjbytebyte
CjcharcharSjshortshort jni接口數(shù)組則以"["開始,用兩個(gè)字符表示[IjintArrayint[][FjfloatArrayfloat[][BjbyteArraybyte[]
[CjcharArraychar[][SjshortArrayshort[][DjdoubleArraydouble[]
[JjlongArraylong[]
[ZjbooleanArrayboolean[] jni接口上面的都是基本類型。如果Java函數(shù)的參數(shù)是class,則以"L"開頭,以";"結(jié)尾,中間是用"/"隔開的包及類名。而其對(duì)應(yīng)的C函數(shù)名的參數(shù)則為jobject.一個(gè)例外是String類,其對(duì)應(yīng)的類為jstring
Ljava/lang/String;StringjstringLjava/net/Socket;Socketjobject如果JAVA函數(shù)位于一個(gè)嵌入類,則用$作為類名間的分隔符。例如"(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z”這個(gè)就是我們把他叫做內(nèi)部類,內(nèi)部類在逆向中要特別注意怎么逆向(ida,jeb,后面要講到) jni接口1.Helloworld(第一種接口)publicnativeStringstringFromJNI();jstringJava_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env,jobjectthiz){ return(*env)->NewStringUTF(env,"HellofromJNI!);} jni接口第二種接口#include<stdlib.h>#include<string.h>#include<stdio.h>#include<jni.h>#include<assert.h>JNIEXPORTjstringJNICALLhello(JNIEnv*env,jclassclazz){ printf("hello"); return(*env)->NewStringUTF(env,"hello.");}#defineJNIREG_CLASS“com/jni/Hello” jni接口staticJNINativeMethodgMethods[]={ {“hello”,“()Ljava/lang/String;”,(void*)hello}};staticintregisterNativeMethods(JNIEnv*env,constchar*className,JNINativeMethod*gMethods,intnumMethods){ jclassclazz; clazz=(*env)->FindClass(env,className); if(clazz==NULL){ returnJNI_FALSE; } if((*env)->RegisterNatives(env,clazz,gMethods,numMethods)<0){ returnJNI_FALSE; } returnJNI_TRUE;} jni接口staticintregisterNatives(JNIEnv*env){ if(!registerNativeMethods(env,JNIREG_CLASS,gMethods,sizeof(gMethods)/sizeof(gMethods[0]))) returnJNI_FALSE; returnJNI_TRUE;}JNIEXPORTjintJNICALLJNI_OnLoad(JavaVM*vm,void*reserved){ JNIEnv*env=NULL; jintresult=-1; if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)!=JNI_OK){ return-1; } assert(env!=NULL); if(!registerNatives(env)){
return-1; } /*success--returnvalidversionnumber*/ result=JNI_VERSION_1_4; returnresult;} jni接口分析jni的時(shí)候,注意java端的函數(shù)在c端的參數(shù)會(huì)多出兩個(gè):一個(gè)是this指針env,另一個(gè)是jobject。然后才是第一個(gè)參數(shù),第二個(gè)參數(shù)。我們只需要在so的導(dǎo)入表中查看JNI_onload或者按java類名字命名的函數(shù)。
jni接口反編譯.text:00000BC4Java_com_example_hellojni_HelloJni_stringFromJNI.text:00000BC4publicnativeStringstringFromJNI(env,object);.text:00000BC4var_C=-0xC.text:00000BC4var_8=-8.text:00000BC4.text:00000BC4STMFDSP!,{R11,LR}//入口.text:00000BC8ADDR11,SP,#4.text:00000BCCSUBSP,SP,#8.text:00000BD0STRR0,[R11,#var_8]//env.text:00000BD4STRR1,[R11,#var_C]//object.text:00000BD8LDRR3,[R11,#var_8].text:00000BDCLDRR3,[R3]//*env.text:00000BE0LDRR2,[R3,#0x29C]// 1:env->?.text:00000BE4LDRR0,[R11,#var_8].text:00000BE8LDRR3,=(aHelloFromJniCo-0xBF4)2:.text:00000BECADDR3,PC,R3;"HellofromJNI!CompiledwithABIarm"....text:00000BF0MOVR1,R3.text:00000BF4BLXR2.text:00000BF8MOVR3,R0.text:00000BFCMOVR0,R3.text:00000C00SUBSP,R11,#4.text:00000C04LDMFDSP!,{R11,PC}//出口.text:00000C04;EndoffunctionJava_com_example_hellojni_HelloJni_stringFromJNI jni接口反編譯1.env->?Ins鍵或者Edit->Ins添加標(biāo)準(zhǔn)結(jié)構(gòu)體JNIInvokeInterfaceJNINativeInterface然后回到匯編中,對(duì)著0x29c按t,就會(huì)出現(xiàn)函數(shù)JNINativeInterface.NewStringUTF jni接口反編譯2.手動(dòng)找字符串
:00000BE8LDRR3,=0x143C:00000BECADDR3,PC,R30x143c+0xBEC+8=0x2030,得到字符串地址windows上我們知道是當(dāng)前地址+4,pc指向當(dāng)前地址+8,為什么?因?yàn)閍rm指令流水線操作怎么恢復(fù)紅色的部分:轉(zhuǎn)化成數(shù)據(jù),重新分析 jni接口反編譯多參數(shù)分析見<多參數(shù)接口分析.txt>
分析方法分析程序前,先要安裝程序感知功能,了解下程序的工作流程,然后思考怎么去定位這個(gè)功能。分析方法主要包括靜態(tài)方法和動(dòng)態(tài)方法。
靜態(tài)方式主要通過工具不運(yùn)行程序得到程序的基本信息。通過解包,解密,查找字符串,關(guān)鍵函數(shù)分析,關(guān)鍵結(jié)構(gòu)大小識(shí)別,類信息識(shí)別,分析證書等。靜態(tài)分析:android參考:<android程序分析流程總結(jié).txt>靜態(tài)分析:android注意事項(xiàng)Android分析注意:1.函數(shù)調(diào)用2.內(nèi)部類,抽象類3.字符串引用靜態(tài)分析:android注意事項(xiàng)函數(shù)調(diào)用1.把dex2jar中得到的代碼導(dǎo)入到eclipse,查看調(diào)用2.從ida中查看調(diào)用3.從JEB中查看調(diào)用4.從logcat的日志崩潰中查看調(diào)用靜態(tài)分析:android注意事項(xiàng)內(nèi)部類1.從ida中查看2.從JEB中查看抽象類1.把dex2jar中得到的代碼導(dǎo)入到eclipse,查看調(diào)用2.搜索externw;靜態(tài)分析:android注意事項(xiàng)字符串引用搜索字符串對(duì)應(yīng)的數(shù)字,通過此種方法定位UI操作靜態(tài)分析:IOS1.如果從正版市場(chǎng)里下的app,我們可以從第三方市場(chǎng)找對(duì)應(yīng)的程序,或者用clutch在越獄環(huán)境下,去除保護(hù)。2.class-dump出函數(shù)信息3.ida反匯編,分析具體關(guān)鍵函數(shù)的調(diào)用
動(dòng)態(tài)分析靜態(tài)分析主要就是反編譯apk,分析反編譯之后的代碼。動(dòng)態(tài)分析主要就是讓程序運(yùn)行起來,獲取程序運(yùn)行過程中產(chǎn)生的api調(diào)用,從而獲取其行為信息。
主要用在自動(dòng)化分析系統(tǒng)中,分析系統(tǒng)的大多數(shù)行為。
動(dòng)態(tài)方法:android1.查看程序運(yùn)行的log的方法如果有l(wèi)og,從log日志找到關(guān)鍵信息。如果沒有l(wèi)og信息,可以先分析程序,看有沒有l(wèi)og函數(shù),這些
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 放射科CT檢查操作規(guī)范指南
- 老年癡呆綜合癥康復(fù)護(hù)理方案
- 預(yù)防醫(yī)學(xué)科流感疫苗接種流程
- 藥品經(jīng)營(yíng)流程管理規(guī)范
- 肺動(dòng)脈高壓患者運(yùn)動(dòng)訓(xùn)練計(jì)劃
- 風(fēng)濕免疫科紅斑狼瘡臨床診治規(guī)范指南
- 小青春期女孩教育指南
- 會(huì)計(jì)制度設(shè)計(jì)
- 《GBT 15964-2008地毯 單位長(zhǎng)度和單位面積絨簇或絨圈數(shù)目的測(cè)定方法》專題研究報(bào)告
- 《GBT 18704-2008結(jié)構(gòu)用不銹鋼復(fù)合管》專題研究報(bào)告
- 喉癌患者吞咽功能康復(fù)護(hù)理
- DB32∕T 5167-2025 超低能耗建筑技術(shù)規(guī)程
- 2025-2026學(xué)年北師大版六年級(jí)數(shù)學(xué)上冊(cè)期末測(cè)試卷及答案
- 地球小博士知識(shí)競(jìng)賽練習(xí)試題及答案
- 殯儀館鮮花采購(gòu)?fù)稑?biāo)方案
- 中小學(xué)生意外傷害防范
- 動(dòng)靜脈瘺課件
- 企業(yè)ESG審計(jì)體系構(gòu)建-洞察及研究
- 2025年信用報(bào)告征信報(bào)告詳版?zhèn)€人版模板樣板(可編輯)
- 藥品生產(chǎn)培訓(xùn)課件
- 《先張法預(yù)應(yīng)力混凝土實(shí)心方樁技術(shù)規(guī)程》
評(píng)論
0/150
提交評(píng)論