病毒木马查杀实战第026篇:“白加黑”恶意程序研究(上)

前言

众所周知,传统的恶意程序都是由单一文件构成的,从而实现某一种或者几种恶意功能。而这类的恶意程序为了避免被发现以及被查杀,往往会采用五花八门的自我隐藏技术以及免杀技术,病毒程序的作者很多时候也是脑洞大开,为了对抗杀软的查杀也是无所不用其极。我们每天所处理的恶意文件里面,反查杀手段运用得最好的就是脚本木马,关于这类程序,我在之前的《病毒木马查杀实战第025篇:JS下载者脚本木马的分析与防御》这篇博文中也做过简单的论述。可是,不论恶意程序如何进化,杀软厂商总有各种各样的方法来应对现有的以及未知的威胁,因此,恶意程序的作者就势必要采用更加隐蔽的方式来保护自己,免于被查杀。也许正是由于这个原因,“白加黑”恶意程序就应运而生了。

“白加黑”恶意程序概述

所谓的“白加黑”恶意程序,最为显著的特征是由之前的单独作案,发展为团伙“犯罪”。也就是为了实现恶意的目的,往往会由多个程序协作完成。而这些程序如果单独拿一个出来,似乎并没有什么恶意的行为,但是只要把这些文件放在一起,执行其中的某一个文件,那么就会诱发一系列的连锁反应,从而令计算机被感染。

在这样的一个“团伙”里面,一般来说至少会拥有一个.dll文件。这个.dll文件自身不见得包含有恶意行为,也许只是为了实现恶意行为链条其中的一环。由于.dll文件自身并不能直接运行,因此很多朋友往往会对其放松警惕,所以从某种意义上来说,.dll文件天生就带有自我隐藏恶意行为的效果。而“白加黑”恶意程序(们)不可能单独放出来一个.dll文件,还需要包含有至少一个.exe程序(或脚本程序等)来激活.dll文件,也就是说这个“团伙”至少也得有两个成员构成才行。而这篇博文,主要讨论的就是这种最为简单的情况。

是真的“酷狗”程序吗

话说前段时间的某一天,我收到了由我们技术支持发来的一批样本。其中有两个程序引起了我的注意,这两个文件一个叫做KuGou.exe,另一个叫做kugou.dll。按照常理,我们一般都会对.exe这样的可以直接执行的程序抱有很大的戒心。而且又看到这个文件的名称是“KuGou”,那么给我的第一印象就是,要么这真的就是一个由“酷狗”官方出品的正常程序,要么就是某个恶意程序弄虚作假,混淆视听,让我们错误地以为它是真的“酷狗”,降低我们的戒心,让我们不假思索地去点击。

“酷狗”毕竟是一款非常知名的程序,那么为了验证它究竟是不是官方正品行货,最简单的方法可以使用由Sysinternals出品的sigcheck.exe来检测一下这个程序的数字签名:

其中Verified后面的Signed表明该程序的数字签名有效,加上文件的各个信息也是填写得非常完整,那么基本就可以确定这个程序的真实性了。不放心的话可以进一步验证这个数字签名的真伪:

数字签名信息都能够对得上,那么就可以把这个程序归类到“干净”文件夹中了。当然了,更为严谨的做法是需要对其进行逆向分析,确保百分百没问题之后才可以放到“干净”文件夹,关于这个我们后面再讨论。

如果大家不相信“数字签名”的神奇,我这里不妨做一个实验,我利用二进制编辑器(这里我所使用的是Free Hex Editor Neo)将KuGou.exe的第4个字节(偏移为0x3),由原来的00改为01:

这里请大家注意的是,尽管我修改了这个文件,但是一般来说并不会影响这个程序的正常执行,因为PE结构的这个偏移位置并没有多大用处,至少不会对全局产生致命的影响。然后我们再用sigcheck.exe来检测一下:

可以看到,现在的数字签名处于无效的状态,说明要么它被病毒感染了,要么它就是一个虚假的程序。

进一步验证

