WINDOWS下的PE病毒 是指那一类病毒?都有什么特征
PE病毒是指所有感染Windows下PE文件格式文件的病毒。PE病毒大多数采用Win32汇编编写。PE病毒对于一个热衷于病毒技术的人来说,是必须掌握的。只有在PE病毒中,我们才能真正感受到高超的病毒技术。 编写Win32病毒的几个关键Api函数的获取不能直接引用动态链接库需要自己寻找api函数的地址,然后直接调用该地址一点背景:在PELoader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,肯定在Kernel中!因此我们可以得到这个地址,然后向低地址缩减验证一直到找到模块的起始地址,验证条件为PE头不能大于4096bytes,PEheader的ImageBase值应该和当前指针相等...全部
PE病毒是指所有感染Windows下PE文件格式文件的病毒。PE病毒大多数采用Win32汇编编写。PE病毒对于一个热衷于病毒技术的人来说,是必须掌握的。只有在PE病毒中,我们才能真正感受到高超的病毒技术。
编写Win32病毒的几个关键Api函数的获取不能直接引用动态链接库需要自己寻找api函数的地址,然后直接调用该地址一点背景:在PELoader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,肯定在Kernel中!因此我们可以得到这个地址,然后向低地址缩减验证一直到找到模块的起始地址,验证条件为PE头不能大于4096bytes,PEheader的ImageBase值应该和当前指针相等。
病毒没有。data段,变量和数据全部放在。code段编写Win32病毒的几个关键偏移地址的重定位Calld ,offsetdelta那么变量var1的真正偏移地址为:var1+ebp对PE文件格式的了解编写Win32病毒的几个关键病毒如何感染其他文件在文件中添加一个新节该新节中添加病毒代码和病毒执行后的返回Host程序的代吗修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的节,以便程序运行后先执行病毒代码。
PE病毒感染其他文件的方法还有很多,譬如PE病毒还可以将自己分散插入到每个节的空隙中等等,这里不在一一叙述。PE文件格式一览SectionnSection。。。Section2Section1SectiontablePEheaderDOSstubDOSMZheaderPEheaderPeheader由三部分组成字串"PE\0\0"(Signature)映像文件头(FileHeader)可选映像头(OptionalHeader)字串"PE\0\0"Signature一dword类型,值为50h,45h,00h,00h(PE\0\0)。
本域为PE标记,我们可以此识别给定文件是否为有效PE文件。这个字串在文件中的位置(e_lfanew),可以在DOS程序头中找到它的指针,它占用四个字节,位于文件开始偏移3CH字节中。映像文件头该结构域包含了关于PE文件物理分布的信息,比如节数目,文件执行机器等。
它实际上是结构IMAGE_FILE_HEADER的简称。映像文件头结构IMAGE_FILE_HEADERSTRUCT___MachineWORD___NumberOfSectionsWORD___TimeDateStampdd___PointerToSymbolTabledd___NumberOfSymbolsdd___SizeOfOptionalHeaderWORD___CharacteristicsWORDIMAGE_FILE_HEADERENDS映像文件头的基本信息关于文件信息的标记,比如文件是exe还是dll2Characteristics*7可选头的大小2SizeOfOptionalHeader6符号数目4NumberOfSymbols5COFF符号表的偏移4PointerToSymbleTable4生成该文件的时间4TimeDataStamp3文件中节的个数2NumberOfSection**2机器类型,x86为14ch2Machine*1描述大小(字节)名字顺序可选映像头optionalheader结构是IMAGE_NT_HEADERS中的最后成员。
包含了PE文件的逻辑分布信息。该结构共有31个域,一些是很关键,另一些不太常用。这里只介绍那些真正有用的域。这儿有个关于PE文件格式的常用术语:RVARVA代表相对虚拟地址。它是相对虚拟空间里的一个地址。
举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA1000h。每个RVA都是相对于模块的起始VA的。可选映像头文件中节对齐的粒度。
FileAlignment内存中节对齐的粒度。SectionAlignmentPE文件的优先装载地址。比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处。
若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址。ImageBasePE装载器准备运行的PE文件的第一个指令的RVA。若要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行。
AddressOfEntryPoint*描述名字可选映像头NT用来识别PE文件属于哪个子系统。Subsystem一IMAGE_DATA_DIRECTORY结构数组。每个结构给出一个重要数据结构的RVA,比如引入地址表等。
DataDirectory所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。SizeOfHeaders内存中整个PE映像体的尺寸。SizeOfImagewin32子系统版本。
若PE文件是专门为Win32设计的,该子系统版本必定是4。0否则对话框不会有3维立体感。MajorSubsystemVersionMinorSubsystemVersion描述名字DataDirectory数据目录一个IMAGE_DATA_DIRECTORY数组,里面放的是这个可执行文件的一些重要部分的RVA和尺寸,目的是使可执行文件的装入更快,数组的项数由上一个域给出。
IMAGE_DATA_DIRECTORY包含有两个域,如下:IMAGE_DATA_DIRECTORYVitualAddressDDSizeDDIMAGE_DATA_DIRECTORYENDS节表节表其实就是紧挨着PEheader的一结构数组。
该数组成员的数目由fileheader(IMAGE_FILE_HEADER)结构中NumberOfSections域的域值来决定。节表结构又命名为IMAGE_SECTION_HEADER。结构中放的是一个节的信息,如名字,地址,长度,属性等。
IMAGE_SECTION_HEADER本节原始数据在文件中的位置4PointerToRawData*5本节的原始尺寸4SizeOfRawData*4这个值+映像基地址=本节在内存中的真正地址。
OBJ中无意义。4Virtual*3OBJ文件用作表示本节物理地址EXE文件中表示节的真实尺寸4PhysicalAddress或VirtualSize2节名8Name*1描述大小(字节)名字顺序IMAGE_SECTION_HEADER节属性4Characteristics*10本节在行号表中的行号数目2NumberOfLinenumbers9本节要重定位的数目2NumberOfRelocations8行号偏移4PointerToLinenumbers7OBJ中表示该节重定位信息的偏移EXE文件中无意义4PointerToRelocations6描述大小(字节)名字顺序节"节(Section)"跟在节表之后,一般PE文件都有几个"节"。
比较常见的有:代码节已初始化的数据节未初始化的数据节资源节引入函数节引出函数节代码节代码节一般名为。text或CODE,该节含有程序的可执行代码。每个PE文件都有代码节在代码节中,还有一些特别的数据,是作为调用映入函数之用。
如:CallMessageBoxA的调用,反汇编后该指令被换为call0040101A,而地址0040101A仍在。text中,它放有一个跳转指令jmpdwordptr[0040304c],即这条跳转指令的目的地址处于。
idata节中的0040304C处,其中放的才是MessageBoxA的真正地址,如下图:已初始化的数据节这个节一般取名为。data或DATA已初始化的数据节中放的是在编译时刻就已确定的数据。
如HelloWorld中的字符串"HelloWorld!"。未初始化的数据节这个节的名称一般叫。bbs。这个节里放有未初始化的全局变量和静态变量。资源节资源节一般名为。rsrc这个节放有如图标,对话框等程序要用到的资源。
资源节是树形结构的,它有一个主目录,主目录下又有子目录,子目录下可以是子目录或数据。都是一个IMAGE_RESOURCE_DIRECTORY结构。结构如下:IMAGE_RESOURCE_DIRECTORY结构以ID标识的资源数2NumberOfldEntries6以名字标识的资源数2NumberOfNamedEntries5次版本号2MinorVersion4主版本号2MajorVersion3资源生成时间4TimeDateStamp2通常为04Characteritics1描述大小(字节)名字顺序引入函数节一个引入函数是被某模块调用的但又不在调用者模块中的函数这个节一般名为。
idata,也叫引入表。它包含从其它(系统或第三方写的)DLL中引入的函数,例如user32。dll,gdi32。dll等。它的开始是一个IMAGE_IMPORT_DESCRIPTOR数组。这个数组的长度不定,但他的最后一项是全0,可以以此判断数组的结束。
引出函数节什么是引出函数节引出函数节是用来向系统提供导出函数的名称,序号和入口地址等信息,以便Windows装载器通过这些信息来完成动态链接的过程。了解引出函数节对于学习病毒来说,是极为重要的。
Api函数地址的获取与引出函数节息息相关。引出函数节通过Api函数名查找其地址(1)定位到PE文件头(2)从PE文件头中的课选文件头中取出数剧目录表的第一个数据目录,得到导出表的地址。(3)从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。
(4)从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。(5)如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值,然后在AddressOfNameOrdinals指向的数组中以同样的索引值去除数组项的值,假如该值为m。
(6)以m值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。
收起