注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

溪亭残月的博客

I want bring you into my heart !!

 
 
 

日志

 
 

引用 免杀基础三步走之二(PE文件结构)  

2009-06-11 00:02:04|  分类: 免杀技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

引用

A1Pass免杀基础三步走之二(PE文件结构)

题记:本文发表于《黑客X档案》08年第9期,这是在其中分离出的第二段。

 

转载请注明版权:http://a1pass.blog.163.com/    作者:A1Pass

 

    不知道通过上一节的学习与大家自己的努力,许多以前曾困惑不解的问题现在是否已经有了满意的答案。如果自己认为理解的还不够,就多实践一下,多思考一会,多搜索一次,相信你会因此而变得不再平凡。

    这一节就让我带领大家走进文件系统的底层——PE文件结构的学习与探究。

    其实PE文件就是指Windows里的DLLEXE文件,PE的意思就是 Portable Executable,即可移植的执行体。大家也可以将其与JPG文件或MP3文件等对应理解,也许这样就会揭开它的神秘面纱,显得更为亲近一些。当然,PE文件要远比MP3等文件复杂得多,但是作为Windows操作系统里特有的一种可执行文件格式,只要我们能对其有一个大体的了解,就会使我们了解更多的免杀技术的本质,从而更加有效与正确的利用这些技术。

 

一、PE文件入门

          PE文件总的来说是由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成。其实,如果在纯Windows环境下运行,DOS文件头、DOS加载模块根本是用不上的,加上两个DOS相关的结构完全是为了兼容性问题。

    为了方便观察与理解,我们可以通过观察1大体了解PE文件的结构。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    如图可知,整个程序就是以DOS文件头“MZ”开始的,接下来就是DOS加载模块“This program cannot be run in DOS mode”,几乎每个Windows程序的前面都是这样一些信息!

    下面有一个以字母“PE”为开头的文件块,这就是大名鼎鼎的PE文件头了,PE文件头的标准大小为224个字节,由图可见,里面有一个画了横线标记的问号与左面的十六进制信息“E0”相对应,这便是PE文件头体积的描述标记,十六进制的“E0”等于十进制的“224”由此也不难看出PE文件头的大小为224个字节。

    再往下就是以“.text”、“ .data”与“.rsrc”组成的区段表了。区段表也称节表,它的作用就相当于一本书中的目录,你想看哪一章哪一节,只要按着目录标注的页数去找就可以,PE文件的区段表也是起同样的作用,但是区段表除此之外还包含有各个区段的读写权限信息。而图中的“.text”、“ .data”与“.rsrc”则是这个程序里的区段名称,也称为“节”。由此可见这个程序是由“.text”、“ .data”与“.rsrc”这3个区段组成的,如2

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    其实通过区段名称就可以大体猜出来这个区段里包含什么信息,在整个程序中能起到什么作用等等。

    由此可见,PE文件是一种结构组成十分科学的文件格式,因此也对我们快速的认识它起到了助推器的作用,只要你记住PE文件的这5个构成的结构,你就可以向别人说,我了解PE文件!

 

二、深入了解PE文件与文件头

    下面让我们抽象的了解一下PE文件的构成:

DOS MZ header    <<DOS

DOS stub         <<DOS加载模块

PE header        <<PE文件头

Section table      <<区段表

Section 1         <<区段1

Section 2       <<区段2

Section ...

Section n      <<区段n

 

    如果要详细介绍PE文件,恐怕就是这一期X档案也介绍不完,所以我就为大家简单的说明一下,如果你喜欢,可以当作一种知识储备给背下来。

          DOS MZ header也称之DOS文件头,亦或DOS MZ文件头,它是一段以关键字MZ为开头的数据,偏移量3C处包含着PE文件头的起始位置信息。

          DOS stub这个区块是以一段“This program cannot be run in DOS mode”为标志,当运行环境不匹配时则弹出这句话,对于WIN32位的操作系统来讲,存在的意义不大,完全可以删除。

          PE header这就是需要我们着重研究的PE文件头了,他是一段以关键字“PE”为开头的数据,默认大小224字节,里面包含着许多信息,不过对我们有用的就是描述自身大小的一个字段,他家可以仔细观察图1PE文件头里的画横线部分。

          Section table区段表,也称为节表,这是一段记录着整个文件中区段的大小与位置信息表。

          Section 1区段,也称之为节,大家可以将其理解为一个个存放数据的抽屉,每个抽屉都有自己不同的名字,往往通过名字就可判断里面包含着真么样的数据。由于这些区段的数量并没有限制,所以用了“Section 2”“Section ...”“Section n”表示剩余部分。

 

    希望通过以上的介绍,大家能对PE文件有一个比较宽泛的了解,但是除此之外,对于免杀技术来说,还有输入表也是我们必须了解的,而对于输入表,就不这么简单了。

    输入表也称“导入表”,要想了解导入表,我们还要从导入函数讲起,一看到类似的术语,也许有一些初学的朋友又要嘀咕着埋怨俺了。其实大家不用担心,电脑中的术语与你的名字没有什么区别,你不需要理解它究竟是什么意思,只要知道他代表什么就可以了。

    我们知道,如果一个程序需要运行的话,它执行的就是文件内部代码,而导入函数恰恰不属于这个定义,也就是说,导入函数就是代表被程序调用执行,但其执行的代码却不再程序中的一小部分函数。这些函数的真正代码位于某些DLL文件中,这调用者的程序中只保留一些调用这些函数的信息,包括需调用的函数名与DLL文件的名称等等。

    但是对于这些硬盘上静态的PE文件来说,在自己被映射到内存之前,无法得知这些导入函数会在哪个地方出现。只有当文件被装入内存后,Windows才会将相应的DLL文件装入,并将导入函数与DLL中的实际函数地址联系起来,这便是“动态链接”的概念,也就是为什么DLL文件会被称为“动态链接库文件”的原因。

    说了这么一大堆,归根结底就是要大家明白,动态链接就是由“导入表”来完成的。

 

三、由这些知识想到的

    看完这些,不知道大家有什么想法没有,我想现在肯定仍然有些朋友还被一种叫做“修改PE段”的免杀技巧所困惑,为什么自己总是不成功呢?

    记得我曾经在X档案07年第7期中发表一篇名为《木马免杀全攻略》的文章,其中就涉及到了“修改PE段”的免杀技巧,写完之后有一些朋友反映操作不成功,其实就是因为我当时对PE文件结构不了解造成的。

    这里我就针对PE文件头的修改在这里详细的介绍一遍。

    我们就针对WebHacking[A1Pass干净版]为例,做一次PE文件头的免杀。首先,为了能有一个比较“干净”的修改场所,我们需要将其PE头部的垃圾信息清理一下,这里使用的工具是PeClean,我们只需将WebHacking拖放到PeClean的界面即可完成清理,如图3所示,然后通过反汇编工具WinHex打开。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    打开后如4所示,通过与图1的典型PE文件对比,我们发现许多没用的信息现在已经能够清理干净了,这样更有利于我们的修改操作。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    接下来就是计算PE文件头的大小了,我们沿着PE文件头开始标志“PE”往下找,第一个问号处所对应的16进制信息就是PE文件头的大小了,如5所示。其实这种查找方法是有一定的局限性的,我们也可以这样找,在关键字“PE”后的第17个字节处的数据就是代表PE文件头大小的信息。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    我们由图5得知,与之相对应的16进制信息为“E0”,转换为10进制也就是“224”,如6所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    由此我们得知了PE文件头的大小为224字节。也许看到这里有的朋友会有疑问,前面介绍PE文件的时候不是说过PE文件头的大小为224字节了吗?为什么这里有讲一遍呢?其实这样做只是考虑到怕大家遇到特殊情况,例如PE文件有已经被做了手脚,如果再详细的介绍一遍,这样可保证大家可以轻松应对任何情况。

    下面我们就有关键字“PE”开始向下复制224个字节,其实还有更方便一些的方法我们可以边复制,边注意WinHex右下角的“大小”信息,当其显示为16进制的E0时,即说明我们已经选择了224个字节的信息了,如7所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    下面我们按快捷键【Ctrl+C】复制这段数据,然后在刚刚选取PE文件中部,由下向上选取224字节的区域,同理,我们看“大小”信息后显示16进制信息E0后即可停止,如8

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    通过图8可知,我们的光标停留在所选区域最前方。也就是偏移量80上,下面我们按快捷键【Ctrl+B】,会弹出一个对话框,提示“剪切板数据将写入在偏移量80”,我们点击确定即可,结果如9所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    这里一定要注意,在按快捷键之前,一定要确定光标在所选择区域最前方,否则会导致程序不能运行,甚至执行后会导致系统崩溃。

    现在我们要将原PE文件头的剩余部分如10所示用00填充。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    然后我们在区段表的第一个节表“.nsp0”前开始选择,一直到PE文件头的头部,如11所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    与图可知,我们选择区域的大小为16进制的140,也就是10进制的320字节。我们只需将这个数值减去24,等于296,这就是现在位移后的PE文件头的真正大小。

    也就是说,实际上我们PE文件头大小此时已经由原来的224变为现在的296,转换为16进制就是128,现在通过以上的PE文件知识推理可知,我们应该将上面的E0改为现在的128,但是实际应用时我们却不能这么改,因为涉及到高低位的问题,关于高低位的问题这里大家不必了解,只要记住它的规律即可。

    就拿我们精要更改的128为例,真正应用时要输入为28 01,如12所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    而如果大小是567的话,那么就应输入为67 05,而ABC自然就是BC 0A

    明白了修改PE文件头大小的方法后,我们还应该修改记录PE文件头位置的信息,这个就比较容易了,通过PE文件的基础知识我们知道,记录PE文件头的字段位于DOS文件头的偏移量3C处,如13所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    我们可以知道原来的PE文件头位于偏移量C8处,但是现在我们PE文件头位于偏移量80处,所以我们只要将C8改为80即可,如图14所示。

免杀基础三步走之二(PE文件结构) - A1Pass - A1Pass的风清月朗居

    最后保存即可,运行一下试试功能也完全正常。

    也许这节讲的难度略微提高了一些,对于新手可能有些障碍,如果你想快速入门,推荐你先读一读我写的《木马免杀全攻略》,也许会让你快速入门。

 

  评论这张
 
阅读(25)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017