akoK Опубликовано 23 марта, 2011 Жалоба Поделиться Опубликовано 23 марта, 2011 (изменено) Итак, пользователь жалуется на BSOD'ы, перезагрузку и выключение компьютера. Мы запросили логи и увидели следующую картину. В логе AVZ в секции Модули пространства ядра и\или в секции Драйверы мы увидели файл и службу %WinDir%\System32\Drivers\sfc.SYS Этот файл также хорошо видно в логах RSIT в секции List of services. При наличии вредоносного драйвера SFC.SYS в системе, возможны следующие виды заражений. Имееются в наличии sfcfiles.dll и mssfc.dll - и оба заражены Имееется в наличии sfcfiles.dll и mssfc.dll - и заражен только последний Имееется в наличии только зараженный mssfc.dll, а sfcfiles.dll напрочь отсутствует Раннее использовался такой скрипт ...QuarantineFile('%WinDir%\system32\drivers\sfc.sys','');DeleteFile('%WinDir%\system32\drivers\sfc.sys');QuarantineFile('%windir%\system32\sfcfiles.dll','');RenameFile('%windir%\system32\sfcfiles.dll', '%windir%\system32\sfcfiles.bak');CopyFile('%windir%\system32\dllcache\sfcfiles.dll', '%windir%\system32\sfcfiles.dll');DeleteFile('%windir%\system32\sfcfiles.bak');... Подводные камни ожидавшие консультанта были такими что при удалении файла sfcflies.dll в dllcache могло не оказаться копии файла, а посему восстанавливать было не откуда. В результате лечения в некоторых случаях, приходится восстанавливать файл sfcfiles.dll специальной командой Expand из дистрибутива пользователя. Нижеприведённый сприпт решает эту проблему в автоматическом режиме. Пользователю также оставляется возможность выбора самостоятельно заменить указаные файлы. Procedure SysFileRecoverFromDistrib (Path, Name : string);beginif MessageDLG('Для замены повреждённого системного файла ' + Name + ', который находится в папке ' + Path + ', вставьте дистрибутив Windows в CD\DVD-привод и нажмите "Да". Если же у вас нет дистрибутива или Вы хотите выполнить замену самостоятельно, нажмите "Нет"', mtConfirmation, mbYes+mbNo, 0) = 6 then begin ExecuteFile('sfc /scannow', '', 1, 0, true); AddToLog('Пользователь выполнил "sfc /scannow"'); endelse AddToLog('Пользователь выбрал самостоятельный способ замены.');end;Procedure CompleteFix(Path, Name : string);begin RenameFile('%windir%\system32\' + Name, '%windir%\system32\' + Name + '.bak'); CopyFile(Path + Name, '%windir%\system32\' + Name); DeleteFile('%windir%\system32\' + Name + '.bak');end;Procedure SysFileRecoverFromBackup(Path, Name : string);begin AddToLog('Файл ' + '%windir%\system32\' + Name + ' -> MD5 = ' + CalkFileMD5('%windir%\system32\' + Name)); if (FileExists('%windir%\system32\dllcache\' + Name) and FileExists('%windir%\ServicePackFiles\i386\dllcache\' + Name)) and ((CalkFileMD5('%windir%\system32\dllcache\' + Name) <> CalkFileMD5('%windir%\ServicePackFiles\i386\dllcache\' + Name))) then begin AddToLog('Замена из ServicePackFiles\i386\dllcache и dllcache не произведена - MD5 у файлов различные. Запрошен дистрибутив.'); AddToLog('Файл ' + '%windir%\system32\dllcache\' + Name + ' -> MD5 = ' + CalkFileMD5('%windir%\system32\dllcache\' + Name)); AddToLog('Файл ' + '%windir%\ServicePackFiles\i386\dllcache\' + Name + ' -> MD5 = ' + CalkFileMD5('%windir%\ServicePackFiles\i386\dllcache\' + Name)); SysFileRecoverFromDistrib(Path, Name); end else if FileExists('%windir%\system32\dllcache\' + Name) then begin AddToLog('Файл ' + '%windir%\system32\dllcache\' + Name + ' -> MD5 = ' + CalkFileMD5('%windir%\system32\dllcache\' + Name)); if (CalkFileMD5('%windir%\system32\dllcache\' + Name) <> CalkFileMD5(Path + Name)) then begin CompleteFix('%windir%\system32\dllcache\', Name); AddToLog('Замена ' + Name + ' успешно произведена из \system32\dllcache\'); end else if FileExists('%windir%\ServicePackFiles\i386\dllcache\' + Name) then begin AddToLog('Файл ' + '%windir%\ServicePackFiles\i386\dllcache\' + Name + ' -> MD5 = ' + CalkFileMD5('%windir%\ServicePackFiles\i386\dllcache\' + Name)); if (CalkFileMD5('%windir%\ServicePackFiles\i386\dllcache\' + Name) <> CalkFileMD5(Path + Name)) then begin CompleteFix('%windir%\ServicePackFiles\i386\dllcache\', Name); AddToLog('Замена ' + Name + ' успешно произведена из \ServicePackFiles\i386\'); end end end;if (not FileExists('%windir%\system32\dllcache\' + Name)) and (not FileExists('%windir%\ServicePackFiles\i386\dllcache\' + Name)) then begin AddToLog('Замена из ServicePackFiles\i386\dllcache и dllcache не произведена - нет файлов. Запрошен дистрибутив.'); SysFileRecoverFromDistrib(Path, Name); end;SaveLog('SafeZone.log');end;var SourcePath : String;beginSearchRootkit(true, true);SetAVZGuardStatus(True);ClearLog;QuarantineFile('%windir%\system32\drivers\sfc.sys','');DeleteFile('%windir%\system32\drivers\sfc.sys');SysFileRecoverFromBackup('%windir%\system32\', 'sfcfiles.dll'); // Указываем имя файла.BC_ImportAll;ExecuteSysClean;BC_DeleteSvc('sfc');BC_Activate;RebootWindows(true);end. Не забываем просить пользователя вставить в привод свою копию дистрибутива Windows и после выполнения скрипта прикрепить файл SafeZone.log. В котором как минимум должна быть информация о файле и его контрольная сумма, примерно так: Файл %windir%\system32\sfcfiles.dll -> MD5 = 167EEE816F612766867AE18390A28661Файл %windir%\system32\dllcache\sfcfiles.dll -> MD5 = 167EEE816F612766867AE18390A28661 За помощь в указании вариантов и создание скрипта, благодарим gjf и thyrex Изменено 18 июня, 2011 пользователем akoK Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения