从公司同事处蹭得一块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使用率、电压什么的。哎哟我去,真牛逼。
监控着呗,然后就发现端倪了,卧槽GPU 99%啊,掐指一算,60秒妥妥的,时间一到就特么99% GPU。这是要多费电!
继续狗,关键字变成GPU 99%,好找多了,顺藤摸瓜,找到一个类似的问题在tomshardware上,歌词大意是去找一个东西,这个东西潜伏在你的电脑里被黑客用来挖比特币的。当你的键鼠闲置的时候,这个木马程序就调用100% GPU去挖矿。好吧我信了。还真有,来来来,曝光下,这个目录就是,用MalwareBytes(免费)可以扫出来:
C:\Users\Yao\AppData\Local\Temp\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
最后,为啥老的显卡没这问题呢?档次太低?