GottaFix pour WannaCrypt?

109

Attention

Les réponses à cette épreuve testent une version spécifique du correctif qui aide à arrêter les attaques WannaCrypt / WannaCry. Selon votre système d'exploitation, vous pouvez avoir un correctif différent. Le meilleur moyen de vous protéger est de vous assurer que votre PC est complètement à jour et de faire attention lorsque vous ouvrez des pièces jointes et des liens Web.


introduction

J'aime penser que les programmeurs sont de bonnes personnes, même si certaines ne le sont pas , alors aidons les gens à s'assurer qu'ils sont protégés avec le correctif MS17-010 .

Défi

Votre défi consiste à écrire un programme complet ou une fonction qui renvoie une valeur de vérité ou de falsey selon que le correctif MS17-010 est installé sur le système d'exploitation actuel.

Entrée et sortie

Entrée: Aucune entrée requise

Sortie: une valeur de vérité ou de falsey (indiquez ce qui est utilisé pour chaque cas). Une erreur / exception peut être considérée comme une valeur de falsey.

Règles

  • Votre code doit être exécuté (et émis correctement) sur au moins un système d'exploitation Windows pour lequel le correctif est disponible, mais ne doit pas nécessairement s'exécuter sur tous les systèmes d'exploitation (veuillez indiquer les limitations éventuelles).
  • Les failles standard s'appliquent
  • C'est du , donc la soumission avec le moins d'octets gagne!
Notts90
la source
3
Hmm, une question .. En ce qui concerne les valeurs de vérité / falsey, une erreur est-elle autorisée en tant que valeur de falsey et la vérité en tant que retour réel, ou n'est-ce pas permis?
Kevin Cruijssen
3
@KevinCruijssen Je suis heureux de considérer une erreur comme une fausse valeur. Je pense que c'est un indicateur clair que le correctif n'est pas installé.
Notts90
12
Si les utilisateurs oublient ce correctif mais en installent un plus tard, ils seront toujours protégés, ce qui pourrait donner un faux négatif pour certains utilisateurs.
Ian Miller
2
@MichealJohnson pas sûr qu'il soit sage d'encourager les gens à poster du code montrant comment exploiter cette vulnérabilité.
Notts90
7
L'infection du PC hôte est-elle une valeur Falsey valide? Cela ferait évidemment passer le message
Nic Robertson

Réponses:

158

PowerShell 2.0, 24 20 16 octets

hotfix KB4012212

-4 octets grâce à @ importe quoi en supprimant -id.
-4 octets grâce à @ DankoDurbić en changeant get-hotfixà hotfix.

KB4012212est le correctif pour Windows 7. Celui-ci peut être remplacé par n’importe quel code KB de la page liée du correctif .

Renverra les informations Source , Description , HotFixID , InstalledBy et InstalledOn lorsqu'il sera installé en tant que valeur de vérité et donnera une erreur s'il est impossible de le trouver en tant que valeur falsey.

Voici un exemple de sortie vérité et falsey (elle KB4012212est donc installée sur ma machine mais KB4012215ne l’est pas):

entrez la description de l'image ici

Kevin Cruijssen
la source
82
une réponse sur PPCG qui est réellement utile à des fins pratiques? Je suis impressionné.
John Dvorak
1
Vous n'avez pas besoin de spécifier l'id Get-HotFix KB4012212fonctionnera aussi. (Testé avec PSv4 uniquement). Mais je suis d'accord avec Jan Dvorak, je ne pense pas que la sortie confirme le défi.
quel que soit
6
Ne fonctionne pas si vous êtes déjà sur la prochaine ou la dernière synthèse mensuelle, car celles-ci se remplacent.
Sumyrda
6
@ Notts90 Oui, le commentaire est conçu comme un indice pour les personnes qui essaient le code et obtiennent un faux négatif.
Sumyrda
10
Juste hotfix KB4012212suffit. Dans Powershell, vous n'avez pas besoin d'écrire get-.
Danko Durbić
43

Lot / Windows CMD, 31 29 28 23 octets

wmic qfe|find "4012212"

-1 octet grâce à @SteveFest en passant findstr 4012212à find "4012212".
-5 octets grâce à @BassdropCumberwubwubwub en supprimant list.

