GottaFix для WannaCrypt?


109

Увага

Відповіді на цей тестовий виклик для конкретної версії виправлення, яка допомагає зупинити атаки WannaCrypt / WannaCry. Залежно від вашої операційної системи, у вас може бути інший виправлення. Найкращий спосіб захистити себе - це переконатися, що ваш ПК повністю оновлений та будьте обережні, відкриваючи додатки та веб-посилання.


Вступ

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

Виклик

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

Вхід і вихід

Введення: введення не потрібно

Вихідні дані: значення "truthy" або "falsey" (вкажіть, яке використовується для кожного випадку). Помилка / виняток може вважатися значенням фальси.

Правила

  • Ваш код повинен працювати (і виводити правильно) щонайменше на одну операційну систему Windows, для якої доступний патч, але він не повинен працювати в кожній операційній системі (Будь ласка, вкажіть будь-які обмеження).
  • Застосовуються стандартні лазівки
  • Це , тому подання з найменшою кількістю байтів виграє!

3
Хм, одне запитання. Що стосується значень truthy / falsey, чи допускається помилка як значення фальси, а truthy як фактичне повернення, чи це не дозволено?
Кевін Круїссен

3
@KevinCruijssen Я радий вважати помилку помилковим значенням. Я думаю, що це явний показник того, що патч не встановлений.
Notts90

12
Якщо користувачі пропустили цей патч, але встановили пізніший, він все одно буде захищений, щоб це могло дати помилковий негатив для деяких користувачів.
Ян Міллер

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

7
Чи зараження хост-ПК є дійсним значенням фальси? Вочевидь, це зрозуміло б
Нік Робертсон

Відповіді:


158

PowerShell 2.0, 24 20 16 байт

hotfix KB4012212

-4 байти завдяки @wever за видалення -id.
-4 байти завдяки @ DankoDurbić , змінивши get-hotfixна hotfix.

KB4012212є патчем для Windows 7. Це можна замінити будь-яким KB-кодом із пов’язаної сторінки патча .

Повертає інформацію джерела , опису , HotFixID , InstalledBy та InstalledOn, коли він встановлений як триєдне значення, і видасть помилку, якщо він не зможе знайти його як значення фальси.

Ось приклад виходу на truthy та фальси (так KB4012212це встановлено на моїй машині, але KB4012215це не так):

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


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

1
Не потрібно вказувати, що ідентифікатор також Get-HotFix KB4012212буде працювати. (Тестується лише з PSv4). Але я погоджуюся з Яном Двораком, я не думаю, що результат не підтверджує виклик.
що

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

6
@ Notts90 Так, коментар мається на увазі для підказки для людей, які випробують код і отримують помилковий мінус.
Сумирда

10
Просто hotfix KB4012212достатньо. У Powershell писати не потрібно get-.
Данько Дурбич

43

Batch / 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
це стане проблематичним, коли 40-мільйонні оновлення розгортаються
Джон Дворак

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 видаляє пробіл та замінить істинне та хибне на 1 та 0.

-5 байт завдяки @KevinCruijssen скорочення імен змінних

Очевидно, що не вигравати жодних призів, але цей скрипт повноважень перевірить журнал історії оновлень Microsoft на KB4013429 (один із патчів, перелічених за посиланням ), його можна замінити будь-яким із патчів. Думав, я опублікую це, оскільки це трохи надійніше, якщо патч буде замінено на більш пізній.


13
Привіт, Ласкаво просимо до PPCG! :) Оскільки це питання позначено кодовим гольфом, ідея полягає в тому, щоб виконати виклик якомога менше байтів. Я знаю, що ваша відповідь, ймовірно, не виграє в будь-якому випадку, і ви використовували більш повний метод, ніж я, але ви все одно можете пограти у свою поточну відповідь, видаливши непотрібні пробіли та використовуйте 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. Досить впевнений, що ви можете просто вийти на конвеєр, а не відлуння, оскільки у вас повинен бути лише один матч результатів, і я думаю, що це вважатиметься правдою на основі ОП
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
Чи можете ви додати пункт де у запиті 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 За те, що ви не користуєтесь мовою сценарію оболонок.
Hjulle

2
Ерік Карлссон (у якого недостатньо представників для коментарів) запропонував у редакції зберегти 7 байт, замінивши SELECT HotFixIDна SELECT *.
Мартін Ендер

14

Кігвін, 31 байт

Просто грати в повстанця

grep KB4012212 "$WINDIR"/*e.log

код повернення буде 0, якщо патч застосовано, або 1, якщо він не був.

Тестовано під Windows 7 із Cygwin 2.6.0


Чи буде це спрацьовувати, якщо ви видалите KB?
TheLethalCoder

@TheLethalCoder Я не впевнений, і не думаю, що зможу це дізнатися. Моя відповідь є походженням від Райана, і ми обидва шукаємо текст у величезному WindowsUpdate.log, який містить набагато більше, ніж імена KB, я не ставлю ставку, що це число не може з’явитися в іншому контексті
Аарон

Досить справедливо, я не знав достатньо про те, що твій робив, отже, питання не пропозиція :)
TheLethalCoder

3
Це має спрацювати, якщо ви його видалите, KBоскільки це малоймовірно, що воно 4012212буде там, крім іншого шляху. Ви також можете зберегти 1 байт, якщо ви вилучите лише K, оскільки B4012212без шляху не збираєтеся їх знайти .
Сирени

4
@Sirens Я не впевнений у тестуванні лише номера, я б боявся відповідати 1) кількості переданих байтів, 2) оновлень, звітів про події та завдання UID або 3) шістнадцяткових кодів помилок (та інших). Видалення лише Kпершого видається розумним, але потім B...стає дійсним шістнадцятковим поданням, що робить можливим зіткнення з UID-кодами та шістнадцятковими кодами
Аарон

12

PowerShell v4, 64 байти

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

Перевірка всіх посилань на KB за допомогою RegEx (зараз у вас є дві проблеми)


3
Ласкаво просимо на сайт! Приємна перша відповідь!
програміст5000

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-віддаляються.
Кевін Cruijssen

3

Powershell 5,1 134 байт

Те саме, що і Марк Піппін, але змінив виправлення Get-Hotfix на виправлення і куди? економія 8 байт

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

Я не можу знизити його в кількості байтів, ніж відповідь Кевіна


1
Ви можете видалити пробіли навколо труби: (HotFix|? HotFixID ...для -2 байт.
Kevin Cruijssen

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.