请问啥是WINDOWS下的PE病毒 ?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问啥是WINDOWS下的PE病毒 ?相关的知识,希望对你有一定的参考价值。
我电脑中PE病毒了
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),就得到了函数真正的入口地址.满意请采纳 参考技术A PE病毒是指所有感染Windows下PE文件格式文件的病毒.
你可以下载一款杀毒软件杀毒,比如腾讯电脑管家
打开腾讯电脑管家--闪电杀毒--全盘扫描--完成
腾讯电脑管家应用了具有“自学习能力”的自研第二代“鹰眼”引擎,
业界首创将CPU虚拟执行技术运用到杀毒软件中,
能够根除顽固病毒、大幅度提升深度查杀能力,
并且大大降低了杀毒软件对用户电脑系统资源的占用率。
同时,沿用“4+1”多引擎架构保证了腾讯电脑管家病毒查杀的稳定性。
误杀率也极低,深受广大用户的认可。 参考技术B PE病毒,又称Win32 PE病毒,或简称Win32病毒。它指所有感染Windows下PE文件格式文件的病毒。因为它通常采用Win32汇编编写,而且格式为PE,因此得名。建议您使用腾讯电脑管家杀毒软件,全面的查杀病毒程序,彻底的清理干净,提供快速扫描、全盘扫描和自定义扫描三种扫描方式:快速扫描针对电脑病毒易感区进行快速扫描,快速直达“病根”;全盘扫描对用户电脑进行全方位查杀,病毒木马无处逃;自定义扫描让用户能根据自己的需求进行扫描,兼具人性化。两大云查杀引擎和趋势本地查杀引擎“三强联合”,超强查杀电脑中存在的顽固木马,能彻底清洁电脑环境,清除电脑病毒
希望可以帮到您了
请问啥是SQL的DECLARE语句?
书上在有这样一句话不是很明白“存储设备上的数据库是用SQL存取的,数据库和主语言程序间信息的传递是通过共享变量实现的。这些共享变量要用SQL的DECLARE语句说明... ...”
请问什么是SQL的DECLARE语句?
使用一个DECLARE语句在一个批处理或超过100个进程的主体中声明变量,并使用SET或SELECT语句分配变量。游标变量度可以用这个语句声明,也可以与其他版本的游标相关语句一起使用。所有权重变量在声明后初始化为NULL。
定义语句的方法:
1、先定义一个数组,该数组是一些数字,复制可以对应到id列中的数据表中。
2.关键是将数组的内容转换为SQL语句中的字符串。
3.然后将转换后的字符串连接到SQL查询语句中的in语句。
4、不要直接使用代码来执行数据库,首先要使用dump语句来SQL输出。
5.运行该页面,您将看到最终的SQL语句,如下图所示。
6.然后可以在数据库客户端工具中执行SQL语句。
7.执行之后,可以声明数组的使用。
参考技术A MySQL declare语句是在复合语句中声明变量的指令。(1)Example with two DECLARE statements
两个DECLARE语句的实例
CREATE PROCEDURE p8 ()
BEGIN
DECLARE a INT;
DECLARE b INT;
SET a = 5;
SET b = 5;
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END; // /* I won't CALL this */
在过程中定义的变量并不是真正的定义,你只是在BEGIN/END块内定义了而已(译注:也就是形参)。注意这些变量和会话变量不一样,不能使用修饰符@你必须清楚的在BEGIN/END块中声明变量和它们的类型。变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。
(2)Example with no DEFAULT clause and SET statement
没有默认子句和设定语句的例子
CREATE PROCEDURE p9 ()
BEGIN
DECLARE a INT /* there is no DEFAULT clause */;
DECLARE b INT /* there is no DEFAULT clause */;
SET a = 5; /* there is a SET statement */
SET b = 5; /* there is a SET statement */
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END; // /* I won't CALL this */
有很多初始化变量的方法。如果没有默认的子句,那么变量的初始值为NULL。你可以在任何时候使用SET语句给变量赋值。
(3)Example with DEFAULT clause
含有DEFAULT子句的例子
CREATE PROCEDURE p10 ()
BEGIN
DECLARE a, b INT DEFAULT 5;
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END; //
我们在这里做了一些改变,但是结果还是一样的。在这里使用了DEFAULT子句来设定初始值,这就不需要把DECLARE和SET语句的实现分开了。
(4)Example of CALL
调用的例子
mysql> CALL p10() //
+--------+
| s1 * a |
+--------+
| 25 |
| 25 |
+--------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
结果显示了过程能正常工作
(5) Scope
作用域
CREATE PROCEDURE p11 ()
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'outer';
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'inner';
SELECT x1;
END;
SELECT x1;
END; // 参考技术B 变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。游标变量可使用此语句声明,并可用于其他与游标相关的语句。所有变量在声明后均初始化为 NULL。
在sql里按F1自己看吧本回答被提问者和网友采纳 参考技术C 在sql语句中添加变量。
DECLARE @local_variable (Transact-SQL)
变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。游标变量可使用此语句声明,并可用于其他与游标相关的语句。除非在声明中提供值,否则声明之后所有变量将初始化为 NULL。
声明时需要指定变量的类型,可以使用set和select对变量进行赋值,在sql语句中就可以使用@local_variable来调用变量
例如:declare @id int
set @id=2
select id 参考技术D 申明变量用的,在存储过程中可以常看到
以上是关于请问啥是WINDOWS下的PE病毒 ?的主要内容,如果未能解决你的问题,请参考以下文章
Trojan_Downloader.Win32.Aqent.cnv