GottaFix para WannaCrypt?

109

Aviso

As respostas para este desafio testam uma versão específica do patch que ajuda a interromper os ataques WannaCrypt / WannaCry. Dependendo do seu sistema operacional, você pode ter um patch diferente. A melhor maneira de se proteger é garantir que seu PC esteja totalmente atualizado e ter cuidado ao abrir anexos e links da web.


Introdução

Eu gosto de pensar que os programadores são inerentemente boas pessoas, mesmo que alguns não sejam tão legais , então vamos ajudar as pessoas a garantir que estejam protegidas com o patch MS17-010 .

Desafio

Seu desafio é escrever um programa ou função completo que retorne um valor de verdade ou falsey, dependendo se o patch MS17-010 estiver instalado no sistema operacional atual.

Entrada e saída

Entrada: Nenhuma entrada necessária

Saída: um valor de verdade ou falsey (indique qual é usado para cada caso). Um erro / exceção pode ser considerado um valor falsey.

Regras

  • Seu código deve ser executado (e gerado corretamente) em pelo menos um sistema operacional Windows para o qual o patch está disponível, mas não precisa ser executado em todos os sistemas operacionais (indique quaisquer limitações).
  • Aplicam-se brechas padrão
  • Isso é , então a submissão com a menor quantidade de bytes ganha!
Notts90
fonte
3
Hmm, uma pergunta. Em relação aos valores de verdade / falsey, um erro é permitido como valor de falsey e verdade como um retorno real, ou isso não é permitido?
Kevin Cruijssen
3
@KevinCruijssen Estou feliz em considerar um erro como um valor falso. Eu acho que é um indicador claro de que o patch não está instalado.
Notts90
12
Se os usuários perderem esse patch, mas instalarem um posterior, eles ainda estarão protegidos, o que pode gerar um falso negativo para alguns usuários.
Ian Miller
2
@MichealJohnson não tem certeza de que é aconselhável incentivar as pessoas a postar código demonstrando como explorar a vulnerabilidade.
Notts90
7
A infecção do PC host é um valor válido de falsey? Obviamente, isso iria esclarecer tudo
Nic Robertson

Respostas:

158

PowerShell 2.0, 24 20 16 bytes

hotfix KB4012212

-4 bytes graças a @whatever removendo -id.
-4 bytes graças a @ DankoDurbić mudando get-hotfixpara hotfix.

KB4012212é o patch para Windows 7. Isso pode ser substituído por qualquer código KB da página vinculada do patch .

Retornará as informações Source , Description , HotFixID , InstalledBy e InstalledOn quando instaladas como valor de verdade e causará um erro se não conseguir encontrá-lo como valor falsey.

Aqui está um exemplo de uma saída truthy e falsey (por isso KB4012212é instalada na minha máquina, mas KB4012215não é):

insira a descrição da imagem aqui

Kevin Cruijssen
fonte
82
uma resposta sobre PPCG que é realmente útil para fins práticos? Estou impressionado.
John Dvorak
1
Você não precisa especificar o ID Get-HotFix KB4012212também funcionará. (Testado apenas com PSv4). Mas eu concordo com Jan Dvorak, não acho que a saída confirme o desafio.
seja qual for
6
Não funciona se você já estiver no próximo ou posterior roll-up mensal, porque eles se substituem.
Sumyrda 16/05
6
@ Notts90 Sim, o comentário pretende ser uma dica para quem tenta o código e recebe um falso negativo.
Sumyrda 16/05/19
10
Apenas hotfix KB4012212é suficiente. No Powershell, você não precisa escrever get-.
Danko Durbić
43

Lote / Windows CMD, 31 29 28 23 bytes

wmic qfe|find "4012212"

-1 byte graças a @SteveFest , alterando findstr 4012212para find "4012212".
-5 bytes graças a @BassdropCumberwubwubwub removendo list.

Explicação:

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

Produz algumas informações de patch, se estiverem instaladas, ou nada do contrário.
Na captura de tela abaixo, o patch 4012212está instalado e 4012215não está.

insira a descrição da imagem aqui

Kevin Cruijssen
fonte
5
isso vai ficar problemático, uma vez atualizações 40M rola ao redor
John Dvorak
1
usar find, em vez de findstr, ele salva 3 bytes
stevefestl
2
Não funciona se você já estiver no próximo ou posterior roll-up mensal, porque eles se substituem.
Sumyrda 16/05
2
@ Sumum, o desafio é verificar esse patch específico, ele não precisa verificar se há patches de substituição.
Notts90
1
find "4012212"também funciona para -1 byte, wmic qfe|find "4012212"parece funcionar também, mas talvez eu esteja faltando alguma coisa lá?
Bassdrop Cumberwubwubwub
20

Bash + Cygwin (ou WSL), 21 bytes

Essa resposta é principalmente roubada da resposta de Kevin . Portanto, jogue um voto positivo dessa maneira também se você acha que isso merece um.

wmic qfe|grep 4012212

O Cygwin tem acesso aos comandos do Windows, além dos coreutils. Podemos usar coreutils em grepvez de Windows, findportanto não precisamos usar aspas. 2 bytes são salvos por causa disso.

Capitão Homem
fonte
1
Oh bem, sim, isso é mais curto que o meu; Não escolhi o bom usuário de MS para roubar!
Aaron
2
Alguém editou isso para incluir "Ou WSL", que eu acho que é verdade, mas você teria que modificar o caminho primeiro.
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 graças a @KevinCruijssen removendo o espaço em branco e substituindo true e false por 1 e 0.

-5 bytes graças a @KevinCruijssen, abreviando nomes de variáveis