Explication:

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

Affiche des informations de correctif s’il est installé ou rien d’autre.
Dans la capture d'écran ci-dessous, le correctif 4012212est installé et 4012215ne l'est pas.

entrez la description de l'image ici

Kevin Cruijssen
la source
5
cela deviendra problématique une fois que 40 millions de mises à jour seront disponibles
John Dvorak
1
utiliser findau lieu de findstr, il sauve 3 octets
stevefestl
2
Ne fonctionne pas si vous êtes déjà sur la prochaine ou la dernière synthèse mensuelle, car celles-ci se remplacent.
Sumyrda
2
@Sumyrda le défi consiste à rechercher ce correctif spécifique, il n'est pas nécessaire de rechercher des correctifs de remplacement.
Notts90
1
find "4012212"fonctionne également pour -1 octet, wmic qfe|find "4012212"semble fonctionner aussi mais peut-être que quelque chose me manque?
Bassdrop Cumberwubwubwub
20

Bash + Cygwin (ou WSL), 21 octets

Cette réponse est principalement volée de la réponse de Kevin . Alors jetez un vote positif de cette façon aussi si vous pensez que cela en mérite un.

wmic qfe|grep 4012212

Cygwin a accès aux commandes Windows en plus de coreutils. Nous sommes en mesure d'utiliser Coreutils au greplieu de Windows, findnous n'avons donc pas besoin d'utiliser des guillemets. 2 octets sont enregistrés pour cette raison.

Capitaine homme
la source
1
Oh ben ouais c'est plus court que le mien; Je n'ai pas choisi le bon utilisateur MS à voler!
Aaron
2
Quelqu'un a édité ceci pour inclure "Ou WSL", ce qui, je suppose, est vrai, mais vous devez d'abord modifier le chemin.
Captain Man
17

Powershell 5.1, 245 212 207 octets

$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 octets grâce à @KevinCruijssen qui supprime les espaces et remplace true et false par 1 et 0.

-5 octets grâce à @KevinCruijssen en raccourcissant les noms de variables

Évidemment, il ne va pas gagner de prix, mais ce script PowerShell vérifiera dans le journal d'historique de Microsoft Update KB4013429 (l'un des correctifs répertoriés sur le lien ) et pourra être remplacé par n'importe lequel des correctifs. Je pensais le poster car c'est un peu plus fiable si le patch a été remplacé par un plus récent.

Ryan
la source
13
Bonjour, bienvenue sur PPCG! :) Puisque cette question est étiquetée code-golf, l'idée est de relever le défi avec le moins d'octets possible. Je sais que votre réponse ne gagnera probablement pas de toute façon, et vous avez utilisé une méthode plus complète que la mienne, mais vous pouvez toujours utiliser votre réponse actuelle en supprimant les espaces non nécessaires et utilisez 1/ 0au lieu de true/ false. Comme ceci: $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 octets )
Kevin Cruijssen
2
Oh, et une autre chose que vous pouvez jouer au golf et que je remarque seulement maintenant: mieux vaut toujours utiliser des noms de variable / méthode / classe à un seul caractère. Ainsi, vous pouvez modifier les champs Hcto Het Seto T(ou une autre lettre en plus Hou Sque vous avez déjà utilisée) pour enregistrer 5 octets supplémentaires. :)
Kevin Cruijssen
2
Ne pouvez-vous pas passer $H directement au lieu de stocker? Aussi %{ }et ?{ }au lieu de ForEach-Objectet if. Plutôt sûr que vous pouvez simplement sortir vers le pipeline plutôt que sur l'écho puisque vous ne devriez avoir qu'un seul résultat. Je pense que cela compterait comme une vérité basée sur l'OP
pinkfloydx33
16

C #, 178 143 141 134 octets

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

Compile vers un Func<int, bool>emplacement où l'entrée est inutilisée.

35 octets sauvés avec l'aide de @Ryan
2 octets sauvés grâce à @KevinCruijssen
7 octets sauvegardés grâce à @ErikKarlsson

Version formatée:

System.Func<int, bool> f = _ =>
    new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'")
                         .Get().Count > 0;
