GottaFix per WannaCrypt?


109

avvertimento

Le risposte a questo test di sfida per una versione specifica della patch che aiuta a fermare gli attacchi WannaCrypt / WannaCry. A seconda del sistema operativo in uso, potresti avere una patch diversa. Il modo migliore per proteggerti è assicurarti che il tuo PC sia completamente aggiornato e fai attenzione quando apri allegati e collegamenti web.


introduzione

Mi piace pensare che i programmatori siano persone intrinsecamente buone, anche se alcuni non sono così gentili , quindi aiutiamo le persone a assicurarsi che siano protette con la patch MS17-010 .

Sfida

La tua sfida è scrivere un programma o una funzione completi che restituiscano un valore di verità o falsità a seconda che la patch MS17-010 sia installata sul sistema operativo corrente.

Ingresso e uscita

Input: nessun input richiesto

Output: un valore di verità o falsità (indicare quale viene utilizzato per ciascun caso). Un errore / eccezione può essere considerato un valore di falso.

Regole

  • Il codice deve essere eseguito (e generato correttamente) su almeno un sistema operativo Windows per il quale è disponibile la patch, ma non deve essere eseguito su tutti i sistemi operativi (indicare eventuali limitazioni).
  • Si applicano scappatoie standard
  • Questo è , quindi vince l'invio con il minor numero di byte!

3
Hmm, una domanda. Per quanto riguarda i valori di verità / falsità, un errore è ammesso come valore di falsità e la verità come un ritorno effettivo, o non è consentito?
Kevin Cruijssen,

3
@KevinCruijssen Sono felice di considerare un errore come un valore errato. Penso che sia un chiaro indicatore che la patch non è installata.
Notts90,

12
Se gli utenti hanno perso questa patch ma ne hanno installata una successiva, saranno comunque protetti in modo che ciò possa dare un falso negativo per alcuni utenti.
Ian Miller,

2
@MichealJohnson non è sicuro che sia saggio incoraggiare le persone a pubblicare codice che mostri come sfruttare la vulnerabilità.
Notts90,

7
L'infezione del PC host è un valore di falsità valido? Ovviamente avrebbe capito bene
Nic Robertson

Risposte:


158

PowerShell 2.0, 24 20 16 byte

hotfix KB4012212

-4 byte grazie a @whatever rimuovendolo -id.
-4 byte grazie a @ DankoDurbić cambiando get-hotfixin hotfix.

KB4012212è la patch per Windows 7. Questa può essere sostituita con qualsiasi codice KB dalla pagina collegata della patch .

Restituirà le informazioni di origine , descrizione , HotFixID , InstalledBy e InstalledOn quando è installato come valore di verità e genererà un errore se non è in grado di trovarlo come valore di falsa.

Ecco un esempio di output sia true che true (quindi KB4012212è installato sulla mia macchina, ma KB4012215non lo è):

inserisci qui la descrizione dell'immagine


82
una risposta su PPCG che è effettivamente utile per scopi pratici? Sono impressionato.
John Dvorak,

1
Non è necessario specificare l'id Get-HotFix KB4012212funzionerà anche. (Testato solo con PSv4). Ma sono d'accordo con Jan Dvorak, non credo che l'output confermi la sfida.
qualunque sia

6
Non funziona se si è già nel roll-up mensile successivo o successivo, perché si sostituiscono l'un l'altro.
Sumyrda,

6
@ Notts90 Sì, il commento è inteso come suggerimento per le persone che provano il codice e ottengono un falso negativo.
Sumyrda,

10
Basta hotfix KB4012212è sufficiente. In Powershell non è necessario scrivere get-.
Danko Durbić,

43

CMD batch / Windows, 31 29 28 23 byte

wmic qfe|find "4012212"

-1 byte grazie a @SteveFest cambiando findstr 4012212in find "4012212".
-5 byte grazie a @BassdropCumberwubwubwub rimuovendolo list.

Spiegazione:

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

Emette alcune informazioni sulla patch se è installata, o niente altrimenti.
Nello screenshot seguente, la patch 4012212è installata e 4012215non lo è.

inserisci qui la descrizione dell'immagine


5
questo diventerà problematico una volta che gli aggiornamenti di 40 M saranno disponibili
John Dvorak

1
usa findinvece di findstr, salva 3 byte
stevefestl

2
Non funziona se si è già nel roll-up mensile successivo o successivo, perché si sostituiscono l'un l'altro.
Sumyrda,

2
@Sumyrda la sfida è verificare la presenza di questa patch specifica, non è necessario verificare la presenza di patch di sostituzione.
Notts90,

1
find "4012212"funziona anche per -1 byte, wmic qfe|find "4012212"sembra funzionare troppo ma forse mi manca qualcosa lì?
Bassdrop Cumberwubwubwub,

20

Bash + Cygwin (o WSL), 21 byte

Questa risposta è per lo più rubata dalla risposta di Kevin . Quindi lancia un voto in quel modo anche se pensi che questo meriti uno.

wmic qfe|grep 4012212

Cygwin ha accesso ai comandi di Windows oltre a coreutils. Siamo in grado di utilizzare coreutils grepinvece di Windows, findquindi non abbiamo bisogno di usare le virgolette. Per questo motivo vengono salvati 2 byte.


1
Oh bene sì, è più breve della mia; Non ho scelto il buon utente MS da cui rubare!
Aaron,

2
Qualcuno lo ha modificato per includere "O WSL" che immagino sia vero, ma dovresti prima modificare il percorso.
Captain Man,

17

Powershell 5.1, 245 212 207 byte

$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 byte grazie a @KevinCruijssen rimuovendo gli spazi bianchi e sostituendo vero e falso con 1 e 0.

-5 byte grazie a @KevinCruijssen abbreviando i nomi delle variabili

