Главная > Powershell > Проверка оригинальности файла hosts с помощью Powershell

Проверка оригинальности файла hosts с помощью Powershell

Очень часто, когда приходится лечить компьютеры и ноутбуки, родственникам/друзьям/коллегам приходится проходить через они и те же шаги: удалять временные файлы, прибивать и удалять всякие улучшалки/обновлялки, чистить автозагрузку и т.д. Недавно появилась мысль упростить себе жизнь путём создания скрипта, который за меня будет лазить по системе и искать подозрительные записи. Пока не знаю, что из этого получится,  но сегодня хочу поделиться функцией, которая проверяет на наличие подозрительных записей одно из популярных мест, в которое любят прописывается как вирусы, так всевозможные crack’и, – файл hosts. (Несколько лет назад был приятно удивлён, когда после прогонки компьютера через DrWeb Cureit он сказал, что файл hosts изменён, кажется предложил восстановить оригинальную версию).

Итак, для начала до файла нужно добраться.

Как известно файл hosts находится в подкаталоге %SystemRoot%\system32\drivers\etc\. Находим файл, и на всякий случай убеждаемся, что он есть:

$HostsPath = Join-Path $Env:SystemRoot system32\drivers\etc\hosts

if (! (Test-Path $HostsPath))
{
    Write-Warning "Файл hosts не найден"
}

else
{
    ...
}

Все остальные действия будут происходить в блоке else {}.

При наличии подозрительных записей я решил автоматически не исправлять файл, а вывести их (подозрительные записи) на экран, чтобы самому можно было принять решение о том, нужно-ли их удалять.

Поэтому, считываем файл и подготавливаем массив, в который будут заноситься подозрительные строки, если таковые будут найдены:

# Считываем файл
$Hosts = Get-Content $HostsPath

# Массив, в котором будут собраны добавленные строки
$ModifiedStrings = @()

По умолчанию файл hosts выглядит приблизительно так:

# (C) Корпорация Майкрософт (Microsoft Corp.)

#

# Это образец файла HOSTS, используемый Microsoft TCP/IP для Windows.

#

# Этот файл содержит сопоставления IP-адресов именам узлов.

# Каждый элемент должен располагаться в отдельной строке. IP-адрес должен

# находиться в первом столбце, за ним должно следовать соответствующее имя.

# IP-адрес и имя узла должны разделяться хотя бы одним пробелом.

#

# Кроме того, в некоторых строках могут быть вставлены комментарии

# (такие, как эта строка), они должны следовать за именем узла и отделяться

# от него символом ‘#’.

127.0.0.1       localhost

Т.е. содержит строку 127.0.0.1       localhost и несколько строк-комментариев, начинающихся с символа ‘#’. (В зависимости от версии Windows последняя строка также может быть закомментирована.)

Следовательно, все другие строки (не считая пустых) уже вызывают подозрения.

Поэтому пробегаемся по содержимому файла, и смотрим – если строка начинается не с символа ‘#’, или не с ‘127.0.0.1’ – выводим её в заранее подготовленный массив:

foreach ($String in $Hosts)
{
    # Если строка начинается не с # или 127.0.0.1 - заносим её в массив
    if (-not ($String.StartsWith('#') -or $String.StartsWith('127.0.0.1')))
    {
        $ModifiedStrings += $String
    }
}

После чего смотрим попались-ли подозрительные строки, и если да – выводим их, для оценки их подозрительности.

Там же у меня идёт запрос на открытие файла, который я здесь приводить не буду, так как это сравнительно громоздкая конструкция, которую я уже рассматривал. Скажу только, что если пользователь согласится открыть файл, он открывается в блокноте:

if ($ModifiedStrings)
{
    Write-Warning "Файл hosts был изменён. Изменённые строки:"
    $ModifiedStrings
    
    # Меню с запросом открытия файла
    ...
    # Если да - открываем в блокноте
    Start-Process notepad -ArgumentList $HostsPath -Wait
}

Параметр –Wait добавлен для того, чтобы скрипт не выполнялся дальше до тех пор, пока мы не закончим редактирование файла и не закроем блокнот.

Естественно, что для того, чтобы править файл hosts нужны права администратора, а так как блокнот с файлом мы открываем из Powershell, то и сам Powershell должен быть запущен от имени администратора. Это планируется реализовать отдельно (т.е. если скрипт будет запущен от имени пользователя данная функция просто не будет запускаться).

На сегодня всё! Если есть желающие присоединиться к моей безумной затее по поводу чудо-скрипта диагностики ПК – добро пожаловать 🙂

Реклама
Рубрики:Powershell Метки:
  1. Комментариев нет.
  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: