WannaCryptのGottaFix?


109

警告

このチャレンジテストに対する回答は、WannaCrypt / WannaCry攻撃の阻止に役立つパッチの特定のバージョンをテストします。オペレーティングシステムに応じて、異なるパッチが適用される場合があります。自分自身を保護する最善の方法は、PCが完全に最新であることを確認し、添付ファイルとWebリンクを開くときは注意することです。


前書き

プログラマーは本質的に善良な人だと思うのが好きです。たとえ一部の人がそれほど優れていなくてもMS17-010パッチで保護されていることを人々に確認してください

チャレンジ

あなたの課題は、MS17-010パッチが現在のオペレーティングシステムにインストールされているかどうかに応じて、真偽値を返す完全なプログラムまたは関数を作成することです。

入出力

入力:入力不要

出力:真偽値または偽値(それぞれの場合に使用されることを示します)。エラー/例外は偽の値と見なすことができます。

ルール

  • コードは、パッチが利用可能な少なくとも1つのWindowsオペレーティングシステムで実行(および正しく出力)する必要がありますが、すべてのオペレーティングシステムで実行する必要はありません(制限を明記してください)。
  • 標準的な抜け穴が適用されます
  • これはであるため、バイト数が最小の提出が勝ちです!

3
うーん、1つの質問..真実/偽の値に関して、エラーは偽の値として許可され、真実は実際の戻り値として許可されますか、またはこれは許可されませんか?
ケビンCruijssen

3
@KevinCruijssenエラーを誤った値とみなしてうれしいです。パッチがインストールされていないことを明確に示していると思います。
Notts90

12
ユーザーがこのパッチを逃したが、後からパッチをインストールした場合でも保護されるため、一部のユーザーに偽陰性が発生する可能性があります。
イアンミラー

2
@MichealJohnsonは、この脆弱性を悪用する方法を示すコードを投稿することを人々に奨励することが賢明ではないことを確信しています。
Notts90

7
ホストPCの感染は有効な偽の値ですか?それは明らかにポイントを得るだろう
ニックロバートソン

回答:


158

PowerShellの2.0、24の 20、16バイト

hotfix KB4012212

を削除して@whateverに -4バイトを感謝します-id
に変更して、@DankoDurbićに 4バイト感謝します。get-hotfixhotfix

KB4012212これは、Windows 7のパッチです。これは、パッチのリンクされたページの任意のKBコードに置き換えることができます。

返されるソース説明HotFixIDInstalledByInstalledOnそれはtruthy値としてインストールされます際の情報、およびそれがfalsey値としてそれを見つけることができないかどうエラーが発生します。

以下は、真実と偽の両方の出力の例です(KB4012212私のマシンにインストールされていますが、インストールされてKB4012215いません):

ここに画像の説明を入力してください


82
実際の目的に実際に役立つPPCGの答えは?私が感銘を受けた。
ジョンドヴォルザーク

1
IDを指定する必要はありませんGet-HotFix KB4012212。(PSv4でのみテスト済み)。しかし、私はヤン・ドヴォルザークに同意します、私は出力が挑戦を確認するとは思わない。
どんな

6
次またはそれ以降の月次ロールアップに既に参加している場合は、それらが互いに置き換えられるため、機能しません。
スミルダ

6
@ Notts90はい、コメントはコードを試して偽陰性を取得する人々へのヒントとして意図されています。
スミルダ

10
ちょうどhotfix KB4012212十分です。Powershellでは、書く必要はありませんget-
ダンコドゥルビッチ

43

バッチ/ Windows CMD、31 29 28 23バイト

wmic qfe|find "4012212"

-1に変更して@SteveFestに感謝findstr 4012212find "4012212"ます。
を削除して@BassdropCumberwubwubwubに感謝しますlist

説明:

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

インストールされている場合はパッチ情報を出力し、それ以外の場合は何も出力しません。
以下のスクリーンショットでは、パッチ4012212がインストールされていますが、インストールされて4012215いません。

ここに画像の説明を入力してください


5
40Mの更新がロールバックすると問題が発生します
ジョンドヴォルザーク

1
find代わりに使用するとfindstr、3バイト節約されます
-stevefestl

2
次またはそれ以降の月次ロールアップに既に参加している場合は、それらが互いに置き換えられるため、機能しません。
スミルダ

2
@Sumyrdaの課題は、この特定のパッチを確認することです。代替パッチを確認する必要はありません。
Notts90

1
find "4012212"-1バイトでも動作しますが、動作するwmic qfe|find "4012212"ようですが、おそらくそこに何かが欠けていますか?
バスドロップCumberwubwubwub

20

Bash + Cygwin(またはWSL)、21バイト

この回答は、主にケビンの回答から盗まれました。そのため、これに値すると思われる場合にも、そのように賛成票を投げます。

wmic qfe|grep 4012212

Cygwinは、coreutilsに加えてWindowsコマンドにもアクセスできます。grepWindowsではなくcoreutilsを使用できるfindため、引用符を使用する必要はありません。このため、2バイトが保存されます。


1
ええ、それは私のものよりも短いです。盗むのに良いMSユーザーを選択しませんでした!
アーロン

2
誰かがこれを編集して「Or WSL」を含めるようにしましたが、これは正しいと思いますが、最初にパスを変更する必要があります。
キャプテンマン

17

PowerShellの5.1、245の 212 207バイト

$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;

@KevinCruijssenが空白を削除し、trueとfalseを1と0に置き換えたため、-33バイトになりました。

