Скрипт для корректного удаления SFC.SYS - службы - SFC и замена sfcfiles.dll

Тема в разделе "Рекомендации и инструкции", создана пользователем Drongo, 16 май 2011.

Статус темы:
Закрыта.
  1. Drongo
    Оффлайн

    Drongo Ассоциация VN/VIP Разработчик

    Сообщения:
    7.902
    Симпатии:
    8.221
    Итак, пользователь жалуется на BSOD'ы, перезагрузку и выключение компьютера. Мы запросили логи и увидели следующую картину.

    В логе AVZ в секции Модули пространства ядра и\или в секции Драйверы мы увидели файл и службу
    Код (Text):
    %WinDir%\System32\Drivers\sfc.SYS
    Этот файл также хорошо видно в логах RSIT в секции List of services.

    При наличии вредоносного драйвера SFC.SYS в системе, возможны следующие виды заражений.
    1. Имееются в наличии sfcfiles.dll и mssfc.dll - и оба заражены
    2. Имееется в наличии sfcfiles.dll и mssfc.dll - и заражен только последний
    3. Имееется в наличии только зараженный mssfc.dll, а sfcfiles.dll напрочь отсутствует
    Раннее использовался такой скрипт
    Код (Text):
    ...
     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 из дистрибутива пользователя. Нижеприведённый сприпт решает эту проблему в автоматическом режиме. Пользователю также оставляется возможность выбора самостоятельно заменить указаные файлы.
    Код (Text):
    Procedure SysFileRecoverFromDistrib (Path, Name : string);
    begin
     if MessageDLG('Для замены повреждённого системного файла ' + Name + ', который находится в папке ' + Path + ', вставьте дистрибутив Windows в CD\DVD-привод и нажмите "Да". Если же у вас нет дистрибутива или Вы хотите выполнить замену самостоятельно, нажмите "Нет"', mtConfirmation, mbYes+mbNo, 0) = 6 then
      begin  
        ExecuteFile('sfc /scannow', '', 1, 0, true);
        AddToLog('Пользователь выполнил "sfc /scannow"');
      end
     else
        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;
    begin
    SearchRootkit(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. В котором как минимум должна быть информация о файле и его контрольная сумма, примерно так:
    Код (Text):
    Файл %windir%\system32\sfcfiles.dll -> MD5 = 167EEE816F612766867AE18390A28661
    Файл %windir%\system32\dllcache\sfcfiles.dll -> MD5 = 167EEE816F612766867AE18390A28661
    За помощь в указании вариантов и создание скрипта, благодарим gjf и thyrex
     
    Последнее редактирование: 16 май 2011
    Dragokas, M.B, shestale и 22 другим нравится это.
Статус темы:
Закрыта.

Поделиться этой страницей