GottaFix dla WannaCrypt?


109

Ostrzeżenie

Odpowiedzi na ten test wyzwania dla konkretnej wersji łatki, która pomaga powstrzymać ataki WannaCrypt / WannaCry. W zależności od systemu operacyjnego możesz mieć inną łatkę. Najlepszym sposobem ochrony jest upewnienie się, że komputer jest w pełni aktualny i ostrożność podczas otwierania załączników i łączy internetowych.


Wprowadzenie

Lubię myśleć, że programiści są z natury dobrymi ludźmi, nawet jeśli niektórzy nie są tacy mili , więc pomóżmy ludziom upewnić się, że są chronieni łatką MS17-010 .

Wyzwanie

Wyzwanie polega na napisaniu pełnego programu lub funkcji, która zwraca wartość true lub falsey w zależności od tego, czy łata MS17-010 jest zainstalowana w bieżącym systemie operacyjnym.

Wejście i wyjście

Wejście: wejście nie jest wymagane

Dane wyjściowe: wartość zgodna z prawdą lub falsey (wskazać, która jest używana dla każdego przypadku). Błąd / wyjątek można uznać za wartość falsey.

Zasady

  • Twój kod powinien działać (i wyświetlać poprawnie) w co najmniej jednym systemie operacyjnym Windows, dla którego łatka jest dostępna, ale nie musi działać w każdym systemie operacyjnym (Podaj wszelkie ograniczenia).
  • Obowiązują standardowe luki
  • To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

3
Hmm, jedno pytanie .. Jeśli chodzi o wartości prawda / falsey, czy błąd jest dozwolony jako wartość falsey i prawda jako rzeczywisty zwrot, czy nie jest to dozwolone?
— Kevin Cruijssen

3
@KevinCruijssen Z przyjemnością traktuję błąd jako wartość fałszywie. Myślę, że to wyraźny wskaźnik, że łatka nie została zainstalowana.
— Notts90

12
Jeśli użytkownicy przegapili tę poprawkę, ale zainstalowali ją później, nadal będą chronieni, więc może to dać fałszywy negatyw dla niektórych użytkowników.
— Ian Miller

2
@MichealJohnson nie jest pewien, czy mądrze jest zachęcać ludzi do pisania kodu demonstrującego sposób wykorzystania tej luki.
— Notts90

7
Czy infekcja komputera hosta jest prawidłową wartością falsey? To oczywiście miałoby sens
— Nic Robertson

Odpowiedzi:


158

PowerShell 2.0, 24 20 16 bajtów

hotfix KB4012212

-4 bajty dzięki @whthing przez usunięcie -id.
-4 bajty dzięki @ DankoDurbić , zmieniając get-hotfixna hotfix.

KB4012212jest poprawką dla systemu Windows 7. Można ją zastąpić dowolnym kodem KB z połączonej strony poprawki .

Zwróci informacje o źródle , opisie , HotFixID , InstalledBy i InstalledOn, gdy zostanie zainstalowane jako prawdziwa wartość, i wyświetli błąd, jeśli nie będzie w stanie znaleźć go jako wartości falsey.

Oto przykład zarówno prawdziwej, jak i wyjściowej falsey (więc KB4012212jest zainstalowany na moim komputerze, ale KB4012215nie jest):

wprowadź opis zdjęcia tutaj


82
odpowiedź na PPCG, która jest naprawdę przydatna do celów praktycznych? Jestem pod wrażeniem.
— John Dvorak

1
Nie musisz też określać identyfikatora, który Get-HotFix KB4012212będzie działał. (Testowane tylko z PSv4). Ale zgadzam się z Janem Dvorakiem, nie sądzę, by wyniki potwierdziły wyzwanie.
— cokolwiek

6
Nie działa, jeśli jesteś już w następnym lub późniejszym comiesięcznym zestawieniu, ponieważ te się wzajemnie zastępują.
— Sumyrda

6
@ Notts90 Tak, komentarz ma służyć jako wskazówka dla osób, które wypróbują kod i uzyskają fałszywy negatywny.
— Sumyrda

10
Wystarczy hotfix KB4012212. W Powershell nie musisz pisać get-.
— Danko Durbić

43

Batch / Windows CMD, 31 29 28 23 bajtów

wmic qfe|find "4012212"

