深圳摇钱树网络科技:windows下的PE病毒是什么东西啊

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 08:59:41
我用瑞星都杀光了
用什么杀啊

PE病毒是指所有感染Windows下PE文件格式文件的病毒.

是指感染exe文件的病毒,pe是win可执行文件(头)格式的意思

病毒分类 WINDOWS下的PE病毒 病毒名称 Win32.Tenga
别 名 病毒长度
危害程度 传播途径
行为类型 WINDOWS下的PE病毒 感 染
该病毒是一个WIN32 PE感染型病毒,病毒感染普通PE EXE文件并把自己的代码加到EXE文件尾部.修改原程序的入口点以指向病毒体,病毒本身没有什么危害.但被感染的文件可能被破坏不能正常运行

这病毒还会感染正常的EXE程序文件,使到他会不停的复制,还会利用网络来复制自己到其他电脑上的,就算你有防火墙都没用.
用瑞星和金山杀毒软件杀不了,重新启动又会回来

在你系统启动的时候,会突然运行一个家DL.EXE的DOS文件的时候,恭喜你,中招了...怎么办??

解决办法如下:

1.建议你重启电脑进入安全模式,然后在拔掉网线的情况下全盘杀毒。

通过WINDOWS UPDATE升级关键安全更新补丁,关闭不安全的共享以及使用复杂组合的登录密码能有效的防止这类蠕虫的再次感染。使用网络防火墙也可以达到一定程度的预防。

2.病毒具体介绍:http://us.mcafee.com/virusInfo/d ... &virus_k=134857
主要是通过共享感染的,所以清除之前必须关闭共享和系统还原功能。MCAFEE可以清除。该蠕虫除了感染EXE文件外,还会下载GAELICUM.EXE - dropper of W32/Gael.worm
CBACK.EXE a new remote access trojan, BackDoor-CTM 这两个后门/蠕虫。

* Win16.HLLP.Hiro.10240
Hiro是利用Pascal编写的病毒,不会驻存内存中。它安装在windows3.xx以下16位的NE EXE文件,这个病毒包含如下字符串:

Hiroshima end 000 v1.2000:0000

病毒在Windows目录中寻找.exe文件并将自身复制到开始文件夹中。您可以在以下目录中查找Hiro文件:

C:\WINDOWS
C:\WINDOWS\SYSTEM

Hiro病毒在感染其他文件前会创建一个文件列表,其路径和文件名如下:

C:\SETWIN.TMP

Win32.Seppuku.2764

Seppuku是一个Win32病毒。Win32.Seppuku.2764 病毒会在当前Windows目录中搜索PE EXE文件。Seppuku包含如下字符串:

Win32/Seppuku v1.1
(c) 2001 Tokugawa Ieyasu

此病毒查找类似如下的文件,但它对反病毒程序文件不起作用:

_avp32.exe, _avpcc.exe, _avpm.exe, avp32.exe, avpcc.exe,
avpm.exe, amon.exe, nod32.exe, nod32cc.exe, pop32scan.exe,
Apvxdwin.exe, Avlite.exe, Avltmain.exe, Sdisk32.exe

Win32.SanKey

SanKey 是一个非常危险的Win32病毒。它会在当前目录和被破坏的文件中搜索PE EXE文件并感染它们。 当感染了一个PE EXE文件后,病毒会在文件中创建一个名为"kaze/FAT"的片断

PE病毒是指所有感染Windows下PE文件格式文件的病毒.
PE病毒大多数采用Win32汇编编写.
PE病毒对于一个热衷于病毒技术的人来说,是必须掌握的.
只有在PE病毒中,我们才能真正感受到高超的病毒技术.
编写Win32病毒的几个关键
Api函数的获取
不能直接引用动态链接库
需要自己寻找api函数的地址,然后直接调用该地址
一点背景:在PE Loader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,肯定在Kernel中! 因此我们可以得到这个地址,然后向低地址缩减验证一直到找到模块的起始地址,验证条件为PE头不能大于4096bytes,PE header的ImageBase值应该和当前指针相等.
病毒没有.data段,变量和数据全部放在.code段