Obviamente, você não ganhará nenhum prêmio, mas esse script do PowerShell verificará o log de histórico do Microsoft Update para KB4013429 (um dos patches listados no link ) e pode ser substituído por qualquer um dos patches. Pensei em publicá-lo porque é um pouco mais confiável se o patch for substituído por um posterior.

Ryan
fonte
13
Olá, seja bem-vindo ao PPCG! :) Como essa pergunta está marcada como code-golf, a idéia é concluir o desafio no menor número de bytes possível. Sei que sua resposta provavelmente não vai ganhar de qualquer maneira, e você usou um método mais completo do que eu, mas ainda pode obter sua resposta atual removendo espaços em branco desnecessários e usar 1/ em 0vez de true/ false. Assim: $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 16/05
2
Ah, e outra coisa que você pode jogar golfe, que eu só noto agora: é melhor sempre usar nomes de variável / método / classe de caractere único. Assim, você pode alterar Hcpara He Separa T(ou outra letra única além Hou Sque você já usou) para salvar outros 5 bytes. :)
Kevin Cruijssen
2
Você não pode passar $H diretamente em vez de armazenar? Também %{ }e em ?{ }vez de ForEach-Objecte if. Certeza que você pode simplesmente enviado para o pipeline em vez do eco desde que você deve ter apenas uma partida resultado e acho que isso contaria como truthy baseado no OP
pinkfloydx33
16

C #, 178 143 141 134 bytes

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

Compila para um local Func<int, bool>onde a entrada não é utilizada.

Economizou 35 bytes com a ajuda de @Ryan
Economizou 2 bytes graças a @KevinCruijssen
Economizou 7 bytes graças a @ErikKarlsson

Versão formatada:

System.Func<int, bool> f = _ =>
    new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'")
                         .Get().Count > 0;
TheLethalCoder
fonte
não é if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;o mesmo que return h["HotFixID"]=="KB4012212"?
Julian Wolf
@ JulianWolf Não, porque o último verifica apenas o primeiro item que volta, enquanto o anterior verifica cada iteração.
TheLethalCoder
1
Você poderia adicionar uma cláusula where na consulta ManagementObjectSearcher e adicionar uma countno final da .get()? Como esta: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Para salvar 4 bytes
Ryan
5
+1 por não estar em uma linguagem de script de shell.
Hjulle 18/05/19
2
Erik Karlsson (que não tem representante suficiente para comentar) sugeriu em uma edição para economizar 7 bytes substituindo SELECT HotFixIDpor SELECT *.
Martin Ender
14

Cygwin, 31 bytes

Apenas para bancar o rebelde

grep KB4012212 "$WINDIR"/*e.log

o código de retorno será 0 se o patch foi aplicado ou 1 se não tiver sido.

Testado no Windows 7 com Cygwin 2.6.0

Aaron
fonte
Isso funcionará se você remover o KB?
TheLethalCoder
@TheLethalCoder Não tenho certeza e acho que não consigo descobrir. Minha resposta é derivado de Ryan e ambos texto da busca no enorme WindowsUpdate.log que contém muito mais do que os nomes KB, eu não apostaria o número não pode aparecer em outro contexto
Aaron
Fair suficiente Eu não sabia o suficiente sobre o que o seu estava fazendo, portanto, a questão não uma sugestão :)
TheLethalCoder
3
Isso deve funcionar se você remover, KBpois é improvável que 4012212exista algo além do caminho. Você também pode economizar 1 byte se remover apenas o K, porque você não encontrará B4012212aleatoriamente sem o caminho.
Sirens
4
@ Sirenes Não estou confiante em testar apenas o número, teria medo de corresponder 1) número de bytes transferidos, 2) atualizações, relatar eventos e trabalhos UIDs ou 3) códigos de erro hexadecimal (e outros). Removendo apenas o Kprimeiro parece razoável, mas depois B...se torna uma representação hexadecimal válido, fazendo colisão com UIDs e códigos hexadecimais possível
Aaron
12

PowerShell v4, 64 bytes

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

Verifica todas as referências de KB usando um RegEx (agora você tem dois problemas)

MKPhil
fonte
3
Bem vindo ao site! Ótima primeira resposta!
Programmer5000 #:
7

Lote / prompt de comando, 27 25 bytes

systeminfo|find "4012212"

Se for encontrado KB4012212, é gerado um resultado que, caso contrário, nada é gerado.

Obrigado a @ Kevin por salvar 2 bytes :)

George
fonte
1
Eu acho que você pode remover os espaços ao redor do tubo: systeminfo|find "4012212"para -2 bytes.
Kevin Cruijssen
5

Powershell 2.0, 142 bytes

  • Retorna 0 para "false", não corrigido "<0 para" true ", corrigido.

Abaixo, contém todos os KBs de março, mas as necessidades foram expandidas com abril e maio de KB, pois cada um substitui todos os anteriores.

(Get-HotFix | where HotFixID -match "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count
MarkPippin
fonte
Não tenho certeza, mas acho que você pode mudar (Get-HotFix | wherepara (HotFix|where(espaços removidos e Get-removidos.)
Kevin Cruijssen 18/17
3

Powershell 5,1 134 bytes

O mesmo que Mark Pippin, mas mudou o Get-Hotfix para Hotfix e para onde? economizando 8 bytes

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

Não consigo diminuir a contagem de bytes do que a resposta de Kevin

Lucas
fonte
1
Você pode remover os espaços ao redor do pipe: (HotFix|? HotFixID ...para -2 bytes.
Kevin Cruijssen
2

DISM , 40 bytes

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

Explicação:

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

Produz a identidade do pacote, se estiver instalado, ou nada diferente.
Na captura de tela abaixo, o patch 4012212está instalado e 4012215não está.

insira a descrição da imagem aqui

Kevin Cruijssen
fonte