《WindowsPE文件格式PPT课件.pptx》由会员分享,可在线阅读,更多相关《WindowsPE文件格式PPT课件.pptx(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章 内容nPE文件n相关术语nPE文件格式详解nWindows病毒原理1. PE文件nPE(Portable Executable)是Win32可执行文件的标准格式,如*.EXE、*.DLL、*.OCX等,都是PE格式n病毒籍EXE文件被执行时传播,Win32病毒感染文件时,基本上将EXE文件作为目标Win32病毒运行流程nWin32病毒运行流程病毒运行流程用户点击或系统自动运行HOST程序;装载HOST程序到内存;由PE文件的AddressOfEntryPoint加ImageBase之和,定位第一条语句的位置(程序入口);从第一条语句开始执行(其实是病毒代码);病毒主体代码执行完毕,将控
2、制权交给HOST程序原来的入口代码;HOST程序继续执行。问题计算机病毒怎会在HOST程序之前执行?2. 术语n文件偏移地址文件偏移地址()()PE文件存储在磁盘上,各数据段的地址称为文件偏移地址或物理地址(raw offset)。文件偏移地址从PE文件的第一个字节开始计数,起始值为0不能映射的数据.reloc.data.textDOS头节表PE头.reloc.data.textDOS头节表PE头文件头文件尾磁盘中的PE文件映射到内存中文件偏移地址基地址(ImageBase)某一虚拟地址(VA)相对虚拟地址(RVA)术语(续)n入口点(入口点(Entry pointEntry point)程序
3、执行的第一行代码n基地址基地址(Image base)(Image base)p文件执行时将被映射到指定内存地址的存初始地址,由PE文件本身决定。默认,EXE:0 x00400000, DLL:0 x1000000。用链接程序的/BASE选项改变该值术语(续)n虚拟地址虚拟地址( (Virtual Address,VA)Virtual Address,VA)保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(VA),内存偏移地址(memory offset)n相对虚拟地址相对虚拟地址( (Relative Virtual AddressRelative Virtual Address,RV
4、ARVA) ) 指内存中相对于PE文件装入地址(基地址)的偏移量 RVA=VA imagebase3. PE文件结构nPE文件总体层次结构MZ文 件 头 :DOS MZ HEADERDOS插 桩 程 序 :DOS StubIMAGE_SECTION_HEADERIMAGE_SECTION_HEADERIMAGE_SECTION_HEADERIMAGE_SECTION_HEADER.text.data.edata.reloc.COFF行 号COFF符 号 表Code View调 试 信 息PE文 件 标 志 :“ PE00”映 像 文 件 头 :IMAGE_FILE_HEADER可 选 映 像
5、头 :IMAGE_OPTIONAL_HEADER32数 据 目 录 表 :IMAGE_DATA_DIRECTORYDOS头PE文 件 头节 表(Section Table)节(Section)调 试 信 息文 件 头文 件 尾3.1 DOS头与DOS插桩程序nDOS头与DOS插桩程序PE结构中紧随MZ文件头之后的DOS插桩程序(DOS Stub)IMAGE_DOS_HEADER结构识别一个合法的DOS头该结构的e_lfanew(偏移60,32bits)成员定位PE开始的标志0 x00004550(“PE00”)病毒通过“MZ”、“PE”这两个标志,初步判断当前程序是否是目标文件PE文件。DOS
6、头数据结构头数据结构typedef struct _IMAGE_DOS_HEADER typedef struct _IMAGE_DOS_HEADER / DOS的.EXE头部 USHORT e_magic; / 魔术数字 “MZ”“MZ” USHORT e_cblp; / 文件最后页的字节数 USHORT e_cp; / 文件页数 USHORT e_crlc; / 重定义元素个数 USHORT e_cparhdr; / 头部尺寸,以段落为单位 USHORT e_minalloc; / 所需的最小附加段 USHORT e_maxalloc; / 所需的最大附加段 USHORT e_ss; /
7、初始的SS值(相对偏移量) USHORT e_sp; / 初始的SP值 USHORT e_csum; / 校验和 USHORT e_ip; / 初始的IP值 USHORT e_cs; / 初始的CS值(相对偏移量) USHORT e_lfarlc; / 重分配表文件地址 USHORT e_ovno; / 覆盖号 USHORT e_res4; / 保留字 USHORT e_oemid; / OEM标识符(相对e_oeminfo) USHORT e_oeminfo; / OEM信息 USHORT e_res210; / 保留字 LONG e_lfanew; / LONG e_lfanew; / 新
8、新EXEEXE头部的文件地址头部的文件地址 003c 003c IMAGE_DOS_HEADER, IMAGE_DOS_HEADER, * *PIMAGE_DOS_HEADER;PIMAGE_DOS_HEADER;PE文件加载流程Major steps in loading a PE memory:nWhen the PE run, the PE loader examines the DOS MZ header for the offset of the PE header. If found, it skips to the PE header. nThe PE loader checks
9、 if the PE header is valid. If so, it goes to the end of the PE header. nImmediately following the PE header is the section table. The PE header reads information about the sections and maps those sections into memory using . It also gives each section the attributes as specified in the section tabl
10、e. nAfter the PE mapped into memory, the PE loader concerns itself with the logical parts of the PE file, such as the import table. 3.2 PE文件头nPE文件头紧接着DOS Stub的是PE headerPE header是IMAGE_NT_HEADERS的简称,即NT映像头(PE文件头),存放PE整个文件信息分布的重要字段,包含了许多PE装载器用到的重要域。执行体在支持PE文件结构的操作系统中执行时PE装载器将从DOS MZ header中找到PE heade
11、r的起始偏移量,从而跳过DOS Stub直接定位到真正的文件头PE headerPE文件头(续)nPE文件头结构字符串“PE00”(Signature)(4H字节) IMAGE_NT_HEADERS STRUCT Signature dd ? IMAGE_ OptionalHeader IMAGE_OPTIONAL_HEADER32 IMAGE_NT_HEADERS ENDSPE文件头-映像文件头映像文件头,包含有PE文件的基本信息typedef struct _IMAGE_ typedef struct _IMAGE_ WORD Machine; / 0 x04,该程序要执行的环境及平台 W
12、ORD NumberOfSections;WORD NumberOfSections; / 0 x06/ 0 x06,文件中节的个数,文件中节的个数 DWORD TimeDateStamp; / 0 x08,文件建立的时间 DWORD PointerToSymbolTable; / 0 x0c,COFF符号表的偏移 DWORD NumberOfSymbols; / 0 x10,符号数目 WORD SizeOfOptionalHeader;WORD SizeOfOptionalHeader; / 0 x14/ 0 x14,可选头的长度可选头的长度 WORD Characteristics; /
13、0 x16,标志集合 IMAGE_, IMAGE_, * *PIMAGE_;PIMAGE_;PE文件头-可选映像头n可选映像头typedef struct _IMAGE_OPTIONAL_HEADER / 标准域: WORD Magic; / 0 x18,一般是0 x010B BYTE MajorLinkerVersion; / 0 x1a,链接器的主/次版本号, BYTE MinorLinkerVersion; / 0 x1b,这两个值都不可靠 DWORD SizeOfCode; / 0 x1c,可执行代码的长度 DWORD SizeOfInitializedData; / 0 x20,初始
14、化数据的长度(数据节) DWORD SizeOfUninitializedData; / 0 x24,未初始化数据的长度(bss节) DWORD AddressOfEntryPoint;DWORD AddressOfEntryPoint; / 0 x28/ 0 x28,代码的入口代码的入口RVARVA地址地址 DWORD BaseOfCode; / 0 x2c,可执行代码起始位置,意义不大 DWORD BaseOfData; / 0 x30,初始化数据起始位置,意义不大 / NT 附加域: DWORD ImageBase; DWORD ImageBase; / 0 x34/ 0 x34,载入程
15、序首选的,载入程序首选的RVARVA地址地址 DWORD SectionAlignment;DWORD SectionAlignment; / 0 x38/ 0 x38,加载后节在内存中的对齐方式,加载后节在内存中的对齐方式 DWORD ;DWORD ; / 0 x3c/ 0 x3c,节节在文件中的在文件中的对齐对齐方式方式(待续)PE文件头-可选映像头(续续) WORD MajorOperatingSystemVersion; / 0 x3e,操作系统主/次版本, WORD MinorOperatingSystemVersion; / 0 x40,Loader并没有用这两个值 WORD Ma
16、jorImageVersion; / 0 x42,可执行文件主/次版本 WORD MinorImageVersion; / 0 x44 WORD MajorSubsystemVersion; / 0 x46,子系统版本号 WORD MinorSubsystemVersion; / 0 x48 DWORD Win32VersionValue; / 0 x4c,Win32版本,一般是0 DWORD SizeOfImage;DWORD SizeOfImage; / 0 x50/ 0 x50,程序调入后占用内存大小程序调入后占用内存大小( (字节字节) ) DWORD SizeOfHeaders;DW
17、ORD SizeOfHeaders; / 0 x54/ 0 x54,文件头的长度之和文件头的长度之和 DWORD CheckSum; / 0 x58,校验和 WORD Subsystem; / 0 x5c,可执行文件的子系统 WORD DllCharacteristics; / 0 x5e,何时DllMain被调用,一般为0 DWORD SizeOfStackReserve; / 0 x60,初始化线程时保留的堆栈大小 DWORD SizeOfStackCommit; / 0 x64,初始化线程时提交的堆栈大小 DWORD SizeOfHeapReserve; / 0 x68,进程初始化时保留
18、的堆大小 DWORD SizeOfHeapCommit; / 0 x6c,进程初始化时提交的堆大小 DWORD LoaderFlags; / 0 x70,装载标志,与调试相关 DWORD NumberOfRvaAndSizes; / 0 x74,数据目录的项数,一般是16 IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES;IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES; IMAGE_OPTIONAL_HEADER, *PIMA
19、GE_OPTIONAL_HEADER;PE文件头节表n节通过节表实现索引n节的内容是要真正执行的程序和相关数据n病毒要在PE文件中增加病毒代码节或把病毒插入一个现有节时,需修改节表n节表是紧挨着NT映像头的一结构数组,其成员的数目NumberOfSections决定PE文件头节表元素define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER UCHAR NameIMAGE_SIZEOF_SHORT_NAME; / 节名 union ULONG PhysicalAddress; / OBJ文件中表示本节物理地址 ULO
20、NG VirtualSize; / EXE文件中表示节的实际字节数 Misc; ULONG VirtualAddress; / 本节的RVA ULONG SizeOfRawData; / 本节经过文件对齐后的尺寸 ULONG PointerToRawData; / 本节原始数据在文件中的位置 ULONG PointerToRelocations; / OBJ文件中表示本节重定位信 / 息的偏移,EXE文件中无意义 ULONG PointerToLinenumbers; / 行号偏移 USHORT NumberOfRelocations; / 本节需重定位的数目 USHORT NumberOfL
21、inenumbers; / 本节在行号表中的行号数目 ULONG Characteristics; / 节属性 IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;PE文件-节n代码节属性一般是 “可执行”、“可读”和“节中包含代码”n数据节属性一般是 “可读”、“可写”和“包含已初始化数据” n病毒在添加新节时,将新添加的节属性设置为可读、可写、可执行PE文件格节PE文件格节n节PE文件的程序内容划分成块,称之为Section(节),每个节是一块拥有共同属性,如代码/数据、读/写等。节名称仅是区别不同节的符号而已,类似“data”、“code”的命名,其
22、属性设置决定节的特性和功能PE文件节n典型地拥有9个预定义节 .text、.bss、.rdata、.data、.rsrc、 .edata、 .idata、 .pdata和.debug可执行代码节:可执行代码节:.text .text 数据节:.bss、.rdata、.data资源节:.rsrc引出函数节:引出函数节:.edata.edata引入函数节:引入函数节:.idata.idataPE文件节n代码节.textWindows NT默认地将所有可执行代码组成了一个单独的节,名为“.text”或“.code”.text节也包含了数据目录表中提到过的入口点IAT亦存在于.text节中模块入口点之
23、前。IAT是一系列的跳转指令PE文件节n引入函数节.idata从其它DLL中引入的函数该节开始为IMAGE_IMPORT_DESCRIPTOR结构的结构数组,即引入表,数据目录表表项结构成员VirtualAddress包含引入表地址引入函数节可能被病毒用来直接获取API函数地址PE文件节nIMAGE_IMPORT_DESCRIPTOR的结构如下:typedef struct _IMAGE_IMPORT_DESCRIPTOR typedef struct _IMAGE_IMPORT_DESCRIPTOR union DWORD Characteristics;DWORD OriginalFirs
24、tThunk; /IMAGE_THUNK_DATADWORD OriginalFirstThunk; /IMAGE_THUNK_DATA数组的指针数组的指针;DWORD TimeDateStamp; /文件建立时间DWORD ForwarderChain; /一般为0DWORD Name; /DLL名字的指针DWORD FirstThunk; /DWORD FirstThunk; /通常也是通常也是IMAGE_THUNK_DATAIMAGE_THUNK_DATA数组的指针数组的指针 IMAGE_IMPORT_DESCRIPTOR; ;PE文件节n引出函数节.edata本文件向其它程序提供的可调
25、用函数列表一般用在DLL中,EXE文件很少使用当PE装载器执行一个程序,它将相关DLL都装入该进程的地址空间,然后根据主程序的引入函数信息,查找相关DLL中的真实函数地址来修正主程序PE文件节nIMAGE_EXPORT_DIRECTORY结构typedef struct _IMAGE_EXPORT_DIRECTORY typedef struct _IMAGE_EXPORT_DIRECTORY DWORD Characteristics; / 一般为0 DWORD TimeDateStamp; / 文件生成时间 WORD MajorVersion; / 主版本号 WORD MinorVersi
26、on; / 次版本号 DWORD Name; / 指向DLL的名字 DWORD Base; / 基数,加上序数就是函数地址数组的索引值 DWORD NumberOfFunctions; / AddressOfFunctions数组的项数 DWORD NumberOfNames; / AddressOfNames数组的项数 DWORD AddressOfFunctions; / RVA from base of image DWORD AddressOfNames; / RVA from base of image DWORD AddressOfNameOrdinals; / RVA from
27、base of image IMAGE_EXPORT_DIRECTORY, IMAGE_EXPORT_DIRECTORY, * *PIMAGE_EXPORT_DIRECTORY;PIMAGE_EXPORT_DIRECTORY;PE文件节nDLL/EXE要引出一个函数给其它DLL/EXE使用,可通过函数名引出序号引出PE文件格式应用已知导出函数名,获取函数地址步骤:n定位到PE headern从数据目录表读取导出表的虚拟地址n 定位导出表获取名字数目(NumberOfNames)PE文件格式应用n并行遍历AddressOfNames和AddressOfNameOrdinals指向的数组匹配名字,
28、如果在AddressOfNames指向的数组中找到匹配名字,从AddressOfNameOrdinals指向的数组中提取索引值,例如,若发现匹配名字的RVA存放在AddressOfNames的第6个元素,那就提取AddressOfNameOrdinals数组的第6个元素作为索引值。如果遍历完NumberOfNames个元素,说明当前模块没有所要的名字PE文件格式应用n从AddressOfNameOrdinals数组提取的数值作为AddressOfFunctions数组的索引。即如果值是5,就必须读取AddressOfFunctions数组的第5个元素,此值就是所要函数的RVAPE文件格式应用已
29、知函数的序数,获取函数地址步骤:n定位到PE headern从数据目录表读取导出表的虚拟地址n定位导出表获取Base值n减掉Base值得到指向AddressOfFunctions数组的索引n将该值与NumberOfFunctions做比较,大于等于后者则序数无效n通过上面的索引就可以获取AddressOfFunctions数组中的RVA4.Win32 PE4.Win32 PE病毒的基本原理病毒的基本原理nPE病毒基本功能重定位截获API函数地址搜索感染目标文件内存文件映射实施感染Win32 PEWin32 PE病毒的基本原理病毒的基本原理n重定位原因重定位原因病毒不可避免要用到变量(常量),病
30、毒感染HOST程序,其依附到HOST程序中的位置不同,病毒随着HOST载入内存后,病毒中的各个变量(常量)在内存中的位置也要随着发生变化n病毒重定位方法病毒重定位方法call delta ;执行后,堆栈顶端为delta在内存中的真正地址delta: pop ebp ;该语句将delta在内存中的真正地址存放在ebp寄存器中 lea eax,ebp + (offset var1-offset delta) ;此时eax中存放着var1在内存中的真实地址Win32 PE病毒的基本原理n为什么要获取API函数地址Win32 PE病毒需要调用API函数实现某些功能,但是Win32 PE病毒只有代码节,
31、并不存在引入函数节病毒无法直接调用相关API函数,需先找出这些API函数在相应DLL中的地址Win32 PE病毒的基本原理n获取API函数地址首先获取KERNEL32的基地址n获取KERNEL32基地址的方法对相应操作系统分别给出固定的Kernel32模块的基地址对于同一版本的Windows操作系统,Kernel32模块的地址是固定的,甚至一些API函数的大概位置都是固定的n利用程序的返回地址,在其附近搜索Kernel32模块基地址Win32 PE病毒的基本原理 mov ecx,esp ;将堆栈顶端的数据(返回Kernel32的地址)赋给ecx xor edx,edxgetK32Base: d
32、ec ecx ;逐字节比较验证,也可以一页一页地搜 mov dx,word ptr ecx+IMAGE_DOS_HEADER.e_lfanew ;就是ecx+3ch test dx,0f000h ;Dos Header+stub不可能太大,超过4096byte jnz getK32Base ;加速检验 cmp ecx, dword ptr ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase jnz getK32Base ;看Image_Base值是否等于ecx即模块起始值 mov ebp+offset k32Base,ecx ;如果是,就认为是找
33、到了kernel32的Base值 Win32 PE病毒的基本原理n获取API函数地址在得到了Kernel32的模块地址以后,就可以在该模块中搜索所需要的API地址对于给定的API,搜索其地址可以直接通过Kernel32.dll的引出表信息搜索,同样我们也可以先搜索出GetProcAddress和LoadLibrary两个API函数的地址,然后利用这两个API函数得到所需要的API函数地址Win32 PE病毒的基本原理n搜索文件是病毒寻找目标文件重要手段n在Win32中,用如下API函数进行文件搜索FindFirstFilen根据文件名查找文件FindNextFilen根据调用FindFirst
34、File函数时指定的一个文件名查找下一个文件FindClose用来关闭由FindFirstFile函数创建的一个搜索句柄Win32 PE病毒的基本原理WIN32_FIND_DATA STRUCT dw DWORD ? /文件属性, /如果该值为,则说明是目录 ftCreationTime /文件创建时间 ftLastAccessTime /文件或目录的访问时间 ftLastWriteTime /文件最后一次修改时间,对于目录是创建时间 n DWORD ? /文件大小的高位 n DWORD ? /文件大小的地位 dwReserved0 DWORD ? /保留 dwReserved1 DWORD
35、? /保留 c BYTE MAX_PATH dup(?) /文件名字符串,以0结尾 cAlternate BYTE 14 dup(?) /8.3格式的文件名WIN32_FIND_DATA ENDSWin32 PE病毒的基本原理n文件搜索算法采用递归算法进行搜索,也可以采用非递归搜索方法FindFile ProcFindFile Proc指定找到的目录为当前工作目录开始搜索文件(*.*)该目录搜索完毕?是则返回,否则继续找到文件还是目录?是目录则调用自身函数FindFile,否则继续是文件,如符合感染条件,则调用感染模块,否则继续搜索下一个文件(FindNextFile),转到继续FindFil
36、e EndpFindFile EndpWin32 PE病毒的基本原理n内存映射文件内存映射文件内存映射文件提供一组独立函数,使应用程序能够通过内存指针访问磁盘上的文件这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单对文件中数据的操作便是直接对内存进行操作,提高访问速度,这对于计算机病毒减少资源占用是非常重要Win32 PE病毒的基本原理n使用内存映射文件读写文件步骤调用CreateFileCreateFile函数打开HOST程序,返回文件句柄hFile调用CreateCreate函数生成基于HOST
37、文件句柄hFile的内存映射对象,返回内存映射对象句柄hMapWin32 PE病毒的基本原理调用MapViewOfFile函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pMem)用所得到的指针pMem对整个HOST文件进行操作,对HOST程序进行病毒感染Win32 PE病毒的基本原理调用UnMapViewFile函数解除文件映射,传入参数是pMem调用CloseHandle来关闭内存映射文件,传入参数是hMap调用CloseHandle来关闭HOST文件,传入参数是hFileWin32 PE病毒的基本原理n几个内存映射函数Createn该函数用来
38、创建一个新的文件映射对象 MapViewOfFile n该函数将一个文件映射对象映射到当前应用程序的地址空间 UnMapViewOfFile n该函数在当前应用程序的内存地址空间解除对一个文件映射对象的映射 CloseHandle 该函数用来关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和同步对象等Win32 PE病毒的基本原理n病毒感染PE文件的基本步骤(1)判断目标文件开始的两个字节是否为“MZ”;(2)判断PE文件标记“PE”;(3)判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续;Win32 PE病毒的基本原理(4)获得Directory(数据目录)的个数,
39、每个数据目录信息占8个字节;(5)得到节表起始位置:Directory的偏移地址+数据目录占用的字节数=节表起始位置;(6)得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节):节表起始位置+节的个数(每个节表占用的字节数28H)=目前最后节表的末尾偏移Win32 PE病毒的基本原理(7)开始写入节表写入节名(8字节);写入节的实际字节数(4字节);写入新节在内存中的开始偏移地址(4字节),同时可以计算出病毒入口位置:上节在内存中的开始偏移地址+(上节大小/节对齐+1)节对齐=本节在内存中的开始偏移地址;写入本节(即病毒节)在文件中对齐后的大小;写入本节在文件中的开始位置:上节在文件中
40、的开始位置+上节对齐后的大小=本节(即病毒)在文件中的开始位置;Win32 PE病毒的基本原理(8)修改映像文件头中的节表数目(9)修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST继续执行。(10)更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小);Win32 PE病毒的基本原理(11)写入感染标记(后面例子中是放在PE头中);(12)写入病毒代码到新添加的节中:ECX=病毒长度ESI=病毒代码位置(并不一定等于病毒执行代码开始位置)EDI=
41、病毒节写入位置(后面例子是在内存映射文件中的相应位置)(13)将当前文件位置设为文件末尾。Win32 PE病毒的基本原理n文件操作相关API函数CreateFilen打开和创建文件等CloseHandlen该函数用来关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和同步对象等Setn在一个文件中设置当前的读写位置Win32 PE病毒的基本原理ReadFile/ WriteFilen从文件中读取数据/将数据写入文件SetEndOfFilen针对一个打开的文件,将当前文件位置设为文件末尾Getn获取指定文件的大小Flush针对指定的文件句柄,刷新内部文件缓冲区Win32 PE病毒的基本原
42、理n病毒返回到HOST程序的方法为了提高自己的生存能力,病毒不应该破坏HOST程序,病毒应该在病毒执行完毕后,立刻将控制权交给HOST程序病毒在修改被感染文件代码开始执行位置(AddressOfEntryPoint)时,会保存原来的值。这样,病毒在执行完病毒代码之后用一个跳转语句跳到这段代码处继续执行即可WIN95.CIH病毒解析提问与解答环节Questions And Answers谢谢聆听 学习就是为了达到一定目的而努力去干, 是为一个目标去战胜各种困难的过程,这个过程会充满压力、痛苦和挫折Learning Is To Achieve A Certain Goal And Work Hard, Is A Process To Overcome Various Difficulties For A Goal