暴风一号蠕虫病毒专杀详解
暴风一号不是一个复杂的病毒,但是我是第一次接触vbs病毒,所以还是折腾了好多天。在此把暴风一号和暴风一号变种详解过程写出来,供和我一样的初学者参考。
暴风一号(BoyFine)是用VBScript写的一个U盘蠕虫病毒,第一次接触vbs,所以在别人的提醒下,才知道vbs是直接可以用记事本查看源码的,但是暴风一号和暴风一号变种的源码,很明显被加密了,所以就要先解密。
解密好了病毒,查看其源代码:=。=看不懂……想要深入了解病毒,当然要知道它都做了些什么,所以我就开始了痛苦的深入了解过程,一句一句的Baidu、Google它的函数,这过程确实头疼。某前辈知道我这样做,把我训了一通,说:你似乎离目标更遥远了;怎么容易怎么做。我有点不解,所以就开始思考这个问题。O(∩_∩)O~最后终于想明白啦,我再这样子分析下去,大概分析完了,vbs我都能会了,可其实没必要这样,只要知道病毒破坏了什么地方,把被破坏的地方修复了就可以了。
在虚拟机里,看到表面上看到的是病毒把各个盘符根目录下的所有文件夹都改为了系统文件夹属性,将每个文件夹都显示一个快捷方式,快捷方式上的箭头也给去掉了,这样表面上就好像是真的文件夹。此外,在各个盘符的根目录下产生了随机名称的****.vbs病毒,和一个AutoRun.inf文件。
用c++将以上被破坏的内容修复不是很复杂,将各个盘符下不是系统文件夹的文件夹用SetFileAttributes函数设置文件夹属性为FILE_ATTRIBUTE_NORMAL即可。然后删除快捷方式,这一点应该注意下,不应该删除所有的快捷方式,毕竟不是所有的快捷方式都是病毒产生的,所以在判断到文件为文件夹时,用tstrNew1.Insert(tstrNew1.GetLength(),__T(".lnk"));得到文件夹快捷方式名,然后删除。想要删除随机名称的****.vbs也并不复杂,因为只要打开AutoRun.inf文件,你就会发现病毒名称就在里面了,只要提取出这个病毒名即可,这样就可以删除掉****.vbs了。最后删除AutoRun.inf。
表面上的问题解决了,也仅仅是表面上的。查看病毒源码,不难发现,病毒修改了注册表。(⊙⊙b汗!其实以前我都不知道注册表干嘛用的……)
直接从源码中找到所有有关注册表的路径,然后把值修改为它本来的样子。
例如修改其中一项:
HKEY hkey;
BOOL boretn = FALSE;
long lResult;
CString DataValue = "";
LPCTSTR lpSubValueName = "load"; //如果是默认的键,设置为NULL即可
LPCTSTR lpDataSet = "SoftWare\\Microsoft\\Windows NT\\CurrentVersion\\Windows";
LPBYTE lpDataValue = CString_To_LPBYTE(DataValue);//CString_To_LPBYTE()是自己写的类型转换函数。
lResult = RegOpenKeyEx(HKEY_CURRENT_USER,lpDataSet,0,KEY_WRITE,&hkey);
if (ERROR_SUCCESS != lResult)
return boretn;
lResult = RegSetValueEx(hkey,lpSubValueName,0,REG_SZ,lpDataValue,lstrlen(DataValue)+1);
if (ERROR_SUCCESS != lResult)
return boretn;
RegCloseKey(hkey);
boretn = TRUE;
return boretn;
上面的病毒行为解决了,但是!没几秒钟就又被破坏了……很明显,病毒还在运行着,而且查看源码还有种种行为,运行着的是用NTFS流隐藏着的病毒。
强制关闭进程:要关闭路径为"C:\\WINDOWS\\system32\\wscript.exe"和“C:\\WINDOWS\\system\\svchost.exe”的进程,已知进程路径,所以一个一个查找进程对应的路径,然后比较是否和要关闭的路径一样,即可关闭对的进程,(写完后我在自己的机器上关闭得了进程,在虚拟机里却关闭不了了)所以过程中得注意权限问题,在OpenProcess()的时候,要设置对的权限。关闭了进程后,即可像删除普通文件一样DeleteFile()删除寄生在smss.exe和explorer.exe上的****.vbs病毒。
以上就是我写这个病毒专杀的过程,此过程主要是针对暴风一号变种,但解决完变种的各种问题,也就基本解决了暴风一号的所有问题。我这个程序还太简单,少了很多判断,例如:判断注册表是否被修改,如果被修改了再修改过来,所以发我写的源代码仅供学习。
折腾了好多天,反过来又看了下病毒源码,竟然一眼看得懂好多了,看来语言之间还是很多相似之处的。这时候再看,就会发现它其他病毒行为,例如:检查"cmd.exe","cmd.com","regedit.exe","regedit.scr","regedit.pif","regedit.com","msconfig.exe"这些程序有没有在运行,如果发现它们在运行的话,就将它关闭。
总结:以上有关知识点,我几乎都是第一次接触,所以期间碰到了太多太多问题,但做完后,回过头看时,真的很简单~碰到的问题倒都是小问题,关键很高兴的是,很多我都自己解决了,记得期间有个bug,我怎么调试都调试不出为什么错,折腾了非常长的时间,睡个觉都睡不好,最后还是求助于别人,可是别人看了一下代码就知道问题所在了……是个类型错误……这个问题很显然是c++里面最最基础的问题……所以我真的应该好好看书了……很感谢懒人大叔替我解决了这个问题……还有在解决问题时,用最简单的方法去达到目的,恩,很感谢bbx的这席话。记得一个和我同样是初学者的朋友,他很聪明,在我和他讨论问题的时候,即使他和我同样不了解这个知识点,但在网上查下就可以很快的明白是怎么一回事,而我理解的速度要比他慢得多,他说:“看来男生的思维和女生的就是不一样,你选择这方面注定你会很坎坷”。恩……听着不服气啊~可是我承认,确实有差别。但是我想,在学习的过程中,无论是什么样情况的人,所追求的学习目标却是不会差别太大的,坚定信念足以。
最后加上原病毒和自己写的源码,因为初学C++,编码能力还有待提高,有些地方很乱,不足之处望多指出。