Ovviamente non vincerà alcun premio, ma questo script PowerShell controllerà il registro cronologico di Microsoft Update per KB4013429 (una delle patch elencate sul link ) e può essere sostituito con una qualsiasi delle patch. Ho pensato di pubblicarlo perché è un po 'più affidabile se la patch è stata sostituita con una successiva.


13
Ciao, benvenuto in PPCG! :) Poiché questa domanda è taggata con code-golf, l'idea è quella di completare la sfida nel minor numero di byte possibile. So che la tua risposta probabilmente non vincerà comunque, e hai usato un metodo più completo di me, ma puoi comunque giocare a golf la tua risposta attuale rimuovendo gli spazi bianchi non necessari e usando 1/ 0invece di true/ false. In questo modo: $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 byte )
Kevin Cruijssen,

2
Oh, e un'altra cosa che puoi giocare a golf che noto solo ora: è meglio usare sempre nomi di variabili / metodi / classi a carattere singolo. Quindi puoi cambiare il Hcto He il Seto T(o un'altra singola lettera oltre Ho Sche hai già usato) per salvare altri 5 byte. :)
Kevin Cruijssen

2
Non puoi passare $H direttamente invece di conservarlo? Anche %{ }e ?{ }invece di ForEach-Objecte if. Abbastanza sicuro che puoi semplicemente eseguire l'output alla pipeline anziché all'eco poiché dovresti avere solo una corrispondenza dei risultati e penso che conterebbe come vero in base all'OP
pinkfloydx33

16

C #, 178 143 141 134 byte

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

Compila un punto in Func<int, bool>cui l'input non è utilizzato.

Salvato 35 byte con l'aiuto di @Ryan
Salvato 2 byte grazie a @KevinCruijssen
Salvato 7 byte grazie a @ErikKarlsson

Versione formattata:

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

non è if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;lo stesso di return h["HotFixID"]=="KB4012212"?
Julian Wolf,

@JulianWolf No perché il secondo controlla solo il primo elemento che ritorna mentre il primo controlla ogni iterazione.
TheLethalCoder

1
Potresti aggiungere una clausola where nella query ManagementObjectSearcher e aggiungere un countalla fine del .get()? Come questo: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Per salvare 4 byte
Ryan

5
+1 Per non essere in un linguaggio di scripting shell.
Hjulle,

2
Erik Karlsson (che non ha abbastanza rappresentante per commentare) ha suggerito in una modifica di salvare 7 byte sostituendo SELECT HotFixIDcon SELECT *.
Martin Ender,

14

Cygwin, 31 byte

Solo per interpretare il ribelle

grep KB4012212 "$WINDIR"/*e.log

il codice di ritorno sarà 0 se la patch è stata applicata o 1 se non è stata applicata.

Testato su Windows 7 con Cygwin 2.6.0


Funzionerà se rimuovi il KB?
TheLethalCoder

@TheLethalCoder Non ne sono sicuro e non credo di poterlo scoprire. La mia risposta deriva da quella di Ryan ed entrambi cerchiamo il testo nell'enorme WindowsUpdate.log che contiene molto più dei nomi KB, non scommetterei che il numero non possa apparire in un altro contesto
Aaron

Abbastanza giusto non sapevo abbastanza di quello che stava facendo il tuo, quindi la domanda non è un suggerimento :)
TheLethalCoder

3
Questo dovrebbe funzionare se lo rimuovi KBdal momento che è piuttosto improbabile che 4012212ci sarà in qualsiasi cosa tranne il percorso. Puoi anche salvare 1 byte se rimuovi solo la K perché non lo troverai in B4012212modo casuale senza il percorso.
Sirene,

4
@Sirens Non sono sicuro di provare solo il numero, avrei paura di abbinare 1) numero di byte trasferiti, 2) aggiornamenti, segnalare eventi e lavori UID o 3) codici esadecimali (e altri). Rimuovere solo il Kprimo sembra ragionevole, ma poi B...diventa una rappresentazione esadecimale valida, rendendo possibile la collisione con UID e codici esadecimali
Aaron

12

PowerShell v4, 64 byte

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

Controlla tutti i riferimenti KB usando un RegEx (ora hai due problemi)


3
Benvenuti nel sito! Bella prima risposta!
programmatore

7

Prompt batch / comandi, 27 25 byte

systeminfo|find "4012212"

Se viene trovato KB4012212 output, altrimenti non viene emesso nulla.

Grazie a @Kevin per aver salvato 2 byte :)


1
Penso che puoi rimuovere gli spazi attorno alla pipe: systeminfo|find "4012212"per -2 byte.
Kevin Cruijssen,

5

Powershell 2.0, 142 byte

  • Restituisce 0 per "falso", non corretto "<0 per" vero ", corretto.

Di seguito contiene tutti i KB di marzo, ma è necessario ampliarli con aprile, maggio di KB poiché ognuno sostituisce tutti i precedenti.

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

Non sono sicuro, ma penso che tu possa cambiare (Get-HotFix | wherein (HotFix|where(spazi rimossi e Get-rimossi.
Kevin Cruijssen,

3

Powershell 5.1 134 byte

Lo stesso di Mark Pippin ma ha cambiato Get-Hotfix in Hotfix e dove? risparmio di 8 byte

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

Non riesco a ottenere un numero di byte inferiore rispetto alla risposta di Kevin


1
È possibile rimuovere gli spazi attorno alla pipe: (HotFix|? HotFixID ...per -2 byte.
Kevin Cruijssen,

2

DISM , 40 byte

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

Spiegazione:

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

Emette l'identità del pacchetto se è installato, o niente altrimenti.
Nello screenshot seguente, la patch 4012212è installata e 4012215non lo è.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.