编写Win32病毒的几个关键
偏移地址的重定位
Call delta
delta: pop ebp
sub ebp,offset delta
那么变量var1的真正偏移地址为:var1+ebp
对PE文件格式的了解
编写Win32病毒的几个关键
病毒如何感染其他文件
在文件中添加一个新节
该新节中添加病毒代码和病毒执行后的返回Host程序的代吗
修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的节,以便程序运行后先执行病毒代码.
PE病毒感染其他文件的方法还有很多,譬如PE病毒还可以将自己分散插入到每个节的空隙中等等,这里不在一一叙述.
PE文件格式一览
Section n
Section ...
Section 2
Section 1
Section table
PE header
DOS stub
DOS MZ header
PE header
Pe header 由三部分组成
字串 "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_HEADER STRUCT
___ Machine WORD
___ NumberOfSections WORD
___ TimeDateStamp dd
___ PointerToSymbolTable dd
___ NumberOfSymbols dd
___ SizeOfOptionalHeader WORD
___ Characteristics WORD
IMAGE_FILE_HEADER ENDS
映像文件头的基本信息
关于文件信息的标记,比如文件是exe还是dll
2
Characteristics *
7
可选头的大小
2
SizeOfOptionalHeader
6
符号数目
4
NumberOfSymbols
5
COFF符号表的偏移
4
PointerToSymbleTable
4
生成该文件的时间
4
TimeDataStamp
3
文件中节的个数
2
NumberOfSection **
2
机器类型,x86为14ch
2
Machine *
1
描述
大小(字节)
名字
顺序
可选映像头
optional header 结构是 IMAGE_NT_HEADERS 中的最后成员.包含了PE文件的逻辑分布信息.该结构共有31个域,一些是很关键,另一些不太常用.这里只介绍那些真正有用的域.
这儿有个关于PE文件格式的常用术语: RVA
RVA 代表相对虚拟地址.它是相对虚拟空间里的一个地址 .
举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h.每个RVA都是相对于模块的起始VA的.
可选映像头
文件中节对齐的粒度.
FileAlignment
内存中节对齐的粒度.
SectionAlignment
PE文件的优先装载地址.比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处.若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址.
ImageBase
PE装载器准备运行的PE文件的第一个指令的RVA.若要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行.
AddressOfEntryPoint *
描述
名字
可选映像头
NT用来识别PE文件属于哪个子系统.
Subsystem
一IMAGE_DATA_DIRECTORY 结构数组.每个结构给出一个重要数据结构的RVA,比如引入地址表等.
DataDirectory
所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸.可以以此值作为PE文件第一节的文件偏移量.
SizeOfHeaders
内存中整个PE映像体的尺寸.
SizeOfImage
win32子系统版本.若PE文件是专门为Win32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感.
MajorSubsystemVersion
MinorSubsystemVersion
描述
名字
DataDirectory数据目录
一个IMAGE_DATA_DIRECTORY数组,里面放的是这个可执行文件的一些重要部分的RVA和尺寸,目的是使可执行文件的装入更快,数组的项数由上一个域给出.IMAGE_DATA_DIRECTORY包含有两个域,如下:
IMAGE_DATA_DIRECTORY
VitualAddress DD
Size DD
IMAGE_DATA_DIRECTORY ENDS
节表
节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目由 file header (IMAGE_FILE_HEADER) 结构中 NumberOfSections 域的域值来决定.节表结构又命名为 IMAGE_SECTION_HEADER.
结构中放的是一个节的信息,如名字,地址,长度,属性等.
IMAGE_SECTION_HEADER
本节原始数据在文件中的位置
4
PointerToRawData *
5
本节的原始尺寸
4
SizeOfRawData *
4
这个值+映像基地址=本节在内存中的真正地址.OBJ中无意义.
4
Virtual *
3
OBJ文件用作表示本节物理地址EXE文件中表示节的真实尺寸
4
PhysicalAddress或VirtualSize
2
节名
8
Name *
1
描述
大小(字节)
名字
顺序
IMAGE_SECTION_HEADER
节属性
4
Characteristics *
10
本节在行号表中的行号数目
2
NumberOfLinenumbers
9
本节要重定位的数目
2
NumberOfRelocations
8
行号偏移
4
PointerToLinenumbers
7
OBJ中表示该节重定位信息的偏移EXE文件中无意义
4
PointerToRelocations
6
描述
大小(字节)
名字
顺序

"节(Section)"跟在节表之后,一般PE文件都有几个"节".比较常见的有:
代码节
已初始化的数据节
未初始化的数据节
资源节
引入函数节
引出函数节
代码节
代码节一般名为.text或CODE,该节含有程序的可执行代码.
每个PE文件都有代码节
在代码节中,还有一些特别的数据,是作为调用映入函数之用.如:
Call MessageBoxA的调用,反汇编后该指令被换为call 0040101A,而地址0040101A仍在.text中,它放有一个跳转指令jmp dword ptr[0040304c],即这条跳转指令的目的地址处于.idata节中的0040304C处,其中放的才是MessageBoxA的真正地址,如下图:
已初始化的数据节
这个节一般取名为.data或DATA
已初始化的数据节中放的是在编译时刻就已确定的数据.如Hello World 中的字符串"Hello World!".
未初始化的数据节
这个节的名称一般叫.bbs.
这个节里放有未初始化的全局变量和静态变量.
资源节
资源节一般名为.rsrc
这个节放有如图标,对话框等程序要用到的资源.
资源节是树形结构的,它有一个主目录,主目录下又有子目录,子目录下可以是子目录或数据.
都是一个IMAGE_RESOURCE_DIRECTORY结构.结构如下:
IMAGE_RESOURCE_DIRECTORY 结构
以ID标识的资源数
2
NumberOfldEntries
6
以名字标识的资源数
2
NumberOfNamedEntries
5
次版本号
2
MinorVersion
4
主版本号
2
MajorVersion
3
资源生成时间
4
TimeDateStamp
2
通常为0
4
Characteritics
1
描述
大小(字节)
名字
顺序
引入函数节
一个引入函数是被某模块调用的但又不在调用者模块中的函数
这个节一般名为.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),就得到了函数真正的入口地址.
回答者:hw0178 - 经理 四级