GottaFix für WannaCrypt?

109

Warnung

Die Antworten auf diesen Herausforderungstest für eine bestimmte Version des Patches, mit dessen Hilfe WannaCrypt / WannaCry-Angriffe gestoppt werden können. Abhängig von Ihrem Betriebssystem verfügen Sie möglicherweise über einen anderen Patch. Am besten schützen Sie sich, indem Sie sicherstellen, dass Ihr PC auf dem neuesten Stand ist, und beim Öffnen von Anhängen und Weblinks vorsichtig vorgehen.


Einführung

Ich denke gern, dass Programmierer von Natur aus gute Leute sind, auch wenn einige nicht so nett sind. Lassen Sie uns den Leuten helfen, sicherzustellen, dass sie mit dem MS17-010-Patch geschützt sind .

Herausforderung

Ihre Herausforderung besteht darin, ein vollständiges Programm oder eine vollständige Funktion zu schreiben, die je nachdem, ob der Patch MS17-010 auf dem aktuellen Betriebssystem installiert ist , einen Wahrheits- oder einen falschen Wert zurückgibt.

Ein- und Ausgang

Eingabe: Keine Eingabe erforderlich

Ausgabe: Ein wahrer oder falscher Wert (Geben Sie an, welcher Wert für jeden Fall verwendet wird). Ein Fehler / eine Ausnahme kann als falscher Wert angesehen werden.

Regeln

  • Ihr Code sollte auf mindestens einem Windows-Betriebssystem ausgeführt (und korrekt ausgegeben) werden, für das der Patch verfügbar ist, muss jedoch nicht auf jedem Betriebssystem ausgeführt werden (bitte geben Sie Einschränkungen an).
  • Es gelten Standardlücken
  • Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Notts90
quelle
3
Hmm, eine Frage. In Bezug auf die Wahrheits- / Falschheitswerte ist ein Fehler als Falschheitswert und Wahrheit als tatsächliche Rendite zulässig, oder ist dies nicht zulässig?
Kevin Cruijssen
3
@ KevinCruijssen Ich bin froh, einen Fehler als einen falschen Wert zu betrachten. Ich denke, es ist ein klarer Hinweis darauf, dass der Patch nicht installiert ist.
Notts90
12
Wenn Benutzer diesen Patch verpasst haben, aber einen späteren Patch installiert haben, sind sie weiterhin geschützt, sodass dies für einige Benutzer zu einem falschen Negativ führen kann.
Ian Miller
2
@MichealJohnson ist sich nicht sicher, ob es ratsam ist, Leute zur Veröffentlichung von Code zu ermutigen, um zu demonstrieren, wie die Sicherheitsanfälligkeit ausgenutzt werden kann.
Notts90
7
Ist die Infektion des Host-PCs ein gültiger Falschgeldwert? Es würde offensichtlich den Punkt rüberbringen
Nic Robertson

Antworten:

158

PowerShell 2.0, 24 20 16 Byte

hotfix KB4012212

-4 Bytes dank @whatever durch Entfernen -id.
-4 Bytes dank @ DankoDurbić durch den Wechsel get-hotfixzu hotfix.

KB4012212ist der Patch für Windows 7. Dieser kann durch einen beliebigen KB-Code von der verlinkten Seite des Patches ersetzt werden .

Wird die Rück Quelle , Beschreibung , HotFixID , InstalledBy und InstalledOn Informationen , wenn es als truthy Wert installiert ist, und einen Fehler geben , wenn es nicht in der Lage ist es als Falsey Wert zu finden.

Hier ist ein Beispiel für eine Ausgabe in Wahrheit und in Falsch (wird also KB4012212auf meinem Computer installiert, ist es aber KB4012215nicht):

Bildbeschreibung hier eingeben

Kevin Cruijssen
quelle
82
eine Antwort auf PPCG, die für praktische Zwecke nützlich ist? Ich bin beeindruckt.
John Dvorak
1
Sie müssen nicht angeben, die ID Get-HotFix KB4012212wird auch funktionieren. (Nur mit PSv4 getestet). Aber ich stimme Jan Dvorak zu, ich glaube nicht, dass die Ausgabe die Herausforderung bestätigt.
Was auch immer
6
Funktioniert nicht, wenn Sie bereits beim nächsten oder späteren monatlichen Roll-up sind, da diese sich gegenseitig ersetzen.
Sumyrda
6
@ Notts90 Ja, der Kommentar ist als Hinweis für Leute gedacht, die den Code ausprobieren und ein falsches Negativ erhalten.
Sumyrda
10
Einfach hotfix KB4012212ist genug. In Powershell müssen Sie nicht schreiben get-.
Danko Durbić
43

Batch / Windows CMD, 31 29 28 23 Bytes

