GottaFix для WannaCrypt?


109

Предупреждение

Ответы на этот тестовый вызов для конкретной версии патча, которая помогает остановить атаки WannaCrypt / WannaCry. В зависимости от вашей операционной системы у вас может быть другой патч. Лучший способ защитить себя - убедиться, что ваш компьютер полностью обновлен, и соблюдать осторожность при открытии вложений и веб-ссылок.


Введение

Мне нравится думать, что программисты по своей природе хорошие люди, даже если некоторые из них не так хороши , поэтому давайте поможем людям убедиться, что они защищены патчем MS17-010 .

Вызов

Ваша задача - написать полную программу или функцию, которая возвращает истинное или ошибочное значение в зависимости от того, установлено ли исправление MS17-010 в текущей операционной системе.

Вход и выход

Вход: ввод не требуется

Вывод: истинное или ложное значение (укажите, какое значение используется для каждого случая). Ошибка / исключение можно считать ошибочным значением.

правила

  • Ваш код должен запускаться (и выводиться правильно) как минимум в одной операционной системе Windows, для которой доступно исправление, но не обязательно в каждой операционной системе (укажите какие-либо ограничения).
  • Применяются стандартные лазейки
  • Это , поэтому выигрывает представление с наименьшим количеством байтов!

3
Хм, один вопрос ... Что касается значений правда / ложь, допустима ли ошибка как значение ложности, и правда ли как фактическое возвращение, или это не разрешено?
— Кевин Круйссен,

3
@KevinCruijssen Я рад рассматривать ошибку как ложное значение. Я думаю, что это явный показатель того, что патч не установлен.
— Notts90

12
Если пользователи пропустили этот патч, но установили более поздний, они все равно будут защищены, поэтому для некоторых пользователей это может привести к ложному негативу.
— Ян Миллер

2
@MichealJohnson не уверен, что разумно побуждать людей размещать код, демонстрирующий, как использовать уязвимость.
— Notts90

7
Является ли заражение компьютера-хоста допустимой ошибкой? Было бы очевидно, что смысл
— Ник Робертсон

Ответы:


158

PowerShell 2.0, 24 20 16 байт

hotfix KB4012212

-4 байта благодаря @whither , удаляя -id.
-4 байта благодаря @ DankoDurbić , изменив get-hotfixна hotfix.

KB4012212Это патч для Windows 7. Его можно заменить любым KB-кодом со связанной страницы патча .

Возвращает информацию об источнике , описании , HotFixID , InstalledBy и InstalledOn, когда она установлена ​​как истинное значение, и выдаст ошибку, если не сможет найти ее как значение false.

Вот пример как правдивого, так и ложного вывода ( KB4012212он установлен на моей машине, но KB4012215не установлен):

введите описание изображения здесь


82
ответ на PPCG, который на самом деле полезен для практических целей? Я впечатлен.
— Джон Дворжак

1
Вам не нужно указывать идентификатор Get-HotFix KB4012212будет работать тоже. (Проверено только с PSv4). Но я согласен с Яном Двораком, я не думаю, что результат подтверждает вызов.
— что бы ни было

6
Не работает, если вы уже находитесь в следующем или более позднем месячном выпуске, потому что они заменяют друг друга.
— Сумырда,

6
@ Notts90 Да, этот комментарий предназначен для людей, которые пробуют код и получают ложный отрицательный результат.
— Сумырда,

10
Просто hotfix KB4012212достаточно. В Powershell вам не нужно писать get-.
— Данко Дурбич

43

Пакетная / Windows CMD, 31 29 28 23 байта

wmic qfe|find "4012212"

-1 байт благодаря @SteveFest , изменив findstr 4012212на find "4012212".
-5 байт благодаря @BassdropCumberwubwubwub путем удаления list.

Объяснение:

wmic          Windows Management Instrumentation Command-line
qfe           Quick Fix Engineering
|find "..."   Looks for the string in the complete output

Выводит некоторую информацию о патче, если он установлен, или ничего другого.
На скриншоте ниже патч 4012212установлен, а 4012215его нет.

введите описание изображения здесь


5
это станет проблематичным, как только обновится 40M обновлений
— Джон Дворак

1
используйте findвместо findstr, это экономит 3 байта
— stevefestl

2
Не работает, если вы уже находитесь в следующем или более позднем месячном выпуске, потому что они заменяют друг друга.
— Сумырда,

2
@Sumyrda Задача состоит в том, чтобы проверить наличие этого конкретного патча, он не должен проверять наличие патчей для замены.
— Notts90

1
find "4012212"также работает на -1 байт, wmic qfe|find "4012212"кажется, тоже работает, но, может быть, я что-то там упускаю?
— Bassdrop Cumberwubwubwub

20

Bash + Cygwin (или WSL), 21 байт

Этот ответ в основном украден из ответа Кевина . Так что бросайте голосование таким же образом, если вы считаете, что оно того заслуживает.

wmic qfe|grep 4012212

Cygwin имеет доступ к командам Windows в дополнение к coreutils. Мы можем использовать coreutils grepвместо Windows, findпоэтому нам не нужно использовать кавычки. Благодаря этому 2 байта сохраняются.


1
Ну да, это короче, чем у меня; Я не выбрал хорошего пользователя MS, чтобы украсть у него!
— Аарон,

2
Кто-то отредактировал это так, чтобы включить «Или WSL», что, я думаю, правда, но сначала вам нужно изменить путь.
— Капитан Мэн

17

Powershell 5.1, 245 212 207 байт

$S=New-Object -ComObject Microsoft.Update.Session;$T=$S.CreateUpdateSearcher();$H=$‌​T.GetTotalHistoryCo‌​unt();$p=0;$T.Query‌​History(0,$H)|ForEa‌​ch-Object -Process{if($_.Title -like"*KB4013429*"){$p=1;}};echo $p;

-33 байта благодаря @KevinCruijssen, удаляющим пробелы и заменяющим true и false на 1 и 0.

-5 байт благодаря сокращению имен переменных @KevinCruijssen

Очевидно, что он не выиграет никаких призов, но этот скрипт powershell проверит журнал истории Центра обновления Майкрософт для KB4013429 (один из патчей, указанных в ссылке ), его можно заменить любым из патчей. Думал, что выложу, потому что будет немного надежнее, если патч будет заменен более поздним.


13
Привет, добро пожаловать в PPCG! :) Поскольку этот вопрос помечен как code-golf, идея состоит в том, чтобы выполнить задачу как можно меньше байт. Я знаю, что ваш ответ, вероятно, в любом случае не победит, и вы использовали более полный метод, чем я, но вы все еще можете изменить свой текущий ответ, удалив ненужные пробелы, и использовать 1/ 0вместо true/ false. $S=New-Object -ComObject Microsoft.Update.Session;$Se=$S.CreateUpdateSearcher();$Hc=$Se.GetTotalHistoryCount();$p=0;$Se.QueryHistory(0,$Hc)|ForEach-Object -Process{if($_.Title -like"*KB4013429*"){$p=1;}};echo $p;
— Вот так

2
О, и еще одна вещь, которую вы можете играть в гольф, которую я только сейчас замечаю: лучше всегда использовать односимвольные имена переменных / методов / классов. Таким образом , вы можете изменить , Hcчтобы Hи Seк T(или другой одной букве к тому Hили Sкоторый вы уже использовали) , чтобы сохранить еще 5 байт. :)
— Кевин Круйссен

2
Вы не можете передать $H прямо вместо хранения в? Также %{ }и ?{ }вместо ForEach-Objectи if. Уверен, что вы можете просто выводить данные в конвейер, а не в эхо, так как у вас должен быть только один результат, и я думаю, что это будет считаться правдивым на основании OP
— pinkfloydx33

16

C #, 178 143 141 134 байта

_=>new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='KB3150513'").Get().Count>0;

Компилируется туда, Func<int, bool>где ввод не используется.

Сохранено 35 байт с помощью @Ryan.
Сохранено 2 байта благодаря @KevinCruijssen.
Сохранено 7 байтов благодаря @ErikKarlsson.

Отформатированная версия:

System.Func<int, bool> f = _ =>
    new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'")
                         .Get().Count > 0;

не так if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;же, как return h["HotFixID"]=="KB4012212"?
— Джулиан Вольф

@JulianWolf Нет, потому что последний будет проверять только первый элемент, который возвращается, тогда как первый проверяет каждую итерацию.
— TheLethalCoder

1
Не могли бы вы добавить предложение where в запросе ManagementObjectSearcher и добавить символ « countв конце» .get()? Как это: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Чтобы сохранить 4 байта
— Райан

5
+1 За отсутствие языка сценариев оболочки.
— Хюлле

2
Эрик Карлссон (которому не хватает представителей для комментариев) предложил в редактировании сохранить 7 байтов, заменив SELECT HotFixIDна SELECT *.
— Мартин Эндер

14

Cygwin, 31 байт

Просто чтобы играть в бунтаря

grep KB4012212 "$WINDIR"/*e.log

Код возврата будет 0, если патч был применен, или 1, если он не был.

Протестировано под Windows 7 с Cygwin 2.6.0


Будет ли это работать, если вы удалите KB?
— TheLethalCoder

@TheLethalCoder Я не уверен, и я не думаю, что смогу узнать. Мой ответ получен от Райана, и мы оба ищем текст в огромном журнале WindowsUpdate.log, который содержит намного больше, чем имена в КБ, я бы не поспорил, что число не может появиться в другом контексте
— Аарон

Достаточно справедливо, я не знал достаточно о том, что твоя работа, поэтому вопрос не предложение :)
— TheLethalCoder

3
Это должно сработать, если вы удалите, KBпоскольку маловероятно, что 4012212это будет там ни с чем, кроме пути. Вы также можете сохранить 1 байт, если вы удалите только K, потому что вы не найдете B4012212случайным образом без пути.
— Сирены

4
@ Сирены Я не уверен в тестировании только числа, я бы боялся сопоставлять 1) количество переданных байтов, 2) обновления, отчеты о событиях и UID заданий или 3) шестнадцатеричные коды ошибок (и другие). Удаление только Kпервого кажется разумным, но затем B...становится действительным шестнадцатеричным представлением, что делает возможным столкновение с UID и шестнадцатеричными кодами
— Аарон

12

PowerShell v4, 64 байта

HotFix|? HotFixID -m "401(221[2-7])|(2598)|(2606)|(3198)|(3429)"

Проверяет все ссылки на КБ с помощью RegEx (теперь у вас есть две проблемы)


3
Добро пожаловать на сайт! Хороший первый ответ!
— programmer5000

7

Пакетная / командная строка, 27 25 байт

systeminfo|find "4012212"

Если найдено KB4012212, выведите это, иначе ничего не выводится.

Спасибо @Kevin за сохранение 2 байта :)


1
Я думаю, что вы можете удалить пространство вокруг трубы: systeminfo|find "4012212"для -2 байтов.
— Кевин Круйссен

5

Powershell 2.0, 142 байта

  • Возвращает 0 для "false", не исправлено "<0 для" true ", исправлено.

Ниже приведены все КБ за март, но их необходимо увеличить с апреля по май, так как каждый из них заменяет все предыдущие.

(Get-HotFix | where HotFixID -match "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count

Я не уверен, но я думаю, что вы можете изменить (Get-HotFix | whereна (HotFix|where(пробелы удалены и Get-удалены.
— Кевин Круйссен

3

Powershell 5.1 134 Bytes

То же, что и у Марка Пиппина, но поменял Get-Hotfix на Hotfix и куда? экономия 8 байт

(HotFix | ? HotFixID -match 
 "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count

Я не могу получить это меньше в подсчете байтов, чем ответ Кевина


1
Вы можете удалить пробелы вокруг трубы: (HotFix|? HotFixID ...для -2 байтов.
— Кевин Круйссен

2

DISM , 40 байт

dism/online /get-packages|find "4012212"

Объяснение:

dism             Deployment Image Servicing and Management command-line
/online          Look at current running PC's Operating System
/get-packages    Display some basic information about all packages in the image
|find "..."      Looks for the string in the complete output

Выводит идентификатор пакета, если он установлен, или ничего другого.
На скриншоте ниже патч 4012212установлен, а 4012215его нет.

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.