Nvidia GTX 560黑屏、闪屏,二了三天,解决了。

从公司同事处蹭得一块GTX 560,正好把跑了3年的GTS 250给换了。换完后发现机箱突然安静了,敢情这几年的轰轰声来自一块破显卡,一直错怪了那块绿盘。

装上后就发现经常黑屏、闪屏,表现就是一段时间不动键鼠,动一下后马上黑屏,运气不好还能给我来个死机。如果幸运没死机的话,错误就是Display Driver NVIDIA Windows Kernel Mode Driver, Version 320.57 stopped respondingand has successfully recovered,搞了好几天,愁煞老衲,解决过程也是上房揭瓦、钻地打洞,各种方法用尽。最后……用无招胜有招的方法搞定了。不过,有类似问题的人,倒是可以参考下过程,因为不见得是我最终碰到的问题导致。

首先果断怀疑驱动了,围绕那个错误关键字,咣咣一阵放狗,参考tomshardware上的文章,总的来说就是

  • ccleaner清空下注册表和垃圾文件,然后进入安全模式
  • 安全模式下,卸载驱动,删除所有的Nvidia相关的文件夹(windows目录和program files目录下找找)
  • 安装一个微软官方补丁,微软承认了自己有这个缺陷
  • 重新安装驱动。记得在NV的控制面板里,Physx、sound什么的都显性的设置为显卡。不要用系统默认
  • 再不行就禁止掉3D什么的。

一阵阵的重启,无果。然后看了一堆国外的论坛,发现退回到310.90版本的可以。又试了一圈,依然。反正你们试试吧,说不定到这里就问题解决了。

第一天,扑街。

—————–

痛定思痛,换个方向,重新狗,关键词换成idle这种,然后不知怎么地查到有个MSI的神器,叫做AfterBurner,有多神呢,可以设定电压、核心频率、显存频率、风扇速度,还可以像资源管理那样去检测各个数据,画曲线图。比如GPU温度、使用率、风扇速度、CPU使用率、电压什么的。哎哟我去,真牛逼。

Afterburner

监控着呗,然后就发现端倪了,卧槽GPU 99%啊,掐指一算,60秒妥妥的,时间一到就特么99% GPU。这是要多费电!

Afterburner_99

继续狗,关键字变成GPU 99%,好找多了,顺藤摸瓜,找到一个类似的问题在tomshardware上,歌词大意是去找一个东西,这个东西潜伏在你的电脑里被黑客用来挖比特币的。当你的键鼠闲置的时候,这个木马程序就调用100% GPU去挖矿。好吧我信了。还真有,来来来,曝光下,这个目录就是,用MalwareBytes(免费)可以扫出来:

C:\Users\Yao\AppData\Local\Temp\iswizard

iswizard

用这玩意杀了几下,发现杀不掉,60秒后还是熟悉的配方,熟悉的地址,还是熟悉的进程。找到了手动的方法:

Possibly corrupt registry keys:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings “CertificateRevocation” = 0
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System “DisableTaskMgr” = 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system “DisableTaskMgr” = 1
Delete files:
Open then following folders or search for iswizard in My Computer and delete if found files associated with this bug.
C:\Users\USER\AppData\Local\Temp\iswizard
%AllUsersProfile%\Application Data\
iswizard wuaudit.exe
iswizard.7z
is wizard.exe

不管有用没用试试吧。反正各种折腾,各种重启,我是又,

扑街了。

————–

Day 3,不能再忍!

自己写个服务吧,反正这个木马的原因这几天算是摸清楚了,虽然依旧不知道什么时候感染上的这个恶习:

  • 木马一直挂着,在等你的键鼠idle
  • 一旦键鼠idle到60秒,在上面提到的那个地方新建iswizard目录,拷入iswizard.7z
  • 解压缩,执行里面的一些服务或者应用程序。最可耻的应该是替换了dwm.exe进程
  • GPU 99%

那服务应该好想,C#即可,写一个service,挂在后台监控这个目录,一旦有文件新建,则触发事件直接被服务删掉这个iswizard目录,让你丫整不了。windows service不知道怎么debug,写完注册进服务居然一次成功了。但是删除却不行,打log调试了好几个小时,摸明白了:这个木马动作比系统文件系统的监视+反馈的机制快,我刚开始删,那里的dll就已经注册在案了,如果直接kill掉dwm的进程再删,倒是可以的,但是我总不能60s就看着屏幕自己闪一下帮我清理木马吧。一点儿都不友好。

冥想。

为什么不进安全模式再跑一遍MalwareBytes呢?然后,就没有然后了,药到病除。

我去你大爷。

—————-

问题是解决了,不过自己写服务去遏制木马这个事情,我觉得方向是对的,但是很多细节还要兼顾到。源码放出来好了,就放一页。

using System;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
using System.Threading;

namespace IswizardRemover
{
    public partial class IswizardRemoverService : ServiceBase
    {
        private string LogFile = @"C:\IswizardRemover.log";
        private string IswizardDirectory = string.Empty;

        public enum LogType
        {
            Null = 0,
            Info = 1,
            Warning = 2,
            Error = 3,
            Bingo = 4,
            Debug = 5
        }

        public IswizardRemoverService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            # region Deal with the log

            FileInfo log = null;

            if (File.Exists(LogFile))
            {
                log = new FileInfo(LogFile);
                if (log.Length > 1024 * 1024)
                {
                    log.Delete();
                }
            }
            else
            {
                AppendLog(
                    LogType.Info,
                    string.Format(
                        "Log file created at {0} {1}",
                        DateTime.Now.ToShortDateString(),
                        DateTime.Now.ToShortTimeString()));

                log = new FileInfo(LogFile);
            }

            AppendLog(
                LogType.Info,
                string.Format(
                        "Service starting at {0} {1}",
                        DateTime.Now.ToShortDateString(),
                        DateTime.Now.ToShortTimeString()));

            #endregion

            #region Deal with iswizard

            IswizardDirectory = @"C:\Users\Yao\AppData\Local\Temp\iswizard";
            if (!new DirectoryInfo(IswizardDirectory).Exists)
            {
                Directory.CreateDirectory(IswizardDirectory);
            }

            RemoveIswizard();

            FileSystemWatcher watcher = new FileSystemWatcher();
            AppendLog(LogType.Debug, "Current IswizardDirectory" + IswizardDirectory);
            watcher.Path = IswizardDirectory;
            watcher.Filter = "*.7z";
            watcher.NotifyFilter = NotifyFilters.FileName;
            watcher.Created += new FileSystemEventHandler(IswizardTriggered);
            watcher.EnableRaisingEvents = true;

            #endregion
        }

        protected override void OnStop()
        {
            AppendLog(
                LogType.Info,
                string.Format(
                        "Service stopped at {0} {1}",
                        DateTime.Now.ToShortDateString(),
                        DateTime.Now.ToShortTimeString()));
        }

        private void AppendLog(LogType logType, string singleLog)
        {
            using (StreamWriter sw = File.AppendText(this.LogFile))
            {
                sw.WriteLine(string.Format(
                    "[{0}] {1}", logType.ToString(), singleLog));
            }
        }

        private void IswizardTriggered(object sender, FileSystemEventArgs e)
        {
            AppendLog(LogType.Info, "Iswizard detected, cleaning.");
            RemoveIswizard();
        }

        private void RemoveIswizard()
        {
            try
            {
                Thread.Sleep(500);
                DirectoryInfo iswizard = new DirectoryInfo(IswizardDirectory);
                foreach (FileInfo file in iswizard.GetFiles())
                {
                    Process [] proc = Process.GetProcessesByName("dwm");
	                proc[0].Kill();
                    file.Delete();
                }

                AppendLog(
                    LogType.Bingo,
                    string.Format(
                        "{0} {1} - Removed iswizard",
                        DateTime.Now.ToShortDateString(),
                        DateTime.Now.ToShortTimeString()));
            }
            catch (IOException ex)
            {
                AppendLog(LogType.Error, ex.Message);
            }
        }
    }
}

写一个 注册服务的bat,和编译出来的服务exe、dll放一起,使用系统管理员运行:

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe %~dp0\IswizardRemover.exe 
sc config IswizardRemover start= auto
net start IswizardRemover

卸载服务的bat:

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u %~dp0\IswizardRemover.exe

最后,为啥老的显卡没这问题呢?档次太低?

Leave a Reply

Your email address will not be published. Required fields are marked *


2 + = seven

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>