GottaFix para WannaCrypt?

109

Advertencia

Las respuestas a esta prueba de desafío para una versión específica del parche que ayuda a detener los ataques WannaCrypt / WannaCry. Dependiendo de su sistema operativo, puede tener un parche diferente. La mejor manera de protegerse es asegurarse de que su PC esté completamente actualizada y tener cuidado al abrir archivos adjuntos y enlaces web.


Introducción

Me gusta pensar que los programadores son personas inherentemente buenas, incluso si algunos no son tan amables , así que ayudemos a las personas a asegurarse de que estén protegidos con el parche MS17-010 .

Desafío

Su desafío es escribir un programa o función completa que devuelva un valor verdadero o falso dependiendo de si el parche MS17-010 está instalado en el sistema operativo actual.

Entrada y salida

Entrada: no se requiere entrada

Salida: Un valor verdadero o falso (indique cuál se utiliza para cada caso). Un error / excepción puede considerarse un valor falsey.

Reglas

  • Su código debe ejecutarse (y salir correctamente) en al menos un sistema operativo Windows para el que esté disponible el parche, pero no tiene que ejecutarse en todos los sistemas operativos (indique las limitaciones).
  • Se aplican lagunas estándar
  • Este es el , por lo que gana el envío con la menor cantidad de bytes.
Notts90
fuente
3
Hmm, una pregunta ... Con respecto a los valores de verdad / falsey, ¿se permite un error como valor de falsey y la verdad como un retorno real, o no está permitido?
Kevin Cruijssen
3
@KevinCruijssen Estoy feliz de considerar un error como un valor falso. Creo que es un claro indicador de que el parche no está instalado.
Notts90
12
Si los usuarios se perdieron este parche pero instalaron uno posterior, aún estarán protegidos, por lo que esto podría dar un falso negativo para algunos usuarios.
Ian Miller
2
@MichealJohnson no está seguro de que sea aconsejable alentar a las personas a publicar código que demuestre cómo aprovechar la vulnerabilidad.
Notts90
77
¿Es la infección de la PC host un valor de Falsey válido? Obviamente, se entendería
Nic Robertson,

Respuestas:

158

PowerShell 2.0, 24 20 16 bytes

hotfix KB4012212

-4 bytes gracias a @whatever eliminando -id.
-4 bytes gracias a @ DankoDurbić cambiando get-hotfixa hotfix.

KB4012212es el parche para Windows 7. Esto se puede reemplazar con cualquier código KB de la página vinculada del parche .

Devolverá la información de Fuente , Descripción , HotFixID , InstalledBy e InstalledOn cuando se instale como valor verdadero, y dará un error si no puede encontrarlo como valor falsey.

Aquí hay un ejemplo de un resultado verdadero y falso (por lo que KB4012212está instalado en mi máquina, pero KB4012215no lo está):

ingrese la descripción de la imagen aquí

Kevin Cruijssen
fuente
82
¿Una respuesta sobre PPCG que sea realmente útil para fines prácticos? Estoy impresionado.
John Dvorak
1
No necesita especificar que la identificación Get-HotFix KB4012212también funcionará. (Probado solo con PSv4). Pero estoy de acuerdo con Jan Dvorak, no creo que la salida confirme el desafío.
lo que sea
66
No funciona si ya está en el siguiente paquete acumulativo mensual o posterior, porque esos se reemplazan entre sí.
Sumyrda
66
@ Notts90 Sí, el comentario se entiende como una pista para las personas que prueban el código y obtienen un falso negativo.
Sumyrda
10
Solo hotfix KB4012212es suficiente. En Powershell no necesitas escribir get-.
Danko Durbić
43

Lote / Windows CMD, 31 29 28 23 bytes

wmic qfe|find "4012212"

-1 byte gracias a @SteveFest cambiando findstr 4012212a find "4012212".
-5 bytes gracias a @BassdropCumberwubwubwub mediante la eliminación list.

