木马免杀技术大盘点和PE基础知识

来源:互联网 发布:windows讲述人快捷键 编辑:程序博客网 时间:2024/05/16 13:14
木马免杀技术大盘点和PE基础知识 
前言:大家都知道,现在的杀毒软件越来越强,比如说:咔吧6.0的主动防御,以及瑞星强大的内存杀毒。

包括正在测试的瑞星2007(添加了脱壳技术)。种种迹象看来,现在的木马几乎无处可逃。正是情势

逼迫,免杀班也就自然而然开放了。

一:首先还是先介绍一下杀毒软件的查杀模式。(相信大家都知道,我就简单的说下吧)

杀毒软件的查杀模式:(1)文件查杀 (2)内存查杀 (3)行为杀毒 (这些都是较常用的)


文件查杀:杀毒软件对磁盘中的文件进行静态扫描,一旦发现文件带有其病毒库中的病毒特征代码

    就会查杀。


内存查杀:杀毒软件把病毒特征代码释放到内存中,然后与内存中的文件进行对比,发现有文件中
    带有病毒特征代码就会查杀。


行为杀毒:杀毒软件用木马运行后的一些特定的行为作为判断是否为木马的依据。


二:PE基础知识



简单的说:PE 的意思就是 Portable Executable(可移植的执行体)。是win32位程序的格式。


三:木马免杀技术大盘点

木马的免杀主要还是针对文件免杀和内存免杀。


一般的文件免杀有:加壳免杀 修改壳程序免杀 修改文件特征代码免杀 加花指令免杀

       
内存免杀:主要是过瑞星的内存查杀。修改内存特征代码即可。也许有些朋友就会问,我不会

    定位内存特征代码怎么办?以后的课程会详细讲解。


现在介绍下各种免杀的做法及适用范围。

1.加壳免杀

大家应该都会,建议你选择一些生僻壳、强壳、新壳,或者加多重壳。这种免杀的很适合新手朋友


使用。简单方便。但这种免杀的时间长不了。


2.修改壳程序免杀


通过加花指令的方法把壳伪装成其它壳或者无壳程序。(不会花指令的可以参考累了的教程)

3.修改文件特征代码免杀

此方法的针对性是非常强的,就是说一般情况下你是修改的什么杀毒软件的特征代码,那么就只可以在
这种杀毒软件下免杀。

主要方法是:直接修改法 和 跳转修改法。其中跳转修改法可以用一些软件来做到。
比如:vmprotect ,用工具实现跳转修改法。

4.加花指令免杀

此方法通用性强,而且效果好。主要有两种:加区加花 和 去头加花。


5.修改内存特征代码

主要是过瑞星的内存查杀。修改内存特征代码即可。

FZ~^cK9g:  
2M o oqJp  
/c:78@  
u]uZc~T  
h51)kN:  
wMvAm%}+  
&E基础知识& (大家象征性看看就可以了。)

1.PE文件的总体结构: 

DOS MZ header 
DOS stub 
PE header 
Section table 
Section 1


Section 2 
Section ... 
Section n 
------------------------------------------------------

2.常见的节名及作用: (看1.jpg,了解一下就可以不用太在意)

节名 作用


.arch 最初的构建信息(Alpha Architecture Information) 
.bss 未经初始化的数据 
.CRT  C运行期只读数据 
.data  已经初始化的数据 
.debug 调试信息 
.didata 延迟输入文件名表 
.edata 导出文件名表 
.idata 导入文件名表 
.pdata 异常信息(Exception Information) 
.rdata 只读的初始化数据 
.reloc 重定位表信息 
.rsrc  资源 
.text .exe或.dll文件的可执行代码 
.tls  线程的本地存储器 
.xdata 异常处理表 
PE文件格式有个比较清楚的宏观认识,在具体讲解每一部分之前先让我们大概了解一下各部分的作用。 
1.DOS MZ header 和 DOS Stub: 
  如果在DOS下执行PE格式文件就会执行后面的DOS Stub,显示字符串"This program cannot run in DOS mode",如果在Window下执行PE格式文件,PE加载器就会根据DOS MZ header中的最后一个域 e_lfnew跳过DOS Stub直接转到PE Header , DOS MZ header 和 DOS Stub的贡献仅此而已。 
2. PE Header: 
  当加载器跳到PE Header后,根据里面的各个域首先检查这是不是有效的PE文件格式,能否在当前的CPU架构下运行,优先加载基址是多少,一共有几个节(section),这是一个EXE文件还是DLL文件等总体信息,有了这些总体信息之后加载器就会跳到下面的Section table。 
3.Section table: 
  有了上面从PE Header获得的总体信息后,加载器并不能准确的加载文件,因为要准确的加载文件,加载器还需要一些关于每一节的更具体的信息,比如:每一节在磁盘文件上的起始位置、大小,应该被加载的线性地址空间的哪一部分,这一节是代码还是数据,读写属性如何等等。所有这些信息都保存在Section table里面,Section table是一个结构数组,数组里面的每一个结构对应PE文件中的一个节。PE加载器就会遍历这个结构数组把PE文件的每一节准确的加载到线性地址空间。(这里还要注意两点:一是PE加载器把PE文件的每一节加载到线性地址空间并不是说把磁盘上的文件调入物理内存;而只是为它分配线性地址空间,分配线性地址空间意味着申请本进程需要的页表,并把相应的信息添入页表中。线性地址空间也可以看作是一种资源,它是通过页表来体现的,当一个页表被添入相应的信息被占用之后那么这个页表对应的那块线性地址空间也就被分配出去了。需要注意的另一点是PE加载器对每一节采用文件映射的方式把相应的磁盘文件映射到内存,而不是把整个PE文件采用文件映射的方法把磁盘文件映射到内存。更具体的解释我会在“Windows 内存管理”中提到
4.Sections: 
  PE文件最后的部分就是各个节了,比如.text , .data , .idata等等,各种节的作用后面会有一个简要介绍。  
思考一下:既然加载器不一定把程序加载到PE头中指定的优先加载基址,那么如果在没有加载到PE头中指定的优先加载基址的情况下,指令中的地址是不是都要依次修改呢?首先我们要明确的一点是程序指令中的地址分两大类,其中一类是在编译过程就可以确定的,这类地址采用的是相对虚拟地址(RVA),所以即使程序没有被加载到希望的基址这些地址也无需修改。另一类地址是编译过程和连接过程都无法确定的,比如那些引用外部库的函数地址,因为外部库之后在被加载器加载后里面的函数地址才能确定下来,所以程序中的这类地址要在程序被加载后进行修改。那么编译器和连接器对这类无法确定的地址是如何处理的呢?加载器又是根据什么如何来对它们进行修改的呢?个人感觉PE文件格式学习中这一部分内容有些繁杂,所以希望大家读后面各节的时候最好时常思考一下这两个问题。从下一节开始我们将对PE文件的各个部分作更为详尽的讲解。重点部分会放在对上面两个问题的解决上。
0 0
原创粉丝点击