GottaFix untuk WannaCrypt?


109

Peringatan

Jawaban untuk tes tantangan ini untuk versi tambalan tertentu yang membantu menghentikan serangan WannaCrypt / WannaCry. Tergantung pada sistem operasi Anda, Anda mungkin memiliki tambalan yang berbeda. Cara terbaik untuk melindungi diri sendiri adalah memastikan PC Anda sepenuhnya mutakhir dan berhati-hati saat membuka lampiran dan tautan web.


pengantar

Saya suka berpikir programmer pada dasarnya adalah orang-orang yang baik, bahkan jika beberapa tidak begitu baik , jadi mari kita bantu orang memastikan mereka dilindungi dengan patch MS17-010 .

Tantangan

Tantangan Anda adalah menulis program atau fungsi lengkap yang mengembalikan nilai kebenaran atau kesalahan tergantung pada apakah patch MS17-010 diinstal pada sistem operasi saat ini.

Masukan dan keluaran

Input: Tidak perlu input

Output: Nilai truthy atau falsey (Tunjukkan yang digunakan untuk setiap kasus). Kesalahan / pengecualian dapat dianggap sebagai nilai falsey.

Aturan

  • Kode Anda harus berjalan (dan menampilkan dengan benar) pada setidaknya satu sistem operasi windows yang tambalannya tersedia, tetapi tidak harus berjalan di setiap sistem operasi (sebutkan batasannya).
  • Celah standar berlaku
  • Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

3
Hmm, satu pertanyaan .. Mengenai nilai kebenaran / falsey, apakah kesalahan diperbolehkan sebagai nilai falsey, dan kebenaran sebagai pengembalian aktual, atau tidakkah ini diizinkan?
Kevin Cruijssen

3
@KevinCruijssen Saya senang menganggap kesalahan sebagai nilai palsu. Saya pikir itu adalah indikator yang jelas bahwa tambalan tidak diinstal.
Notts90

12
Jika pengguna melewatkan tambalan ini tetapi menginstal tambalan yang lebih baru, mereka akan tetap dilindungi sehingga ini dapat memberikan negatif palsu untuk beberapa pengguna.
Ian Miller

2
@MichealJohnson tidak yakin sebaiknya mendorong orang mengirim kode yang menunjukkan cara mengeksploitasi kerentanan.
Notts90

7
Apakah infeksi pada komputer host nilai falsey yang valid? Jelas akan menjelaskan maksudnya
Nic Robertson

Jawaban:


158

PowerShell 2.0, 24 20 16 byte

hotfix KB4012212

-4 byte terima kasih kepada @ apa pun dengan menghapus -id.
-4 byte terima kasih kepada @ DankoDurbić dengan mengubah get-hotfixke hotfix.

KB4012212adalah patch untuk Windows 7. Ini dapat diganti dengan kode KB apa pun dari halaman tertaut patch .

Akan mengembalikan informasi Sumber , Deskripsi , HotFixID , InstalledBy , dan InstalledOn ketika diinstal sebagai nilai yang benar, dan akan memberikan kesalahan jika tidak dapat menemukannya sebagai nilai falsey.

Berikut ini adalah contoh dari output yang benar dan salah (jadi KB4012212diinstal pada mesin saya, tetapi KB4012215tidak):

masukkan deskripsi gambar di sini


82
jawaban pada PPCG yang sebenarnya berguna untuk tujuan praktis? Saya terkesan.
John Dvorak

1
Anda tidak perlu menentukan id Get-HotFix KB4012212akan berfungsi juga. (Diuji hanya dengan PSv4). Tapi saya setuju dengan Jan Dvorak, saya tidak berpikir hasilnya sesuai dengan tantangan.
apapun

6
Tidak berfungsi jika Anda sudah berada di roll-up bulanan berikutnya atau kemudian, karena mereka saling menggantikan.
Sumyrda

6
@ Notts90 Ya, komentar ini dimaksudkan sebagai petunjuk bagi orang yang mencoba kode dan mendapatkan negatif palsu.
Sumyrda

10
Cukup hotfix KB4012212sudah. Di Powershell Anda tidak perlu menulis get-.
Danko Durbi

43

Batch / Windows CMD, 31 29 28 23 byte

wmic qfe|find "4012212"