TheLethalCoder
la source
n'est-ce pas if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;la même chose return h["HotFixID"]=="KB4012212"?
Julian Wolf
@ JulianWolf Non, car ce dernier ne vérifie que le premier élément qui revient, tandis que le premier vérifie chaque itération.
TheLethalCoder
1
Pourriez-vous ajouter une clause where dans la requête ManagementObjectSearcher et en ajouter une countà la fin de .get()? Comme ceci: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Pour économiser 4 octets
Ryan
5
+1 Pour ne pas être dans un langage de script shell.
Hjulle
2
Erik Karlsson (qui n'a pas assez de représentants pour commenter) suggère de sauvegarder 7 octets en le remplaçant SELECT HotFixIDpar SELECT *.
Martin Ender
14

Cygwin, 31 octets

Juste pour jouer le rebelle

grep KB4012212 "$WINDIR"/*e.log

le code de retour sera 0 si le correctif a été appliqué, ou 1 s'il ne l'a pas été.

Testé sous Windows 7 avec Cygwin 2.6.0

Aaron
la source
Cela fonctionnera-t-il si vous supprimez le KB?
TheLethalCoder
@TheLethalCoder Je ne suis pas sûr et je ne pense pas pouvoir le savoir. Ma réponse est dérivée de celle de Ryan et nous cherchons tous les deux du texte dans l'immense journal WindowsUpdate.log qui contient beaucoup plus que les noms de bases de connaissances. Je ne parierais pas que le numéro ne peut pas apparaître dans un autre contexte
Aaron,
Assez juste je n'en savais pas assez sur ce que faisait le vôtre d'où la question pas une suggestion :)
TheLethalCoder
3
Cela devrait fonctionner si vous supprimez, KBcar il est plutôt improbable que 4012212ce soit là, sauf dans le chemin. Vous pouvez également enregistrer 1 octet si vous ne supprimez que le K, car vous n'allez pas chercher B4012212au hasard sans le chemin.
Sirènes
4
@Sirens Je ne suis pas sûr de pouvoir tester le numéro uniquement. Je crains de faire correspondre 1) le nombre d'octets transférés, 2) les mises à jour, les événements de rapport et les travaux UID ou 3) les codes d'erreur hexagonale (et autres). Supprimer uniquement le Kpremier semble raisonnable, mais B...devient alors une représentation hexadécimale valide permettant une collision avec les UID et les codes hexadécimaux
Aaron
12

PowerShell v4, 64 octets

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

Vérifie toutes les références KB en utilisant un RegEx (maintenant vous avez deux problèmes)

MKPhil
la source
3
Bienvenue sur le site! Belle première réponse!
programmer5000
7

Invite de commandes / commandes, 27 25 octets

systeminfo|find "4012212"

Si KB4012212 est trouvé, sortie, sinon rien n'est sorti.

Merci à @ Kevin pour avoir économisé 2 octets :)

George
la source
1
Je pense que vous pouvez supprimer les espaces autour du tuyau: systeminfo|find "4012212"pour -2 octets.
Kevin Cruijssen
5

Powershell 2.0, 142 octets

  • Retourne 0 pour "faux", pas corrigé "<0 pour" vrai ", corrigé.

Ci-dessous, tous les KB de mars, mais les besoins ont été étendus avec avril, les KB de mai étant donné que tous les remplacent.

(Get-HotFix | where HotFixID -match "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count
MarkPippin
la source
Je ne suis pas sûr, mais je pense que vous pouvez changer (Get-HotFix | whereen (HotFix|where(espaces supprimés, et Get-supprimés.)
Kevin Cruijssen
3

Powershell 5.1 134 octets

Identique à celle de Mark Pippin, mais a changé Get-Hotfix en Hotfix et où aller? économiser 8 octets

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

Je ne peux pas obtenir moins d'octets que la réponse de Kevin

Luke
la source
1
Vous pouvez supprimer les espaces autour du tuyau: (HotFix|? HotFixID ...pour -2 octets.
Kevin Cruijssen
2

DISM , 40 octets

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

Explication:

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

Affiche l'identité du paquet s'il est installé, ou rien sinon.
Dans la capture d'écran ci-dessous, le correctif 4012212est installé et 4012215ne l'est pas.

entrez la description de l'image ici

Kevin Cruijssen
la source