wmic qfe|find "4012212"

-1 Byte dank @SteveFest durch Ändern findstr 4012212auf find "4012212".
-5 Bytes dank @BassdropCumberwubwubwub durch Entfernen list.

Erläuterung:

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

Gibt einige Patch-Informationen aus, falls installiert, oder sonst nichts.
In der Abbildung unten ist der Patch 4012212installiert und 4012215nicht.

Bildbeschreibung hier eingeben

Kevin Cruijssen
quelle
5
Dies wird problematisch, sobald 40 Millionen Updates veröffentlicht werden
John Dvorak,
1
Verwenden Sie findstattdessen findstr, es speichert 3 Bytes
Stevefestl
2
Funktioniert nicht, wenn Sie bereits beim nächsten oder späteren monatlichen Roll-up sind, da diese sich gegenseitig ersetzen.
Sumyrda
2
@Sumyrda Die Herausforderung besteht darin, nach diesem bestimmten Patch zu suchen. Es muss nicht nach Ersatz-Patches gesucht werden.
Notts90
1
find "4012212"funktioniert auch für -1 Byte, wmic qfe|find "4012212"scheint auch zu funktionieren, aber vielleicht fehlt mir dort etwas?
Bassdrop Cumberwubwubwub
20

Bash + Cygwin (oder WSL), 21 Byte

Diese Antwort wird meistens aus Kevins Antwort gestohlen . Wirf auf diese Weise eine Gegenstimme, auch wenn du denkst, dass dies eine verdient.

wmic qfe|grep 4012212

Cygwin hat neben coreutils auch Zugriff auf die Windows-Befehle. Wir können Coreutils grepanstelle von Windows verwenden, findsodass wir keine Anführungszeichen verwenden müssen. Dadurch werden 2 Bytes eingespart.

Captain Man
quelle
1
Na ja, das ist kürzer als meins. Ich habe nicht den guten MS-Benutzer ausgewählt, von dem ich stehlen soll!
Aaron
2
Jemand hat dies bearbeitet, um "Oder WSL" einzuschließen, was meiner Meinung nach zutrifft, aber Sie müssten zuerst den Pfad ändern.
Captain Man
17

Powershell 5.1, 245 212 207 Bytes

$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 Bytes dank @KevinCruijssen, der Leerzeichen entfernt und true und false durch 1 und 0 ersetzt.

-5 Bytes dank @KevinCruijssen Verkürzung der Variablennamen

Natürlich werden keine Preise gewonnen, aber dieses Powershell-Skript überprüft das Microsoft Update-Verlaufsprotokoll auf KB4013429 (eines der im Link aufgelisteten Patches ), das durch eines der Patches ersetzt werden kann. Ich dachte, ich würde es posten, weil es ein bisschen zuverlässiger ist, wenn der Patch durch einen späteren ersetzt wird.

Ryan
quelle
13
Hallo, willkommen bei PPCG! :) Da diese Frage mit Code-Golf gekennzeichnet ist, besteht die Idee darin, die Herausforderung in so wenigen Bytes wie möglich abzuschließen. Ich weiß, dass Ihre Antwort wahrscheinlich sowieso nicht gewinnen wird, und Sie haben eine vollständigere Methode als ich verwendet, aber Sie können Ihre aktuelle Antwort trotzdem Golf spielen, indem Sie unnötige Leerzeichen entfernen und 1/ 0anstelle von true/ verwenden false. Wie $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;
folgt
2
Oh, und eine andere Sache, die Sie spielen können, ist mir erst jetzt aufgefallen: Es ist am besten, immer Variablen- / Methoden- / Klassennamen mit einem Zeichen zu verwenden. So können Sie die Änderung Hczu Hund die Sezu T(oder einem anderen einzelnen Buchstaben neben Hoder Sdie Sie bereits verwendet haben) weitere 5 Bytes zu speichern. :)
Kevin Cruijssen
2
Können Sie nicht $H direkt übergeben, anstatt zu speichern? Auch %{ }und ?{ }anstelle von ForEach-Objectund if. Ziemlich sicher, dass Sie nur in die Pipeline ausgeben können und nicht in das Echo, da Sie nur eine Übereinstimmung mit den Ergebnissen haben sollten, und ich denke, dass dies aufgrund des OP als wahr angesehen werden würde
pinkfloydx33
16

C # 178 143 141 134 Bytes

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

Kompiliert in einen Bereich, Func<int, bool>in dem die Eingabe nicht verwendet wird.

35 Bytes mit Hilfe von @Ryan
gespeichert 2 Bytes dank @KevinCruijssen
gespeichert 7 Bytes dank @ErikKarlsson gespeichert

Formatierte Version:

System.Func<int, bool> f = _ =>
    new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'")
                         .Get().Count > 0;