-1 bajt dzięki @SteveFest po zmianie findstr 4012212na find "4012212".
-5 bajtów dzięki @BassdropCumberwubwubwub przez usunięcie list.

Wyjaśnienie:

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

Wysyła informacje o łatce, jeśli jest ona zainstalowana lub nic innego.
Na zrzucie ekranu poniżej łata 4012212jest zainstalowana i 4012215nie jest.

wprowadź opis zdjęcia tutaj


5
stanie się to problematyczne, gdy pojawi się 40 milionów aktualizacji
— John Dvorak

1
użyj findzamiast findstr, to oszczędza 3 bajty
— stevefestl

2
Nie działa, jeśli jesteś już w następnym lub późniejszym comiesięcznym zestawieniu, ponieważ te się wzajemnie zastępują.
— Sumyrda

2
@ Sumyda wyzwaniem jest sprawdzenie tej konkretnej łatki, nie trzeba jej sprawdzać pod kątem łatek zastępczych.
— Notts90

1
find "4012212"działa również na bajt -1, wmic qfe|find "4012212"wydaje się też działać, ale może coś tam brakuje?
— Bassdrop Cumberwubwubwub

20

Bash + Cygwin (lub WSL), 21 bajtów

Ta odpowiedź jest w większości skradziona z odpowiedzi Kevina . Więc wyrzuć głos w ten sposób, także jeśli uważasz, że na to zasługuje.

wmic qfe|grep 4012212

Cygwin ma dostęp do poleceń systemu Windows oprócz coreutils. Jesteśmy w stanie używać Coreutils grepzamiast Windows, findwięc nie musimy używać cudzysłowów. Z tego powodu zapisano 2 bajty.


1
No cóż, tak, to jest krótsze niż moje; Nie wybrałem dobrego użytkownika MS do kradzieży!
— Aaron

2
Ktoś edytował to, aby dołączyć „Lub WSL”, co, jak sądzę, jest prawdą, ale najpierw musisz zmodyfikować ścieżkę.
— Captain Man

17

PowerShell 5.1, 245 212 207 bajtów

$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 bajtów dzięki @KevinCruijssen usuwającemu spację i zastępując wartość true i false wartością 1 i 0.

-5 bajtów dzięki skróceniu nazw zmiennych @KevinCruijssen

Oczywiście nie wygra żadnych nagród, ale ten skrypt programu PowerShell sprawdzi dziennik historii usługi Microsoft Update pod kątem KB4013429 (jedna z łat wymienionych w łączu ), którą można zastąpić dowolną łatą . Pomyślałem, że opublikuję go, ponieważ jest on trochę bardziej niezawodny, jeśli łatka została zastąpiona nowszą.


13
Cześć, witamy w PPCG! :) Ponieważ to pytanie jest oznaczone kodem golfowym, pomysł polega na ukończeniu wyzwania w jak najmniejszej liczbie bajtów. Wiem, że Twoja odpowiedź i tak prawdopodobnie nie wygra, a ty użyłeś bardziej kompletnej metody niż ja, ale nadal możesz pograć w swoją obecną odpowiedź, usuwając niepotrzebne białe spacje, i użyj 1/ 0zamiast true/ false. W ten sposób: $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;( 212 bajtów )
— Kevin Cruijssen

2
Aha, i jeszcze jedna rzecz, na którą możesz grać w golfa, którą teraz zauważam: najlepiej zawsze używać jednoznakowych nazw zmiennych / metod / klas. Więc można zmienić Hc, aby Hi Sedo T(lub innego oprócz jednej litery Hlub Sktóre zostały już wykorzystane), aby zapisać kolejne 5 bajtów. :)
— Kevin Cruijssen

2
Nie możesz przejść $H bezpośrednio zamiast przechowywać? Również %{ }i ?{ }zamiast ForEach-Objecti if. Jestem całkiem pewien, że możesz po prostu wysyłać dane wyjściowe do potoku zamiast do echa, ponieważ powinieneś mieć tylko jedno dopasowanie wyniku i myślę, że byłoby to zgodne z prawdą na podstawie OP
— pinkfloydx33

16

C #, 178 143 141 134 bajtów

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

Kompiluje do miejsca, w Func<int, bool>którym dane wejściowe nie są używane.

Zapisano 35 bajtów przy pomocy @Ryan
Zapisano 2 bajty dzięki @KevinCruijssen
Zapisano 7 bajtów dzięki @ErikKarlsson