Explicación:

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

Emite alguna información de parche si está instalada, o nada de lo contrario.
En la captura de pantalla a continuación, el parche 4012212está instalado y 4012215no lo está.

ingrese la descripción de la imagen aquí

Kevin Cruijssen
fuente
55
esto se volverá problemático una vez que lleguen 40 millones de actualizaciones
John Dvorak
1
usar en findlugar de findstr, ahorra 3 bytes
stevefestl
2
No funciona si ya está en el siguiente paquete acumulativo mensual o posterior, porque esos se reemplazan entre sí.
Sumyrda
2
@Sumyrda el desafío es verificar este parche específico, no tiene que buscar parches de reemplazo.
Notts90
1
find "4012212"también funciona para -1 byte, wmic qfe|find "4012212"parece funcionar también, pero ¿tal vez me falta algo?
Bassdrop Cumberwubwubwub
20

Bash + Cygwin (o WSL), 21 bytes

Esta respuesta es mayormente robada de la respuesta de Kevin . Así que lanza un voto positivo de esa manera también si crees que se lo merece.

wmic qfe|grep 4012212

Cygwin tiene acceso a los comandos de Windows además de coreutils. Podemos usar coreutils en greplugar de Windows, findpor lo que no necesitamos usar comillas. 2 bytes se guardan debido a esto.

Capitán Hombre
fuente
1
Oh bueno, sí, eso es más corto que el mío; ¡No elegí al buen usuario de MS para robar!
Aaron
2
Alguien editó esto para incluir "O WSL", lo que supongo que es cierto, pero primero tendría que modificar la ruta.
Capitán 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 gracias a @KevinCruijssen eliminando espacios en blanco y reemplazando verdadero y falso con 1 y 0.

-5 bytes gracias a @KevinCruijssen acortando nombres de variables

Obviamente no va a ganar ningún premio, pero este script de PowerShell verificará el registro del historial de Microsoft Update para KB4013429 (uno de los parches enumerados en el enlace ) que se puede reemplazar con cualquiera de los parches. Pensé en publicarlo porque es un poco más confiable si el parche ha sido reemplazado por uno posterior.

Ryan
fuente
13
Hola, bienvenido a PPCG! :) Dado que esta pregunta está etiquetada con code-golf, la idea es completar el desafío en el menor número de bytes posible. Sé que su respuesta probablemente no ganará de todos modos, y ha utilizado un método más completo que yo, pero aún puede jugar golf su respuesta actual eliminando espacios en blanco innecesarios y usar 1/ en 0lugar de true/ false. Así: $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 bytes )
Kevin Cruijssen
2
Ah, y otra cosa que puedes jugar al golf que ahora solo noto: es mejor usar siempre nombres de variables / métodos / clases de un solo carácter. Por lo tanto, puede cambiar el Hcto Hy el Seto T(u otra letra única además Ho Sque ya haya usado) para guardar otros 5 bytes. :)
Kevin Cruijssen
2
¿No puedes pasar $H directamente en lugar de guardarlo? También %{ }y en ?{ }lugar de ForEach-Objecty if. Estoy bastante seguro de que solo puede enviar a la tubería en lugar del eco, ya que solo debería tener una coincidencia de resultados y creo que eso contaría como verdadero según el OP
pinkfloydx33
16

C #, 178 143 141 134 bytes

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

Compila a Func<int, bool>donde la entrada no se utiliza.

Guardado 35 bytes con la ayuda de @Ryan
Guardado 2 bytes gracias a @KevinCruijssen
Guardado 7 bytes gracias a @ErikKarlsson

Versión formateada:

System.Func<int, bool> f = _ =>
    new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'")
                         .Get().Count > 0;
