起因(吹会牛X):

平时只用来写代码的笔记本,最近打开MyEclipse居然卡的一匹???WTF,好歹也是I7/16G的啊,仔细一看,连硬盘的储存空间都快满了,机智的我果然想到中毒了(????一直以来只有我搞别人的啊,我还被搞了????),然后看了占硬盘空间多的文件夹,发现是我的几个web根目录,再仔细一看,最大的html文件有7.62m?????打开后发现了一段段有趣的代码,上图:

发现几乎所有在硬盘里的html文件都不能避免,然后无奈的下载了一个360杀毒,扫了一下下,2000多的感染exe和dll,再搞了一下,发现360只能修复exe和dll,而对这些html文件只隔离。搜索引擎了一会,居然没找到修复工具,我无奈(无聊)啊,好歹也是个代码狗,超过90秒的工作都交给机器吧,只好自己写个小工具出来把html文件修复,释放硬盘空间了。

修复思路:

发现vbs病毒代码的特征: 

1.特征码:

<SCRIPT Language=VBScript><!--DropFileName = "svchost.exe"WriteData = "

2.大小超过200kb的html文件

于是简要就截取了" <SCRIPT Language=VBScript> ",再每个目录不断遍历超过200k的html文件,并对其读取文件内容,寻找特征码,找到特征码之前的所有正常文本内容,删除源文件,创建同名文件,并把正常文本内容写入同名文件中,把修复好的html文件记录下来,搞定。

发现硬盘太大,想出两种方案

1.全盘遍历,扫描电脑所有磁盘分区,然后每个分区创造一条新线程去修复本分区

2.种指定路径。直接拖拉!

说了那么多没什么用的,上代码,上链接!

编译环境:Visual Studio 2013

(参考了网上一些前辈的代码)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <io.h>
#include <fstream>
#include <atlstr.h>
#include <windows.h>
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;int commonFileSize[2] = { 204800, 1024000 };
int maxSize = 1024 * 1024 * 20;
bool delFlag = false;typedef struct pathData {char pathName[];
}PATHDATA;int dealVirusHtml(string filename)
{fstream in(filename, ios::in);int fileSize = 0;long index = 0;char* buffer = NULL;if (!in) {cout << "Open the  " << filename << "  failure...\n";}in.seekg(0, ios::end);fileSize = in.tellg();if (fileSize < commonFileSize[0]) return 9;if (fileSize < maxSize) {buffer = (char*)malloc(sizeof(char)*fileSize + 10);//new char[fileSize+10];}else {fileSize = maxSize;buffer = (char*)malloc(sizeof(char)*maxSize + 10);//new char[maxSize+10];}in.seekg(0);in.read(buffer, fileSize);in.close();string content(buffer);index = content.find("<SCRIPT Language=VBScript><!--");string rs;if (delFlag &&index>0) {rs = filename + " Successful repaired and deleted !! ";remove(filename.data());}else {rs = filename + " Successful repaired!! ";filename = filename.substr(0, filename.find(".html")) + "_repaired" + ".html";}if (index > 0) {fstream out(filename, ios::out);content = content.substr(0, index);out.write(content.data(), content.length());out.close();}char szFilePath[MAX_PATH];if (GetModuleFileName(NULL, szFilePath, MAX_PATH)>0){(*strrchr(szFilePath, '\\')) = '\0';//丢掉文件名,得到路径   }string logPath(szFilePath);logPath += "\\log.txt";fstream log(logPath, ios::app | ios::out);log << rs << endl;log.close();free(buffer);if (buffer != NULL) buffer = NULL;return 6;
}//深度优先递归遍历当前目录下文件夹和文件及子文件夹和文件
void DfsFolder(string path)
{_finddata_t file_info;string current_path = path + "/*.*"; //也可以用/*来匹配所有  int handle = _findfirst(current_path.c_str(), &file_info);//返回值为-1则查找失败  if (-1 == handle){cout << "cannot match the path" << endl;return;}do{//判断是否子目录  if (file_info.attrib == _A_SUBDIR){if (strcmp(file_info.name, "..") != 0 && strcmp(file_info.name, ".") != 0)DfsFolder(path + '/' + file_info.name);}else{string filename = file_info.name;if (filename.find(".html") != string::npos){cout << "path:" << path << "/" << file_info.name << "   repairing....." << endl;string html(path + "/");html += file_info.name;int result = dealVirusHtml(html);if (result == 6) {cout << html << " Successful repaired!! " << endl;}else if (result == 9) {cout << html << " Not infected!! " << endl;}}}} while (!_findnext(handle, &file_info));  //返回0则遍历完  //关闭文件句柄  _findclose(handle);
}DWORD WINAPI WorkThread(LPVOID pM)
{PATHDATA *data = (PATHDATA*)pM;DfsFolder(data->pathName);return 0;
}int main(int argc, char *argv[])
{cout << "-------------------------------------------------------------------------" << endl;cout << "-------------------------------------------------------------------------" << endl;cout << "-------------------------------------------------------------------------" << endl;cout << "-------------------你要删除原来的病毒文件吗?-----------------------------" << endl;cout << "-------------------------------------------------------------------------" << endl;cout << "1.YES                                         2.NO" << endl;cout << "-------------------------------------------------------------------------" << endl;cout << "----------------------q.quit---------------------------------------------" << endl;int del = 2;cin >> del;if (del == 1) { delFlag = true; }int singal = 2;cout << "------------------------指定路径(不指定会全盘恢复)-------------------" << endl;cout << "1.YES                                         2.NO" << endl;cin >> singal;if (singal == 2) {char rootPath[10] = { 0 };//获取所有磁盘UINT nType;for (char a = 'A'; a <= 'Z'; a++){sprintf(rootPath, "%c:\\", a);nType = GetDriveType(rootPath);if (nType != DRIVE_NO_ROOT_DIR)                  // DRIVE_NO_ROOT_DIR: 路径无效  {//递归遍历文件夹  //DfsFolder(rootPath);PATHDATA * data1 = (PATHDATA *)malloc(sizeof(PATHDATA));strcpy(data1->pathName, rootPath);CreateThread(NULL, 0, WorkThread, data1, 0, NULL);   //每个磁盘分区一个线程}}while (getchar() == 'q' || getchar() == 'Q') { break; };}else {cout << "------------请输入要恢复的指定路径(可以直接拖拉文件夹)?----------" << endl;char disk[512] = { 0 };cin >> disk;DfsFolder(disk);}getchar();return 0;
}

嗯,效果还不错!!

至于exe病毒推荐两个方案:

1.360(感觉效果一般)

2.重装系统(反正我这么做了)

下载链接:自用修复工具

修复VBS病毒感染的html文件相关推荐

  1. 恢复被维金病毒感染的exe文件--我和病毒作斗争的3天

    我今天非常气愤,上一次机器中毒不知道是多久的事情了.这次这个该死的Logo1_.exe修改了我机器上所有分区的exe文件,我的大多数软件都没有装在C盘,而只有C盘做了ghost的镜像,所以心爱的软件们 ...

  2. 检查压缩包是否损坏_修复损坏的gzip压缩文件之原理篇

    接修复损坏的gzip压缩文件之原理篇,再次引用GZIP结构图: 已知修复一个损坏的gzip文件的关键环节在于找到下一个正常压缩包的起始点.根据结构图中的信息可知,每个压缩包的开始结构中有是否到达尾部标 ...

  3. vbs脚本读写INI文件

    vbs脚本读写INI文件 转载于:https://www.cnblogs.com/bull_think/archive/2012/08/21/2649838.html

  4. aac文件损坏修复软件_SysTools Outlook Recovery Tool : 修复损坏的Outlook PST文件的先进的软件...

    SysTools Outlook Recovery Tool 修复损坏的Outlook PST文件的先进的软件&恢复丢失的Outlook电子邮件.联系人.日历.笔记.任务.日记.附件--邮箱数 ...

  5. 如何修复无法打开的Excel文件,三大原因三大方法为你解决

    Excel文件可以存储大量的原始数据,Excel的内置功能可以对数据进行大量的分析,是一个非常实用的应用.但有时候Excel文件也会出现一些错误,比如Excel文件无法打开,要如何修复无法打开的Exc ...

  6. php如何运行vbs文件,HTML_用vbs实现在启动 Windows 资源管理器时打开特定文件夹,my-script.vbs c:\scripts 在文件夹 - phpStudy...

    用vbs实现在启动 Windows 资源管理器时打开特定文件夹 my-script.vbs "c:\scripts" 在文件夹路径的两端必须加双引号吗?本例中不需要.但是,如果路径 ...

  7. 修复损坏的gzip压缩文件方法之实用篇

    在上一篇中已知,修复一个损坏的gzip文件的关键环节在于找到下一个正常压缩包的起始点.根据结构图中的信息可知,每个压缩包的开始结构中有是否到达尾部标志.使用的哈夫曼树类型.以及3个哈夫曼树的树元素个数 ...

  8. msvcp120.dll一键修复工具,msvcp120.dll文件修复之后还会丢失吗?

    无论是电脑小白还是电脑大神在使用电脑的时候都是会出现各种问题的,区别在于电脑大神会自己解决各种问题,而电脑小白遇到了问题就会无从下手,基础的小问题可以忽略不计,时间长了对于电脑使用也没有什么影响,但是 ...

  9. 修复路径穿越、任意文件写入漏洞

    修复路径穿越.任意文件写入漏洞 背景 前段时间随手写的一个文件上传服务,在公司的渗透测试下漏洞百出,其中少不了路径穿越和任意文件写入漏洞.其实这两个漏洞的修复并不复杂,只要对入参进行两个条件的校验就可 ...

最新文章

  1. java 线程池学习小记
  2. Valgrind 快速入门
  3. 百度被曝将成立芯片公司!头部互联网玩家,为何纷纷入局造芯?
  4. 【原创】CSSOO的思想及CSS框架的应用(未整理完)
  5. msp430入门编程11
  6. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...
  7. 分布式资源调度—YARN框架
  8. Visual C#使用ADO.NET自定义类MyDBase连接SQL Server数据库
  9. pymysql操作mysql数据库
  10. 本想用Python爬遍知乎,没想到却被知乎反杀
  11. Hadoop的安装与配置——设置单节点群集
  12. Android AlarmManager实现不间断轮询服务
  13. 十年 IT 老兵告诉你如何快速构建可直接落地、基于开源的低成本架构! | 技术头条...
  14. stanford sentiment treebank 数据集
  15. 分时问候并显示不用图片案例
  16. Material UI 4.10 Skeleton 骨架
  17. tpac100控制器设置教程_ac100控制器设置方法
  18. layui 调整表格样式
  19. linux ccid驱动下载,ccid驱动支持
  20. html文件引用.vue 文件的方式

热门文章

  1. 拿到亚马逊offer的经历 (毫无保留)
  2. 小陈-Devexpress gridcontrol行内增删改操作
  3. 美国计算机硕士有预科吗,美国留学生过来人小陈谈美国硕士预科
  4. 小陈学JS js内置对象 Date对象
  5. 2019最好用的谷歌扩展工具
  6. python socket + tkinter实现网络聊天室
  7. Scala之“逆变”合理性的思考
  8. 第九课511遇见易语言大漠透明图制作与使用]
  9. 如何通俗地理解傅立叶变换?
  10. Angular4模板式表单、响应式表单、表单状态字段