Wersja sformatowana:

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

to nie if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;to samo co return h["HotFixID"]=="KB4012212"?
— Julian Wolf

@JulianWolf Nie, ponieważ ten ostatni sprawdza tylko pierwszy element, który powraca, podczas gdy poprzedni sprawdza każdą iterację.
— TheLethalCoder

1
Czy możesz dodać klauzulę where w zapytaniu ManagementObjectSearcher i dodać countna końcu .get()? Tak: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Aby zaoszczędzić 4 bajty
— Ryan

5
+1 Za brak bycia w języku skryptowym powłoki.
— Hjulle,

2
Erik Karlsson (który nie ma wystarczającej liczby powtórzeń, aby skomentować) zasugerował w edycji, aby zaoszczędzić 7 bajtów, zastępując SELECT HotFixIDje SELECT *.
— Martin Ender

14

Cygwin, 31 bajtów

Żeby zagrać w buntownika

grep KB4012212 "$WINDIR"/*e.log

kod powrotu będzie wynosił 0, jeśli łatka została zastosowana, lub 1, jeśli nie została zastosowana.

Testowane pod Windows 7 z Cygwin 2.6.0


Czy to zadziała, jeśli usuniesz KB?
— TheLethalCoder

@TheLethalCoder Nie jestem pewien i nie sądzę, żebym się dowiedział. Moja odpowiedź pochodzi od Ryana i oboje szukamy tekstu w ogromnym WindowsUpdate.log, który zawiera znacznie więcej niż nazwy KB, nie założę się, że numer nie może pojawić się w innym kontekście
— Aaron


3
Powinno to działać, jeśli usuniesz, KBponieważ jest raczej mało prawdopodobne, że 4012212będzie tam cokolwiek oprócz ścieżki. Możesz również zapisać 1 bajt, jeśli usuniesz tylko K, ponieważ nie znajdziesz B4012212losowo bez ścieżki.
— Syreny

4
@Sirens Nie jestem pewien co do testowania tylko liczby, bałbym się dopasować 1) liczbę przesłanych bajtów, 2) aktualizacji, zgłaszania zdarzeń i identyfikatorów UID zadań lub 3) kodów błędów szesnastkowych (i innych). Usunięcie tylko Kpierwszego wydaje się rozsądne, ale B...staje się prawidłową reprezentacją szesnastkową, umożliwiając kolizję z UID i kodami szesnastkowymi
— Aaron

12

PowerShell v4, 64 bajty

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

Sprawdza wszystkie referencje KB za pomocą RegEx (teraz masz dwa problemy)


3
Witamy na stronie! Ładna pierwsza odpowiedź!
— programista

7

Wiersz polecenia / polecenia, 27 25 bajtów

systeminfo|find "4012212"

Jeśli zostanie znalezione KB4012212, wypisuje to, w przeciwnym razie nic nie jest wypisywane.

Dzięki @Kevin za zapisanie 2 bajtów :)


1
Myślę, że możesz usunąć spacje wokół rury: systeminfo|find "4012212"dla -2 bajtów.
— Kevin Cruijssen

5

Powershell 2.0, 142 bajty

  • Zwraca 0 dla „fałsz”, bez łatek „<0 dla„ prawda ”, załatane.

Poniżej zawiera wszystkie KB od marca, ale wymaga rozszerzenia w kwietniu, maj KB, ponieważ każdy z nich zastępuje wszystkie poprzednie.

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

Nie jestem pewien, ale myślę, że możesz zmienić (Get-HotFix | wherena (HotFix|where(spacje usunięte i Get-usunięte.
— Kevin Cruijssen

3

PowerShell 5.1 134 bajtów

To samo co Mark Pippin, ale zmienił Get-Hotfix na Hotfix i gdzie? oszczędność 8 bajtów

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

Nie mogę obniżyć liczby bajtów niż odpowiedź Kevina


1
Możesz usunąć spacje wokół potoku: (HotFix|? HotFixID ...dla -2 bajtów.
— Kevin Cruijssen

2

DISM , 40 bajtów

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

Wyjaśnienie:

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

Zwraca tożsamość pakietu, jeśli jest zainstalowany lub nic innego.
Na zrzucie ekranu poniżej łata 4012212jest zainstalowana i 4012215nie jest.

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.