変数名を短縮する@KevinCruijssenのおかげで-5バイト

明らかに賞品を獲得するつもりはありませんが、このPowerShellスクリプトはMicrosoft Updateの履歴ログでKB4013429(リンクにリストされているパッチの1つ)をチェックし、任意のパッチに置き換えることができます。パッチが新しいパッチに置き換えられた場合の方が信頼性が高いため、投稿したいと思いました。


13
こんにちは、PPCGへようこそ!:)この質問にはcode-golfというタグが付けられているため、アイデアはできる限り少ないバイトでチャレンジを完了することです。私はあなたの答えは、おそらく、とにかく勝てないことを知っている、とあなたは私がやったよりも、より完全な方法を使用しましたが、あなたはゴルフの不要な空白を削除することによって、あなたの現在の答えをまだすることができ、かつ使用1/ 0の代わりにtrue/ false。このように:$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バイト
ケビンクルーッセン

2
ああ、もう1つ気づいたのは、今だけ気づいたゴルフです。常に1文字の変数/メソッド/クラス名を使用するのが最善です。だから、変更することができますHcHしてSeまでT(または他のシングル以外の文字HまたはS他の5つのバイトを保存するためにどのあなたは既に使用されてきました)。:)
ケビンクルーッセン

2
$H 保管する代わりに直接渡すことはできません か?また、%{ }?{ }の代わりに、ForEach-Objectif。かなり確信してあなたが唯一の1つの結果が一致していなければならないと私はそれがOPに基づいとしてtruthyカウントだと思うので、単にパイプラインへの出力ではなく、エコーすることができます
pinkfloydx33

16

C位、178の 143 141 134バイト

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

Func<int, bool>入力が使用されていない場所にコンパイルします。

@Ryanの助けを借りて35バイトを
保存@KevinCruijssenのおかげで2バイトを
保存@ErikKarlssonのおかげで7バイトを保存

フォーマット済みバージョン:

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

if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;同じではありませんreturn h["HotFixID"]=="KB4012212"か?
ジュリアンウルフ

@JulianWolfノー
TheLethalCoder

1
ManagementObjectSearcherクエリにwhere句を追加countし、最後にを追加できます.get()か?このように_=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};。4バイトを保存するには
ライアン

5
+1シェルスクリプト言語ではないため。
ユール

2
Erik Karlsson(コメントするのに十分な担当者がいない)は、で置き換えることSELECT HotFixIDで7バイトを節約するために編集で提案しましたSELECT *
マーティンエンダー

14

Cygwin、31バイト

反逆者を演じるだけ

grep KB4012212 "$WINDIR"/*e.log

パッチが適用されている場合、戻りコードは0、適用されていない場合は1になります。

Cygwin 2.6.0を使用してWindows 7でテスト済み


を削除するとこれは機能しますKBか?
TheLethalCoder

@TheLethalCoderよくわかりません。見つけられるとは思いません。私の答えは由来しているライアンの、我々はKB名よりもはるかに多く含まれている巨大なWindowsUpdate.logの両方の検索テキストは、私は番号が別のコンテキストで表示することはできません賭けではないでしょう
アーロン

私はあなたがそれ故に問題ではないの提案:)何をしていたかについて十分に知りませんでした十分なフェア
TheLethalCoder

3
これは、パス以外に存在するKB可能性はかなり低いため、削除しても機能するはずです4012212。Kだけを削除した場合B4012212も、パスなしではランダムに検索されないため、1バイトを節約できます。
サイレン

4
@Sirens 1)転送されたバイト数、2)更新、イベントおよびジョブUIDのレポート、3)16進エラー(およびその他)コードと一致することを恐れています。K最初の1つだけを削除するのは理にかなっているように見えB...ますが、有効な16進表現になり、UIDおよび16進コードとの衝突が可能になります
アーロン

12

PowerShell v4、64バイト

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

RegExを使用してすべてのKB参照を確認します(2つの問題があります)


3
サイトへようこそ!素敵な最初の答え!
Programmer5000

7

バッチ/コマンドプロンプト、27 25バイト

systeminfo|find "4012212"

KB4012212が出力を検出した場合、それ以外の場合は何も出力されません。

2バイトを保存してくれた@Kevinに感謝します:)


1
パイプの周りのスペースを削除できると思います:systeminfo|find "4012212"-2バイト。
ケビンCruijssen

5

Powershell 2.0、142バイト

  • パッチが適用されていない「false」の場合は0を返し、パッチが適用されている「true」の場合は0を返します。

以下に3月からのすべてのKBが含まれていますが、それぞれが以前のすべてに取って代わるため、4月、5月にKBが拡張されました。

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

私はわからないんだけど、私はあなたが変えることができると思う(Get-HotFix | where(HotFix|where(スペース削除、およびGet-削除。
ケビンCruijssen

3

Powershell 5.1 134バイト

Mark Pippin'sと同じですが、Get-HotfixをHotfixに変更し、どこに?8バイト節約

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

ケビンの答えよりもバイト数を少なくすることはできません


1
パイプの周囲のスペースを削除でき(HotFix|? HotFixID ...ます:-2バイト。
ケビンCruijssen

2

DISM、40バイト

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

説明:

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

パッケージIDがインストールされている場合は出力し、それ以外の場合は出力しません。
以下のスクリーンショットでは、パッチ4012212がインストールされていますが、インストールされて4012215いません。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.