-1 byte terima kasih kepada @SteveFest dengan mengubah findstr 4012212ke find "4012212".
-5 byte terima kasih kepada @BassdropCumberwubwubwub dengan menghapus list.

Penjelasan:

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

Keluarkan beberapa info tambalan jika diinstal, atau tidak sama sekali.
Pada tangkapan layar di bawah ini, tambalan 4012212diinstal, dan 4012215tidak.

masukkan deskripsi gambar di sini


5
ini akan menjadi masalah setelah pembaruan 40 juta bergulir
John Dvorak

1
gunakan findalih-alih findstr, menghemat 3 byte
stevefestl

2
Tidak berfungsi jika Anda sudah berada di roll-up bulanan berikutnya atau kemudian, karena mereka saling menggantikan.
Sumyrda

2
@Sumyrda tantangannya adalah untuk memeriksa patch spesifik ini, itu tidak harus memeriksa patch pengganti.
Notts90

1
find "4012212"juga bekerja untuk -1 byte, wmic qfe|find "4012212"tampaknya berfungsi juga, tetapi mungkin saya kehilangan sesuatu di sana?
Bassdrop Cumberwubwubwub

20

Bash + Cygwin (Atau WSL), 21 byte

Jawaban ini sebagian besar dicuri dari jawaban Kevin . Jadi, lemparkan upvote dengan cara itu juga jika Anda pikir ini pantas dilakukan.

wmic qfe|grep 4012212

Cygwin memiliki akses ke perintah Windows selain coreutils. Kami dapat menggunakan coreutils grepalih - alih Windows findsehingga kami tidak perlu menggunakan tanda kutip. 2 byte disimpan karena ini.


1
Oh, ya, itu lebih pendek dari milikku; Saya tidak memilih pengguna MS yang baik untuk mencuri!
Aaron

2
Seseorang mengedit ini untuk memasukkan "Atau WSL" yang saya kira benar tetapi Anda harus memodifikasi path terlebih dahulu.
Kapten 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 berkat @KevinCruijssen menghapus spasi putih dan mengganti benar dan salah dengan 1 dan 0.

-5 byte berkat @KevinCruijssen memperpendek nama variabel

Jelas tidak akan memenangkan hadiah apa pun, tetapi skrip powershell ini akan memeriksa log riwayat Pembaruan Microsoft untuk KB4013429 (salah satu tambalan yang tercantum pada tautan ) dapat diganti dengan tambalan mana pun. Saya pikir saya akan mempostingnya karena sedikit lebih dapat diandalkan jika tambalan telah diganti dengan yang lebih baru.


13
Hai, selamat datang di PPCG! :) Karena pertanyaan ini ditandai dengan kode-golf, idenya adalah menyelesaikan tantangan dalam sesedikit mungkin byte. Saya tahu jawaban Anda mungkin tidak akan menang, dan Anda telah menggunakan metode yang lebih lengkap daripada yang saya lakukan, tetapi Anda masih dapat golf jawaban Anda saat ini dengan menghapus spasi putih yang tidak perlu, dan menggunakan 1/ 0bukannya true/ false. Seperti ini: $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, dan satu hal lagi yang bisa Anda mainkan di golf yang hanya saya perhatikan sekarang: Yang terbaik adalah selalu menggunakan variabel-karakter / metode / nama kelas tunggal. Jadi Anda dapat mengubah Hcto Hdan Seto T(atau huruf tunggal selain Hatau Syang sudah Anda gunakan) untuk menyimpan 5 byte lainnya. :)
Kevin Cruijssen

2
Tidak bisakah Anda lulus $H langsung daripada menyimpannya? Juga %{ }dan ?{ }bukannya ForEach-Objectdan if. Cukup yakin Anda hanya bisa menampilkan ke saluran daripada gema karena Anda hanya harus memiliki satu hasil pertandingan dan saya pikir itu akan dihitung sebagai kebenaran berdasarkan OP
pinkfloydx33

16

C #, 178 143 141 134 byte

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

Mengkompilasi ke Func<int, bool>tempat input tidak digunakan.

Disimpan 35 byte dengan bantuan @Ryan
Disimpan 2 byte berkat @KevinCruijssen
Disimpan 7 byte berkat @ErikKarlsson

Versi yang diformat:

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

tidak if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;sama dengan return h["HotFixID"]=="KB4012212"?
Julian Wolf