TheLethalCoder
quelle
ist nicht if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;dasselbe wie return h["HotFixID"]=="KB4012212"?
Julian Wolf
@JulianWolf Nein, da Letzterer nur das erste zurückkommende Element überprüft, während Ersterer bei jeder Iteration überprüft.
TheLethalCoder
1
Könnten Sie der ManagementObjectSearcher-Abfrage eine where-Klausel hinzufügen und countam Ende der eine hinzufügen .get()? Wie folgt aus : _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Um 4 Bytes zu sparen
Ryan
5
+1 Um nicht in einer Shell-Skriptsprache zu sein.
Hjulle
2
Erik Karlsson (die nicht genug rep hat einen Kommentar) vorgeschlagen in einem Edit 7 Byte speichern durch Ersetzen SELECT HotFixIDmit SELECT *.
Martin Ender
14

Cygwin, 31 Bytes

Nur um den Rebellen zu spielen

grep KB4012212 "$WINDIR"/*e.log

Der Rückkehrcode ist 0, wenn der Patch angewendet wurde, oder 1, wenn er nicht angewendet wurde.

Getestet unter Windows 7 mit Cygwin 2.6.0

Aaron
quelle
Funktioniert das, wenn Sie das entfernen KB?
TheLethalCoder
@TheLethalCoder Ich bin nicht sicher, und ich glaube nicht, dass ich es herausfinden kann. Meine Antwort stammt von Ryan und wir suchen beide nach Text im riesigen WindowsUpdate.log, der viel mehr als die KB-Namen enthält. Ich würde nicht wetten, dass die Nummer nicht in einem anderen Kontext erscheinen kann
Aaron
Fair genug, ich wusste nicht genug darüber, was deine tat, daher die Frage kein Vorschlag :)
TheLethalCoder
3
Dies sollte funktionieren, wenn Sie entfernen, KBda es eher unwahrscheinlich ist, dass 4012212etwas anderes als der Pfad vorhanden ist. Sie könnten auch 1 Byte sparen, wenn Sie nur das K entfernen, da Sie B4012212ohne den Pfad nicht zufällig finden werden.
Sirenen
4
@ Sirens Ich bin mir nicht sicher, ob ich nur die Anzahl testen soll. Ich hätte Angst, 1) Anzahl der übertragenen Bytes, 2) Aktualisierungen, Ereignisse und Job-UIDs oder 3) Hex-Fehlercodes (und andere) zuzuordnen. Nur das Kerste zu entfernen, erscheint vernünftig, wird dann aber B...zu einer gültigen Hex-Darstellung, was eine Kollision mit UIDs und Hex-Codes ermöglicht
Aaron,
12

PowerShell v4, 64 Byte

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

Überprüft alle KB-Verweise mit einem RegEx (jetzt haben Sie zwei Probleme)

MKPhil
quelle
3
Willkommen auf der Seite! Schöne erste Antwort!
programmer5000
7

Batch / Eingabeaufforderung, 27 25 Bytes

systeminfo|find "4012212"

Wenn KB4012212 gefunden wird, wird das ausgegeben, andernfalls wird nichts ausgegeben.

Vielen Dank an @ Kevin für das Speichern von 2 Bytes :)

George
quelle
1
Ich denke, Sie können die Leerzeichen um die Pipe entfernen: systeminfo|find "4012212"für -2 Bytes.
Kevin Cruijssen
5

Powershell 2.0, 142 Bytes

  • Gibt 0 für "false" zurück, nicht gepatcht "<0 für" true ", gepatcht.

Unten finden Sie alle KBs vom März, die jedoch mit den KBs vom April und Mai erweitert werden müssen, da jede KB alle vorherigen ersetzt.

(Get-HotFix | where HotFixID -match "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count
MarkPippin
quelle
Ich bin nicht sicher, aber ich denke , die Sie ändern können , (Get-HotFix | whereum (HotFix|where(Leerzeichen entfernt und Get-entfernt.
Kevin Cruijssen
3

Powershell 5.1 134 Bytes

Wie Mark Pippin, aber den Get-Hotfix in Hotfix geändert und wohin? 8 Bytes sparen

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

Ich kann es nicht niedriger in der Byteanzahl als die Antwort von Kevin bekommen

Luke
quelle
1
Sie können die Leerzeichen um die Pipe entfernen: (HotFix|? HotFixID ...für -2 Bytes.
Kevin Cruijssen
2

DISM , 40 Bytes

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

Erläuterung:

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

Gibt die Paketidentität aus, wenn sie installiert ist, oder nichts anderes.
In der Abbildung unten ist der Patch 4012212installiert und 4012215nicht.

Bildbeschreibung hier eingeben

Kevin Cruijssen
quelle