本着求真务实的工作态度,尽管.dll程序并不能直接执行,但既然是由客户发给我们分析的,我还是要认真看一看的。首先还是要利用sigcheck.exe来检测一下这个kugou.dll文件:

可见,这个文件的信息可以说是一片空白。此时我心中是有疑问的,难道“酷狗”的.dll文件就是不带数字签名的吗?于是我到“酷狗”的官方网站下载了程序的安装包,安装后就得到了绝对官方正品的kugou.dll文件,查看一下它的数字签名信息:

结果很明显,即便是.dll文件,也是带有数字签名的。但是现在还不能草率下结论,毕竟我所下载的版本较新(8.1.32.19628),而我收到的样本较旧(8.1.00.19303),有没有可能旧的版本就是这样的呢?好,那么不妨再深入对比一下。既然是.dll文件,那就从二者的导出函数入手吧。首先看一下已经确认为官方正品的导出函数情况:

可以看到,一共有三个导出函数(不知道为啥第三个导出函数的编号是4呢?)。接下来再看一下那个可疑文件的导出函数:

对比发现,可疑文件多出来了一个叫做“FlashboxMain”的函数,而且还有一点很奇怪的是,编号为1、2、3的这三个函数的地址竟然全都是0x100011E0,也就是说这三个函数实际上调用的是同一处代码,正常的程序怎么可能会这么干呢?不妨再看一下这个位置的代码:

可以看到,它实现的功能就是eax异或自身,也就是自身清零,接下来就利用retn直接返回了。可以理解为这段代码并没有实现什么有用的功能,然后也就结束了。至此,我可以百分百确定说,这就是一个恶意程序。再总结一下我的理由:

1、这个文件的名称是kugou.dll,尽管你起什么名字我是管不着的,但是既然你的名字与一家知名公司的知名软件相同,那我就必需要怀疑一下了,万一你是想欺骗无知大众呢?

2、既然你觉得你是“酷狗”的组件,但是为什么没有文件信息以及数字签名呢?

3、对比真实的kugou.dll文件,你们导出函数的数量不一样也就算了(毕竟不是一个版本),但为什么有三个导出函数的地址是一模一样的呢?而且查看反汇编代码发现,这三个函数其实什么功能都没有实现,你还想说你是清白的?真正大公司的程序员,谁会写这么无聊的代码啊?

可见,我们分析恶意程序,很多时候就是判断目标文件有哪些不正常的地方。也许出现一两个不正常的地方,我还可以理解为是程序员的恶作剧,但是如果不正常的地方实在是太多,那么我就只能理解为是黑客在搞鬼了。

尽管我还没有分析这个恶意程序究竟是想要实现什么功能,但是分析到目前这一步其实基本也就够用了。一般来说,这类程序属于后门或者远控木马,或者属于DLL劫持,给它分个类,起个名字,提个特征,加入病毒库,也就完成了整个分析的流程。可能大家看我在这里啰哩吧嗦地讲了这么多觉得时间很漫长,但在我们的日常工作中,判断一个文件是不是干净的,仅仅几分钟就够用了。毕竟世界上每天都会出现非常多的恶意程序,那么分析的速度以及准确率的高低,就是我们每天能不能按时下班以及会不会收到很多投诉的关键因素了。

kugou.dll是怎么实现恶意功能的

不知道大家想过没有,这个假的kugou.dll是怎么执行的呢?其实在正常的软件开发中,程序猿们不可能把要实现的所有功能都写在一个.exe程序里面,这样的话必然会让这个程序越来越大,同时也不利于功能的升级,所以将一些常用的功能写成.dll的形式,有需要的时候再进行调用就可以了。简单来说,在有需要的时候,KuGou.exe可以利用LoadLibrary()函数将kugou.dll加载到内存中,然后再利用GetProcAddress()函数调用kugou.dll中的导出函数就可以了。一般情况下,对于KuGou.exe这样的程序来说,它一般不会去验证自己调用的.dll程序是不是真的由自己公司出品的.dll程序(我并没有做逆向分析,仅仅是感觉),只会依据文件路径、文件名称以及导出函数的名字来直接进行调用。毕竟程序开发人员不可能把所有方面都考虑到,但是在调用.dll文件之前,先进行验证,比如进行哈希运算再进行哈希值的对比,虽说大大增加了工作量,但却不失为一种安全的做法。但这么做到底有没有必要,还是需要好好讨论一下的。

其实根据我的理解,随着软件工程开发方法的不断完善,软件的安全也越来越被开发者所重视。推动安全开发方法学发展的,正是那些“孜孜不倦”地研究如何黑掉那些软件,从而为自己牟利的黑客们,正是他们推动了整个开发理论的不断进步。当然了,像是.dll劫持这类的恶意利用方法,还是比较初级的,现在流行的是五花八门的漏洞利用技术,令即便是资深软件开发工程师也防不胜防,也是顶级黑客们的脑力竞赛。关于这个,以后有机会,我再好好讨论一下。

再说说数字签名

在上面的内容中,我判断一个程序是不是恶意程序的一个关键方法是查看它是否具有数字签名。但是这段时间以来,我还是遇到了很多文件名为dllhost.exe、svchost.exe以及explorer.exe这一类的程序,乍一看还不敢随便下判断,因为Windows中的很多自有文件就是这个名字,如果再查看一下他们的签名信息,可能是这样的:

文件基本信息倒是很全,但是唯独最重要的数字签名反而没有,难道这是伪造的吗?其实,如果从系统中把这个explorer.exe给找出来,那么同样会发现,微软官方系统中的文件也是没有数字签名的,有的只是诸如上图那样的基本信息,这可就麻烦了,难道真的要反汇编一点一点地逆向分析可疑文件功能了?

其实也不用那么麻烦,毕竟我拥有各式各样的Windows系统,虚拟机和工作机中就有Windows XP以及两个版本的Windows 7,再加上我笔记本中的Windows 10,那么就足以应付日常分析的需要了。毕竟黑客再牛,也不可能把文件哈希也做出来一模一样的吧?于是每次遇到这种情况,为了保险起见,我都会依据文件的版本号,从对应的Windows系统中找到真正的文件出来,对比他们的哈希值,一下就能够知道真假了。不晓得这算不算是投机取巧呢?

大部分情况下,黑客想“伪造”一个Windows文件,还是比较用心的,文件信息就如同上图那样,和真的一模一样。但我有些时候也会遇到一些做事不严谨的黑客,他们伪造的文件信息可能会是这样:

其中最大的问题是Publisher后面多打了一个回车,使得公司名称到下一行了,那么很明显,这就是一个恶意程序了。仅仅几秒钟,就完成了文件黑白的判断。

小结

大家从我的这篇文章也可以看到数字签名的重要性。包括在写代码的时候,千万不要写得过于晦涩难懂,不要搞恶作剧,免得就被当作病毒给误杀了。当然了,“白加黑”恶意程序其实远远没有这么简单,我这次讨论的仅仅是快速判断的方法,详细的分析我会在接下来的文章中为大家讨论一下。

时间: 2024-10-01 07:41:03

病毒木马查杀实战第026篇:“白加黑”恶意程序研究(上)的相关文章

病毒木马查杀实战第018篇:病毒特征码查杀之基本原理

本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 在本系列的导论中,我曾经在"病毒查杀方法"中简单讲解过特征码查杀这种方式.而我也在对于实际病毒的专杀工具编写中,使用过CRC32算法来对目标程序进行指纹匹配,从而进行病毒判定.一般来说,类似于MD5以及CRC32这样的算法,在病毒大规模爆发时是可以提高查杀效率的,但是传统的更为常用的方法是采用以静态分析文

病毒木马查杀实战第019篇:病毒特征码查杀之编程实现

       本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 上次我们已经简单介绍过了病毒特征码提取的基本方法,那么这次我们就通过编程来实现对于病毒的特征码查杀. 定义特征码存储结构 为了简单起见,这次我们使用的是setup.exe以及unpacked.exe这两个病毒样本.经过上次的分析,我们对setup.exe样本的特征码提取如下: \x2a\x2a\x2a\xce\

病毒木马查杀实战第020篇:Ring3层主动防御之基本原理

本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 如果说我们的计算机中安装有杀毒软件,那么当我们有意或无意地下载了一个恶意程序后,杀软一般都会弹出一个对话框提示我们,下载的程序很可能是恶意程序,建议删除之类的,或者杀软就不提示,直接删除了:或者当我们运行了某一个程序,包含有可疑操作,比如创建开机启动项,那么杀软一般也会对此进行提醒:或者当我们在计算机中插入U盘,杀软往往也会

病毒木马查杀实战第017篇:U盘病毒之专杀工具的编写

       本系列教程版权归"i春秋"所有,转载请标明出处. 本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 经过前几次的讨论,我们对于这次的U盘病毒已经有了一定的了解,那么这次我们就依据病毒的行为特征,来编写针对于这次U盘病毒的专杀工具. 专杀工具功能说明 因为这次是一个U盘病毒,所以我打算把这次的专杀工具换一种形式实现.不再像前几次那样需要被动运行,而是当我们的专杀工具执行后,一旦有U盘插入,就能主动检测U盘内容,如果发现病毒,

病毒木马查杀实战第015篇:U盘病毒之脱壳研究

本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 由于我们的最终目标是编写出针对于这次的U盘病毒的专杀工具,而通过上次的分析我们知道,病毒有可能在不同的计算机中会以不同的名称进行显示,如果真是如此,那么就有必要在此分析出病毒的命名规律等特征,然后再进行查杀. 对病毒样本进行脱壳 按照常规,首先是对病毒进行查壳的工作,这里我所使用的是"小生我怕怕"版的PE

病毒木马查杀实战第021篇:Ring3层主动防御之编程实现

本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 我们这次会依据上次的内容,编程实现一个Ring3层的简单的主动防御软件.整个程序使用MFC实现,程序开始监控时,会将DLL程序注入到explorer.exe进程中,这样每当有新的进程创建,程序首先会进行特征码匹配,从而判断目标程序是否为病毒程序,如果是,则进行拦截,反之不拦截.停止监控时,再卸载掉DLL程序.以下就是程序各个

病毒木马查杀实战第022篇:txt病毒研究

       本系列教程版权归"i春秋"所有,转载请标明出处. 本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 反病毒爱好者们很喜欢讨论的一个问题就是,如今什么样的病毒才算得上是主流,或者说什么样的病毒才是厉害的病毒呢?我们之前的课程所讲解的都是Ring3层的病毒,所以有些朋友可能会认为,那么Ring0层的病毒其实才是最厉害的,也是病毒发展的主流:或者有朋友可能认为,采取了五花八门的隐藏技术的病毒才是最难对付的.诚然,大家的观点都很有

病毒木马查杀实战第014篇:U盘病毒之手动查杀

       本系列教程版权归"i春秋"所有,转载请标明出处. 本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 在U盘中发现病毒 前段时间需要往虚拟机中拷贝点资料,如同往常一样,插上我的U盘,并且在虚拟机的设置中选择连接U盘.奇怪的是这次的连接时间较以往长,并且还出现了"自动播放"窗口: 图1 自动播放窗口 在扫描完后,来到了U盘的打开类型选择窗口: 图2 以前我在虚拟机中使用U盘,都没有出现过"自动播放&qu

病毒木马查杀实战第016篇:U盘病毒之逆向分析

       本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 比对脱壳前后的程序 我们这次所要研究的是经过上次的脱壳操作之后,所获取的无壳病毒样本.其实我们这里可以先进行一下对比,看看有壳与无壳的反汇编代码的区别.首先用IDA Pro载入原始病毒样本: 图1 可以发现此时IDA Pro的Functionwindow是空的,说明很多函数没能解析出来,并且还无法切换到图形模式,而图