@JulianWolf Tidak karena yang terakhir hanya akan memeriksa item pertama yang kembali sedangkan yang sebelumnya memeriksa setiap iterasi.
TheLethalCoder

1
Bisakah Anda menambahkan klausa di mana dalam kueri ManagementObjectSearcher dan menambahkan klausa di countakhir .get()? Seperti ini: _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Untuk menghemat 4 byte
Ryan

5
+1 Karena tidak menggunakan bahasa skrip shell.
Hjulle

2
Erik Karlsson (yang tidak memiliki cukup tenaga untuk mengomentari) disarankan dalam edit untuk menyimpan 7 byte dengan mengganti SELECT HotFixIDdengan SELECT *.
Martin Ender

14

Cygwin, 31 byte

Hanya untuk memainkan pemberontak

grep KB4012212 "$WINDIR"/*e.log

kode pengembalian akan menjadi 0 jika tambalan telah diterapkan, atau 1 jika belum.

Diuji di bawah Windows 7 dengan Cygwin 2.6.0


Apakah ini akan berhasil jika Anda menghapus KB?
TheLethalCoder

@ TheLethalCoder Saya tidak yakin, dan saya rasa saya tidak bisa mengetahuinya. Jawaban saya berasal dari ryan dan kami berdua mencari teks di WindowsUpdate.log besar yang berisi lebih dari nama KB, saya tidak akan bertaruh angkanya tidak dapat muncul dalam konteks lain
Aaron

Cukup adil saya tidak cukup tahu tentang apa yang sedang Anda lakukan maka pertanyaan itu bukan saran :)
TheLethalCoder

3
Ini akan berfungsi jika Anda menghapus KBkarena agak tidak mungkin 4012212ada di sana selain jalur. Anda juga dapat menyimpan 1 byte jika Anda menghapus hanya K karena Anda tidak akan menemukan B4012212secara acak tanpa path.
Sirene

4
@ Siren Saya tidak yakin tentang pengujian nomor saja, saya akan takut untuk mencocokkan 1) jumlah byte yang ditransfer, 2) pembaruan, melaporkan peristiwa dan UID pekerjaan atau 3) kode kesalahan hex (dan lain-lain). Menghapus hanya yang Kpertama tampaknya masuk akal, tetapi kemudian B...menjadi representasi hex yang valid, membuat tabrakan dengan UID dan kode hex menjadi mungkin
Aaron

12

PowerShell v4, 64 byte

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

Memeriksa semua referensi KB menggunakan RegEx (sekarang Anda memiliki dua masalah)


3
Selamat datang di situs ini! Jawaban pertama yang bagus!
programmer5000

7

Batch / Command Prompt, 27 25 byte

systeminfo|find "4012212"

Jika KB4012212 ditemukan keluaran itu, jika tidak maka tidak ada yang dihasilkan.

Terima kasih kepada @Kevin karena telah menghemat 2 byte :)


1
Saya pikir Anda dapat menghapus spasi di sekitar pipa: systeminfo|find "4012212"untuk -2 byte.
Kevin Cruijssen

5

Powershell 2.0, 142 byte

  • Mengembalikan 0 untuk "false", tidak ditambal "<0 untuk" true ", ditambal.

Di bawah ini berisi semua KB sejak Maret, tetapi kebutuhan diperluas dengan April, Mei KB karena masing-masing menggantikan semua sebelumnya.

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

Saya tidak yakin, tapi saya pikir Anda dapat mengubah (Get-HotFix | whereke (HotFix|where(spasi dihapus, dan Get-dihapus.
Kevin Cruijssen

3

Powershell 5.1 134 Bytes

Sama seperti Mark Pippin tetapi mengubah Get-Hotfix ke Hotfix dan ke mana? menghemat 8 byte

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

Saya tidak bisa mendapatkannya lebih rendah dalam hitungan byte daripada jawaban Kevin


1
Anda dapat menghapus spasi di sekitar pipa: (HotFix|? HotFixID ...untuk -2 byte.
Kevin Cruijssen

2

DISM , 40 byte

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

Penjelasan:

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

Output identitas paket jika itu diinstal, atau tidak ada yang lain.
Pada tangkapan layar di bawah ini, tambalan 4012212diinstal, dan 4012215tidak.

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.