PE病毒就是那种专门搞Windows下PE格式文件的病毒。这种病毒基本上都是用Win32汇编写出来的。如果你真想搞懂病毒技术,那PE病毒是绕不开的坎儿。只有玩过PE病毒,才知道啥叫真正的牛X技术。
写一个Win32病毒有几个关键点:
API函数得自己找,不能直接引用DLL库。意思就是你得想办法找到API函数的地址,然后直接调用那个地址。
讲个背景知识:当PE加载器把程序跑起来之后,堆栈顶的那个地址其实是程序的返回地址,肯定在Kernel里面!所以我们可以顺着这个地址往下找,一直找到模块的起始位置。判断条件有两个:PE头不能超过4096字节,还有PE header里的ImageBase值应该和当前指针一致。
病毒一般没有.data段,所有变量和数据都塞在.code段里。
还有一个关键点是偏移地址的重定位。比如你可以这样写:
Call delta
delta:
pop ebp
sub ebp, offset delta
这样一来,变量var1的真正偏移地址就是var1 + ebp。
想写Win32病毒你还得了解PE文件格式。
再来说说病毒怎么感染别的文件。常见方法是在目标文件里加一个新的节区(section),在里面放上病毒代码,还有执行完病毒代码后跳回原程序的那一段代码。然后修改PE头里的入口地址(AddressOfEntryPoint),让它指向新添加的这个节区,这样程序一运行就先执行病毒代码了。
当然还有其他感染方式,比如把病毒代码分散插入到各个节之间的空隙里。这就不一一说了。
PE文件长啥样?大概结构就是:
- DOS MZ头
- DOS stub
- PE header(包含Signature、FileHeader、OptionalHeader)
- 各种节区(Section 1 ~ n)
- 节表(Section table)
PE header其实分成三部分:
1. 签名字符串PE
2. 映像文件头(FileHeader)
3. 可选映像头(OptionalHeader)
那个签名字符串其实就是个dword类型,值为50h, 45h, 00h, 00h(也就是PE )。这是识别PE文件的重要标志。
这个签名字符串的位置可以通过DOS程序头里的e_lfanew字段来找,它占四个字节,在文件开头偏移0x3C的位置能找到。
映像文件头这部分主要记录了PE文件物理分布的信息,比如有多少个节、这个文件是哪个平台上运行的等等。
写一个Win32病毒有几个关键点:
API函数得自己找,不能直接引用DLL库。意思就是你得想办法找到API函数的地址,然后直接调用那个地址。
讲个背景知识:当PE加载器把程序跑起来之后,堆栈顶的那个地址其实是程序的返回地址,肯定在Kernel里面!所以我们可以顺着这个地址往下找,一直找到模块的起始位置。判断条件有两个:PE头不能超过4096字节,还有PE header里的ImageBase值应该和当前指针一致。
病毒一般没有.data段,所有变量和数据都塞在.code段里。
还有一个关键点是偏移地址的重定位。比如你可以这样写:
Call delta
delta:
pop ebp
sub ebp, offset delta
这样一来,变量var1的真正偏移地址就是var1 + ebp。
想写Win32病毒你还得了解PE文件格式。
再来说说病毒怎么感染别的文件。常见方法是在目标文件里加一个新的节区(section),在里面放上病毒代码,还有执行完病毒代码后跳回原程序的那一段代码。然后修改PE头里的入口地址(AddressOfEntryPoint),让它指向新添加的这个节区,这样程序一运行就先执行病毒代码了。
当然还有其他感染方式,比如把病毒代码分散插入到各个节之间的空隙里。这就不一一说了。
PE文件长啥样?大概结构就是:
- DOS MZ头
- DOS stub
- PE header(包含Signature、FileHeader、OptionalHeader)
- 各种节区(Section 1 ~ n)
- 节表(Section table)
PE header其实分成三部分:
1. 签名字符串PE
2. 映像文件头(FileHeader)
3. 可选映像头(OptionalHeader)
那个签名字符串其实就是个dword类型,值为50h, 45h, 00h, 00h(也就是PE )。这是识别PE文件的重要标志。
这个签名字符串的位置可以通过DOS程序头里的e_lfanew字段来找,它占四个字节,在文件开头偏移0x3C的位置能找到。
映像文件头这部分主要记录了PE文件物理分布的信息,比如有多少个节、这个文件是哪个平台上运行的等等。