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!
Notts90
źródło
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

Kevin Cruijssen
źródło
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

Kevin Cruijssen
źródło
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.

Kapitanie Człowieku
źródło
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ą.

Ryan
źródło
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;
TheLethalCoder
źródło
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

Aaron
źródło
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
W
porządku,
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)

MKPhil
źródło
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 :)

Jerzy
źródło
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
MarkPippin
źródło
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

Łukasz
źródło
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

Kevin Cruijssen
źródło