TheLethalCoder
fuente
no es lo if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;mismo que return h["HotFixID"]=="KB4012212"?
Julian Wolf
@JulianWolf No porque este último solo verificaría el primer elemento que vuelve mientras que el primero verifica en cada iteración.
TheLethalCoder
1
¿Podría agregar una cláusula where en la consulta ManagementObjectSearcher y agregar una countal final de la .get()? De esta manera: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Para guardar 4 bytes
Ryan
55
+1 Por no estar en un lenguaje de script de shell.
Hjulle
2
Erik Karlsson (que no tiene suficiente representante para comentar) sugirió en una edición para ahorrar 7 bytes al reemplazar SELECT HotFixIDcon SELECT *.
Martin Ender
14

Cygwin, 31 bytes

Solo para jugar al rebelde

grep KB4012212 "$WINDIR"/*e.log

el código de retorno será 0 si se ha aplicado el parche o 1 si no se ha aplicado.

Probado en Windows 7 con Cygwin 2.6.0

Aaron
fuente
¿Funcionará esto si eliminas el KB?
TheLethalCoder
@TheLethalCoder No estoy seguro, y no creo que pueda averiguarlo. Mi respuesta se deriva de Ryan y ambos buscamos texto en el enorme WindowsUpdate.log que contiene mucho más que los nombres de KB, no apostaría a que el número no puede aparecer en otro contexto
Aaron
Bastante justo, no sabía lo suficiente sobre lo que estaba haciendo el suyo, por lo tanto, la pregunta no es una sugerencia :)
TheLethalCoder
3
Esto debería funcionar si lo elimina, KBya que es bastante improbable que 4012212haya algo más que la ruta. También podría guardar 1 byte si elimina solo la K porque no encontrará B4012212al azar sin la ruta.
Sirenas
44
@Sirenas No estoy seguro de probar solo el número, me temo que coincida con 1) número de bytes transferidos, 2) actualizaciones, informes de eventos y UID de trabajos o 3) códigos de error hexadecimal (y otros). Eliminar solo el Kprimero parece razonable, pero luego se B...convierte en una representación hexadecimal válida, lo que hace posible la colisión con UID y códigos hexadecimales
Aaron
12

PowerShell v4, 64 bytes

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

Comprueba todas las referencias de KB utilizando un RegEx (ahora tiene dos problemas)

MKPhil
fuente
3
Bienvenido al sitio! Buena primera respuesta!
programador
7

Lote / Símbolo del sistema, 27 25 bytes

systeminfo|find "4012212"

Si se encuentra KB4012212, esto no se genera.

Gracias a @Kevin por guardar 2 bytes :)

Jorge
fuente
1
Creo que puede eliminar los espacios alrededor de la tubería: systeminfo|find "4012212"por -2 bytes.
Kevin Cruijssen
5

Powershell 2.0, 142 bytes

  • Devuelve 0 para "falso", no parcheado "<0 para" verdadero ", parcheado.

A continuación contiene todos los KB de marzo, pero las necesidades se expandieron con abril y mayo, ya que cada uno reemplaza a todos los anteriores.

(Get-HotFix | where HotFixID -match "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count
MarkPippin
fuente
No estoy seguro, pero creo que puede cambiar (Get-HotFix | wherea (HotFix|where(espacios eliminados y Get-eliminados.
Kevin Cruijssen
3

Powershell 5.1 134 Bytes

Igual que Mark Pippin pero cambió el Get-Hotfix a Hotfix y ¿hacia dónde? ahorrando 8 bytes

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

No puedo hacerlo más bajo en conteo de bytes que la respuesta de Kevin

Luke
fuente
1
Puede eliminar los espacios alrededor de la tubería: (HotFix|? HotFixID ...por -2 bytes.
Kevin Cruijssen
2

DISM , 40 bytes

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

Explicación:

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

Emite la identidad del paquete si está instalado, o nada de lo contrario.
En la captura de pantalla a continuación, el parche 4012212está instalado y 4012215no lo está.

ingrese la descripción de la imagen aquí

Kevin Cruijssen
fuente