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.