Python大本营 今天以下文章来源于CSDN ,作者杨秀璋 作者 | 杨秀璋,责编 | 夕颜 出品 | CSDN博客 这是一篇基础性文章,将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。 01 PE病毒概念什么是PE病毒?
PE病毒数量非常之多,包括早起的CIH病毒,全球第一个可以破坏计算机硬件的病毒,它会破坏主办的BIOS,对其数据进行擦写修改。再比如熊猫烧香、机器狗等等,其危害非常之大。 什么叫感染?
CIH病毒
CIH病毒曾入榜全球十大计算机病毒之首,该病毒引起了许多重要部门的严密关注,其原因不言而喻。如果指挥、通信、政务等系统受到了CIH病毒的威胁甚至破坏,其后果不堪设想。 如果我们要编写PE病毒,则需要掌握以下的关键:
02 PE病毒的分类以感染目标进行分类,包括: (1) 文件感染 将代码寄生在PE文件,病毒本身只是PE文件的一部分,依赖于感染目标,通常也叫HOST文件,控制权获得也是以目标程序运行来获得的。分为:
(2) 系统感染 将代码或程序寄生在Windows操作系统,该类病毒越来越多,它不感染具体文件,但是它会在操作系统中保存自己的实体。同时也可以通过系统启动的方法来获取控制权。传播途径包括:
03 传统文件感染型1.感染思路当我们了解PE文件格式之后,要了解PE文件感染型病毒就非常容易了。如下图所示,左边是一个正常的PE文件,右边是PE病毒感染该程序时的修改,可以看到病毒代码在最后面,通常它是一种新节的形式。我们知道PE文件是由多个节组成的,病毒代码为了融入目标程序会以节的形式,同时修改PE文件头。 对感染来说,它一方面需要使得对方具备自己的功能,另一方面也不破坏对方程序的功能。所以病毒代码执行完毕之后,它必须要将控制权交给原始程序,从而防止病毒被发现。
PE病毒典型案例下面是演示代码,感染本目录下的test.ext文件,它没有破坏性,tset.exe被感染后,首先执行病毒代码,然后执行自身代码。如下图所示,存在四个文件。其中main.exe是PE病毒程序,它会感染当前目录下名为“test.exe”的文件。这里仅是测试PE病毒感染代码,没有破坏功能。
第一步,我们尝试打开test.exe文件。它是一个正常的PE文件,前面的文章也分析过,它包括两个弹窗,如下图所示。 第二步,使用OD打开test.exe如下图所示,发现起始地址为0x00401000,该exe程序大小为2.50KB。 第三步,运行main.exe程序,它是PE病毒。注意,它会弹出如下图所示对话框,这是为了方便演示,而真实的PE病毒不会提示你信息。程序是两位大佬所写,其中一位是Hume前辈,另一位 ^ _ ^ 同时,如果360会查杀该病毒,添加信任即可。但当我们在真实恶意样本分析时,一定要在虚拟机等有保护环境下进行。 IDA分析mian.exe如下图所示: 第四步,此时test.exe文件大小已经增加为6.50KB,说明其已经被恶意感染。 双击test.exe显示如下图所示,它会先弹出一个感染测试对话框,然后才是接下来的正常程序对话框。 用OD动态分析,发现程序入口地址是0x004042DC。说明该程序先执行PE病毒,之后才执行正常的程序,而真实的PE病毒不会只简单的弹出提示窗口,而会隐蔽的进行一些破坏或收集信息。 第五步,将被感染的“test.exe”重命名为“test-ok.exe”,然后将记事本修改为“test.exe”,因为我们的代码只感染当前目录下“test”命名的文件。 接着运行“test-ok.exe”程序,发现打开记事本也会弹出如下图所示的对话框,接着才是记事本,说明该程序也被感染。 第六步,通过同样的方法感染计算器程序,如下图所示。 写到这里,该案例就演示完毕,这是一个传统典型的PE病毒感染示例。 3.关键技术(1) 重定位重定位在前面讲PE文件格式化时介绍过,尤其DLL文件常见重定位。因为DLL文件会加载到不同的位置,如果再按照VA地址定位会出现差错,所以会出现重定位。对于病毒程序也是一样的,它有相应的代码去感染目标程序,而目标程序有很多,病毒程序写在目标程序什么位置呢?这就需要病毒代码去定位目标程序的位置,就要利用重定位技术。
① 为什么需要重定位呢? 下面是一段源代码(PE最小文件案例),通过mas32编译生成的目标程序。源代码非常简单,就是调用invoke,通过invoke调用MessageBox函数,包括四个参数;程序第二个语句是invoke调用退出。这里弹出对话框涉及两个字符串szCap和szMsgOK。
当该程序编译之后,反汇编结构显示如下图所示,比如Start位置,MessageBox函数包括四个参数,我们采用PUSH压入堆栈,再CALL调用该函数。
图中红色圆圈显示的是PE文件代码的二进制部分,它是一个VA的地址,即RVA+ImageBase。程序在编译后,某些VA地址(如变量Var 004010xxh)就已经以二进制代码的形式固定,这就是需要重定位的原因。 下图展示正常情况的ImageBase,值为400000H。比如HEX数据为“00104000”,由于高位在后面,所以对应的地址是“00 40 10 00”。 如果ImageBase为600000H,则代码不做重定位,PUSH压入堆栈的值为401000和401014。而此时的值什么也不是,通过数据窗口定位地址发现不存在。左下角可以看到,00601000位置才是存放的数据。所以,重定位需要将这里的40修改为60。 总之,如果病毒代码插入位置不固定,也会遇到类似的问题。病毒代码必须通过重定位解决类似的问题。 ② 下面看看病毒代码植入HOST文件后的位置差异。 左边是病毒在感染前的VAR位置,其地址为004010xx;当这段代码插入到另一个HOST文件后,如右图所示,变量的实际位置和预期位置出现了差异,而重定位的关键是知道这个差异是多少,后续遇到的各种变量或地址都可以通过这种差异方式校正。
但是根据HOST特征逐一硬编码这种方式不太可取,其繁琐且未必准确,所以采用另一种方法,病毒代码运行过程中自我重定位。首先它计算刚才的差异值,接着调用call delta将下一条语句开始位置压入堆栈,此时堆栈顶端存放的是pop ebp语句,它在内存汇总真实的地址;再后面是sub减法操作,ebp减去offset delta;最后当我们需要重定位时,比如使用varl变量,重定位则为ebp+offset来消除差异,此时eax中存放varl在内存中的真实地址。 CALL语句功能:
(2) API函数自获取前面介绍了PE文件的引入函数节,它是目标程序作者编写的,当调用外部DLL中的API函数时,通过引入函数节将这种关系定义出来,系统加载时就能加载对应的DLL文件并找到相应的API函数,再将地址写入到PE文件的引入函数表中,程序运行时就直接从引入函数表中取地址进行调用,这是正常的PE文件运行过程。 但对于病毒程序来说,它是一段代码,当它感染另外一个程序时,它是否能修改目标程序的引入函数节,而使得其可以服务病毒代码呢?从原理上来说,这是可以实现的,但非常复杂,因为要在引用函数节添加东西一定会导致其他结构的变化,需要做很多的修正工作,这也可能破坏原有功能。所以对于病毒来说,它需要自己去获取API函数地址,并且没有引入函数节的支撑,但它又必须要使用很多API函数来实现病毒功能。
① 如何获取API函数地址呢?
② 当我们获得GetProcAddress和LoadLibraryA地址后,想获取任何一个API函数地址都可以。那么,怎么获取这两个函数的地址呢?
③ 接着,我们看看获取Kernel32模块基地址的典型方法。
– 程序入口代码执行时Stack顶端存储的地址 (3) 目标程序遍历搜索通常以PE文件格式的文件(如EXE、SCR、DLL等)作为感染目标,其关键点为全盘查找或者部分盘符查找,遍历算法包括递归或非递归。在对目标进行搜索时,通常调用两个API函数:
搜索目标进行感染算法如下: (4) 文件感染感染的关键是病毒代码能够得到运行,常用方法包括:
同时,病毒代码执行时,程序的正常功能不能被破坏,即控制权的交换。
感染文件的基本步骤为: ①判断目标文件开始的两个字节是否为“MZ” ②判断PE文件标记“PE” ③判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续 ④获得Directory(数据目录)的个数(每个数据目录信息占8个字节) ⑤得到节表起始位置(Directory的偏移地址+数据目录占用的字节数=节表 ⑥得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)节表起 ⑦开始写入节表和病毒节 ⑧修正文件头信息 04 捆绑释放型捆绑释放型感染实现起来比较简单,目前很大一部分病毒程序都采用这种方法。捆绑释放型感染时将目标HOST程序作为数据存储在病毒体内,当执行病毒程序时,它先执行病毒程序,然后还原并执行HOST文件,从而保证被感染的程序本身能正常运行,不会引起一些异样。
05 系统感染型系统感染型本身不对PE文件做任何感染操作,但它感染的目标是操作系统,也是一种寄生类的方式,只是寄生目标有所不同。这类病毒通常为独立个体,不感染系统内的其他文件。 两个关键问题:
1.控制权再次获取下面简单讲解控制权再次获取的自启动方式。首先看看操作系统启动流程:
整个启动流程也是控制权传递的过程,包括现在提出的可信计算,也是对控制权一步一步的校验,控制流程的数据完整性或行为的校验。对于操作系统本身,它的启动方式很多,系统内部包括:
下图展示了Autoruns软件看到Windows操作系统进行自启动的选项。如果病毒本身能很好地结合这套机制,它可以做的事情非常多,并且具有很好的隐蔽性。 其他启动方式:
2.病毒的传播方式一切可对外交互的渠道都可传播,包括:
邮件蠕虫越来越常见,其中以邮件附件的形式进行传播较多。附件中可能包含病毒包括exe文件、rar文件、pdf文件、doc文件、xls文件、jpg文件、chm文件等。下图是一个包含病毒的邮件附件,显示为一个word文档,后缀名doc,图标显示也是word。但它的真实后缀是scr(屏保),它其实是利用了一种技术,在文件名里插入翻转字符,然后将翻转字符之后的其他字符进行了翻转,它的完整文件名应该是“5月TW行lmcod.scr”。这也是一种欺骗性很强的攻击手法。 再补充一个通过可移动存储设备传播的非感染式病毒,即Autorun.inf。右图显示了Autorun.inf文件,如果文件存在U盘根目录,当我们双击这个U盘时,它就会触发对应的病毒,如果选择U盘盘符右键打开或打开资源管理器,这是进入的也是病毒程序。当然下面的演示是计算器程序。 [AutoRun]open=mspaint.exeshell\open=打开(&O)shell\open\Command=calc.exeshell\open\Default=1shell\explore=资源管理器(&X)shell\explore\Command=calc.exe 还有一类是伪装的文件夹,如下图所示photo.exe文件,当Windows操作系统默认不显示“.exe”时,它就能伪装成文件夹,当我们双击之后就会运行病毒,同时可以打开某个文件夹进行隐蔽。 最后,补充“摆渡”知识点,这种攻击行为经常发生在一些具有特殊目的病毒程序身上。期望通过可移动的媒介来渗透一些平时不联网的电脑中,并从中获取数据,利用摆渡的方式植入病毒或木马到内网,比较典型的案例就是Stuxnet。 下图展示了Stuxnet震网事件的漏洞利用过程和启动方式,传统的Autorun方式很容易被禁止掉,而Stuxnet利用的是lnk漏洞(MS10-046),它会在目标U盘下放入lnk快捷方式及病毒程序(如DLL文件)。不管通过什么方式进入U盘,lnk文件会被解析从而触发漏洞,导致U盘中的病毒程序被执行。 06 总结写到这里,这篇文章就介绍完毕,通过这些PE病毒原理、分类及感染方式的讲解,有利于大家去做一些拓展和思考,也体现出当下的网络形式,存在很多安全隐患,安全防御是非常必要的。
原文链接: https://blog.csdn.net/Eastmount/article/details/106204633 |
|