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

Статус
В этой теме нельзя размещать новые ответы.

Drongo

Ассоциация VN/VIP
VIP
Сообщения
7,345
Реакции
4,793
Итак, пользователь жалуется на BSOD'ы, перезагрузку и выключение компьютера. Мы запросили логи и увидели следующую картину.

В логе AVZ в секции Модули пространства ядра и\или в секции Драйверы мы увидели файл и службу
Код:
%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 напрочь отсутствует
Раннее использовался такой скрипт
Код:
...
 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);
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. В котором как минимум должна быть информация о файле и его контрольная сумма, примерно так:
Код:
Файл %windir%\system32\sfcfiles.dll -> MD5 = 167EEE816F612766867AE18390A28661
Файл %windir%\system32\dllcache\sfcfiles.dll -> MD5 = 167EEE816F612766867AE18390A28661

За помощь в указании вариантов и создание скрипта, благодарим gjf и thyrex
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу