感染PE文件的几种讨论

PE文件在这里你可以简单而不怎么准确地理解为windows上的DLL,EXE,COM…后缀的那些可执行文件,即使没有黑框眼镜的加成,如何感染PE文件,对于混迹在Bin或者是逆向分析界的猴子们也是身经百战见得多了。虽然本人并不是二进制安全方面的老司机,不过没见过猪跑,总也吃过猪肉,所以下面的几个章节中,我将讨论下感染PE文件的几种姿势,当然,本文行文的最终目的并不是教会你如何制作病毒程序来感染其他的文件,而是作为一个科普向的讨论,告诉相关的一些套路。如果你对这方面非常感兴趣,你可能需要更深入的了解PE格式,《Windows PE 权威指南》,《加密与解密》都是干货满满的好书。当然我们也可以不做的那么复杂,实际上感染一个PE文件有非常多简单的手法,那么其它话不多说,就让我们实际开始吧。

一.囫囵吞枣

   在06年那个杀毒软件单纯到还能被任务管理器干掉的年代,熊猫烧香也算是天朝知名了,但在这个章节我们并不讨论熊猫烧香的危害性与功能性,而是以熊猫烧香做例子来说一个简单而且通用性非常高的一种PE文件感染手法。

   这种手法非常非常的简单,打个比方就是熊猫烧香病毒想要感染一个文件,首先是把这个文件整个“吃下去”,然后替换这个文件,这样在你下次想要执行这个文件的时候,实际上执行的是个熊猫烧香的病毒,然后熊猫烧香再把源程序给吐出来再执行源程序。

   用图来表示大概是这样的

1.源程序

105350w21fct0l8kx9xh1x.png

                              

2.熊猫烧香

105356vka7lb0bjjjsiwjb.png

3.感染后的源文件

105356u6k2ql8zrz6rghth.png

实际上最终感染后的文件就是源程序和熊猫烧香简单的结合体,“吃下”源程序,可以是直接把这个源程序附加到熊猫烧香的文件尾部或者是作为资源加到熊猫烧香中。当然这种不加修饰不加篇幅的暴力感染,因为PE头资源节指向的仍然是熊猫烧香病毒的资源节,最终感染后的文件图标仍然是熊猫烧香的,所以也就是为什么被感染文件图标会变成一只熊猫的原因之一。

那么最终感染方式的优劣如何?

优点:具有非常高的通用性,不管源程序怎么变花样都能感染,而且释放出来后不会改变源程序本身,避免了很多直接修改容易导致的问题,而且实现非常简单。即使是对PE格式没任何研究的新手也能够实现

缺点:首先感染后图标就告诉别人这个文件被感染啦,有本事你再拷贝到另一台电脑上运行,还有假如这个文件是带参数执行的,没处理好也会挂掉,最后假如你眼尖的话,可以看到运行这个程序后那个目录下又出现了一个奇怪的文件。老手马上会意识到自己电脑中招了。

因此,该方案的评分如下:

兼容性:★★★★

隐蔽性:★

难度:★  

二.见缝插针

  不管是以前还是现在,如何在PE文件中插入自己写的code一直是老司机津津乐道乐于讨论的问题,这个技术在很久以前就已经存在了,但是即使到了今天,该手法仍然被用在了各种方面,而且随着新技术的发展,也不断的有一些新的问题,可以说,这个方法是一个古老而不过时仍然在不断被讨论的手法。

   我们这里只说说这种方法一些最基本的原理

   首先一个PE文件它实际上被分为了非常多的节(sections),为了更方便说明,我们使用LordPe来做一个演示,在这里,我们使用LordPe来随便打开一个EXE文件,然后点击sections

105357fmfno8oxn5azcnef.png

   可以看到,它给我们列出了这个PE文件所包含的所有的节,其中,.text节一般包含了这个程序的代码,.rdata .rsrc可能是一些导入导出、资源这类的数据,.data可能是全局变量,常量之类的玩意。

那个VSize表示的就是这个资源节被映射到内存时的大小,RSize则是文件中的数据大小

   我们以.text节为例,那么它在文件中类似于这个样子

105357pnhbscyesdciesen.png

 

    那么我们需要做的,就是把我们想加的代码添加到那个多出来的空白数据中,然后修改Entry Point(程序入口地址)也就是OEP到我们的代码中,当然,最后我们插入的代码一般也会跳转回原始OEP,那么每次执行这个程序时,都会先把我们的代码跑一遍然后再跳转回原始的程序运行。

105357hf34331mrmsukzzg.png

 

现在原理说完了,这个方案的可行性如何呢?

   优点:首先这个方案的优点是非常明显的,它能够神不知鬼不觉的把代码插入到原始程序中,然后悄无声息地运行,除非你插入的代码实在在屏幕上表现的太明目张胆,或者这个程序本身带有自检程序,否者即使是资深老司机也不能通过直接运行程序或者简单看看Pe结构看出什么猫腻(在Header中有个CheckCode这个即使是错的也不影响运行,何况没谁闲的蛋疼验证checkcode,更何况感染时这个也能改),再者它不会让被感染文件变成熊猫,即使文件被感染了,即使是杀毒软件很难判断这个是不是被感染的PE文件(当然现在情况有所改善,一些杀软会通过编译器特征查看OEP所指向代码是否被修改,因为一些编译器原始OEP指向代码是一些不变的初始化代码,当然,误报率也上升了)

   缺点:如果要说缺点,这个方案的缺点与对应的解决方案就算是一本书也讲不完,有点像这样感染道理都懂但并没有什么卵用的感觉,首先,插入的code一般需要使用汇编直接编写然后将编译后的bin剥离出来,当然,通用性是个大问题,一般x86,x64的你得分别写一遍当然也有别的,另外光懂汇编还不行,为了保证兼容性你还需要保证跳转需要相对地址而不是绝对地址特别是aslr引入后,否者也会挂,而且并不是所有的程序都有足够的空间让你插入code,所以这还需要一点点小运气,最后假如这个程序是具有数字签名的程序,这样修改后这些自然也不能被保留了,当然存在的问题还很多,就不一一列举了。

兼容性:★★

隐蔽性:★★★★★

难度:★★★★★  


三.添砖加瓦

   这个办法实际上可以改叫见“缝插针升级版”或者是“见缝插针ver 2.0”,它解决了见缝插针这个缝不够大的问题同时也不可避免地引入了其它新的坑爹的问题

   这个方法的关键就是,如何在PE格式中插入一个新的Section,当然,首先我们需要做的是,PE文件中是哪里定义Section的数目和数据的,为了说明这点,我不得不上点代码

   首先,PE文件的头部肯定是Pe Header,它实际上是一个IMAGE_DOS_HEADER,通过它我们可以定位到IMAGE_NT_HEADER,在IMAGE_NT_HEADER中的IMAGE_FILE_HEADER结构中,我们可以找到NumberOfSections,它定义了节的数量,所以加入你想新加入一个节,在PeHeader你需要把这个数量+1,当然这样还不够,你需要新建一个IMAGE_SECTION_HEADER来定义你新加节的大小(vsize(映射到内存大小) rsize(文件中大小)),地址(vAddress(映射到内存的建议地址) rAddress(文件实际偏移))节的属性(可读可写可执行…)重定向…,不一一列举,最后,你还需要像见缝插针一样找到一个缝将新的SectionHeader插入到SectionsTable(由多个SectionHeader组成)中去,最后,修改ImageSize和checkCode。你才算把一个Section给成功加了进去

   原始程序类似这样

105358buejkw1uuujyn9oj.png

  

  假如我们想加入一个section4 实际上会变这样

105358c69naat6o3961f8a.png

 

  最后你就可以在section4中填写你想新加入的代码而不用担心受到大小的限制了。

  那么给这个方案打个分吧:

  优点:继承了见缝插针的优点,同时对大小限制变宽了,对有没有空余空间插入代码的运气度也提升了

  缺点:同样继承了见缝插针大部分坑爹的缺点,而且新的节很容易让老司机一眼看出来这个PE文件八成时被动过手脚了,当然会这样做的老司机并不多。

兼容性:★★★

隐蔽性:★★★★★

难度:★★★★★  

四.人面兽心

   首先不管是熊猫烧香这种暴力的囫囵吞枣还是伪君子类的人面兽心,都是先将源程序吞下去,需要的时候还是吐出来,而有所不同的是,在把该源程序吞下去后,会修改自身的资源节指向源程序的资源节,这样一来,不仅仅图标看上去仍然是源程序的,并且右键查看属性也是源程序的属性

同时在需要运行源程序的时候,再将源程序释放出来调用执行。

105358qq5fhs5pqfh5kazd.png

   优点:在保证了兼容性的前提下,伪装的更加彻底

   缺点:修改资源目录并不容易,眼尖的老司机仍然能够发现,杀毒软件也可能发现点猫腻,建议加密源程序的PE header,待解密时再释放出来。

兼容性:★★★★★

隐蔽性:★★★★

难度:★★★  



五.小结

最后,放上自写的一个PE类,包含实现上述功能的基本代码框架,自行玩耍

下载地址:http://bbs.ichunqiu.com/thread-18750-1-1.html

转载于:https://my.oschina.net/ichunqiu/blog/835272

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值