GottaFix สำหรับ WannaCrypt?


109

การเตือน

คำตอบสำหรับการทดสอบความท้าทายนี้สำหรับแพทช์รุ่นที่ระบุที่ช่วยหยุดการโจมตี WannaCrypt / WannaCry ขึ้นอยู่กับระบบปฏิบัติการของคุณคุณอาจมีโปรแกรมแก้ไขที่แตกต่างกัน วิธีที่ดีที่สุดในการป้องกันตัวเองคือการทำให้พีซีของคุณทันสมัยและระมัดระวังเมื่อเปิดสิ่งที่แนบมาและเว็บลิงค์


บทนำ

ผมชอบที่จะคิดว่าการเขียนโปรแกรมเป็นคนดีโดยเนื้อแท้แม้ว่าบางคนไม่ดีดังนั้นจึงช่วยให้ความช่วยเหลือผู้คนให้แน่ใจว่าพวกเขาได้รับความคุ้มครองกับแพทช์ MS17-010

ท้าทาย

ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่ส่งกลับค่าความจริงหรือความเท็จโดยขึ้นอยู่กับว่ามีการติดตั้งแพตช์ MS17-010 บนระบบปฏิบัติการปัจจุบันหรือไม่

อินพุตและเอาต์พุต

อินพุต: ไม่จำเป็นต้องป้อนข้อมูล

เอาท์พุท: ความจริงหรือค่าเท็จ (ระบุซึ่งใช้สำหรับแต่ละกรณี) ข้อผิดพลาด / ข้อยกเว้นถือได้ว่าเป็นค่าเท็จ

กฎระเบียบ

  • รหัสของคุณควรทำงาน (และส่งออกอย่างถูกต้อง) ในระบบปฏิบัติการ windows อย่างน้อยหนึ่งระบบที่มีโปรแกรมแก้ไข แต่ไม่จำเป็นต้องทำงานในทุกระบบปฏิบัติการ (โปรดระบุข้อ จำกัด ใด ๆ )
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

3
อืมคำถามหนึ่งข้อ .. เกี่ยวกับค่าความจริง / เท็จเป็นข้อผิดพลาดที่อนุญาตให้เป็นค่าเท็จและความจริงเป็นการคืนจริงหรือไม่อนุญาตหรือไม่
Kevin Cruijssen

3
@KevinCruijssen ฉันยินดีที่จะพิจารณาข้อผิดพลาดเป็นค่าเท็จ ฉันคิดว่ามันเป็นตัวบ่งชี้ที่ชัดเจนว่าแพทช์ไม่ได้ติดตั้ง
Notts90

12
หากผู้ใช้พลาดแพตช์นี้ แต่ติดตั้งในภายหลังพวกเขาจะยังคงได้รับการปกป้องดังนั้นนี่อาจเป็นผลลบที่ผิดพลาดสำหรับผู้ใช้บางคน
เอียนมิลเลอร์

2
@MichealJohnson ไม่แน่ใจว่าเป็นการฉลาดที่จะแนะนำให้คนโพสต์รหัสแสดงวิธีการใช้ประโยชน์จากช่องโหว่นี้
Notts90

7
การติดเชื้อของโฮสต์พีซีเป็นค่าที่ถูกต้องหรือไม่ เห็นได้ชัดว่ามันจะได้คะแนน
Nic Robertson

คำตอบ:


158

PowerShell 2.0, 24 20 16 ไบต์

hotfix KB4012212

-4 ไบต์ขอบคุณที่@whatever-idโดยการเอา
-4 ไบต์ขอบคุณที่@ DankoDurbićโดยการเปลี่ยนไปget-hotfixhotfix

KB4012212เป็นแพทช์สำหรับ Windows 7 นี้สามารถถูกแทนที่ด้วยใด ๆ KB-โค้ดจากหน้าเชื่อมโยงของแพทช์

จะกลับมา , คำอธิบาย , HotFixID , InstalledByและInstalledOnข้อมูลเมื่อมีการติดตั้งเป็นค่า truthy และจะให้ข้อผิดพลาดถ้ามันไม่สามารถที่จะพบว่ามันเป็นค่า falsey

นี่คือตัวอย่างของทั้งเอาต์พุตที่เป็นจริงและเท็จ ( KB4012212ติดตั้งบนเครื่องของฉัน แต่KB4012215ไม่ใช่):

ป้อนคำอธิบายรูปภาพที่นี่


82
คำตอบสำหรับ PPCG ที่จริงมีประโยชน์สำหรับการใช้งานจริง? ฉันประทับใจ.
John Dvorak

1
คุณไม่จำเป็นต้องระบุรหัสGet-HotFix KB4012212จะใช้งานได้เช่นกัน (ทดสอบกับ PSv4 เท่านั้น) แต่ฉันเห็นด้วยกับ Jan Dvorak ฉันไม่คิดว่าผลลัพธ์จะยืนยันความท้าทาย
อะไรก็ได้

6
ใช้งานไม่ได้หากคุณอยู่ในการสะสมรายเดือนครั้งถัดไปหรือหลังจากนั้นเพราะสิ่งเหล่านี้จะมาแทนที่กัน
Sumyrda

6
@ Notts90 ใช่ความคิดเห็นนั้นมีความหมายว่าเป็นคำแนะนำสำหรับผู้ที่ลองใช้รหัสและได้รับผลลบที่ผิดพลาด
Sumyrda

10
เพียงแค่hotfix KB4012212เป็นพอ ใน Powershell get-คุณไม่จำเป็นต้องเขียน
Danko Durbić

43

Batch / Windows CMD, 31 29 28 23 ไบต์

wmic qfe|find "4012212"

-1 ไบต์ขอบคุณที่@SteveFestโดยการเปลี่ยนไปfindstr 4012212 -5 ไบต์ขอบคุณที่@BassdropCumberwubwubwubโดยการเอาfind "4012212"
list

คำอธิบาย:

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

ส่งออกข้อมูลแพทช์บางส่วนถ้าติดตั้งหรือไม่มีอะไรอื่น
ในภาพหน้าจอด้านล่าง4012212ติดตั้งโปรแกรมแก้ไขแล้วและ4012215ไม่ใช่

ป้อนคำอธิบายรูปภาพที่นี่


5
สิ่งนี้จะได้รับปัญหาเมื่อมีการอัปเดต 40 ล้านครั้ง
John Dvorak

1
ใช้findแทนfindstrจะช่วยประหยัด 3 ไบต์
stevefestl

2
ใช้งานไม่ได้หากคุณอยู่ในการสะสมรายเดือนครั้งถัดไปหรือหลังจากนั้นเพราะสิ่งเหล่านี้จะมาแทนที่กัน
Sumyrda

2
@Sumyrda ความท้าทายคือการตรวจสอบหา Patch นี้โดยเฉพาะมันไม่จำเป็นต้องตรวจสอบหา Patch แทนที่
Notts90

1
find "4012212"ยังใช้งานได้กับ -1 ไบต์wmic qfe|find "4012212"ดูเหมือนว่าจะทำงานด้วย แต่ฉันอาจจะพลาดบางอย่างที่นั่น
Bassdrop Cumberwubwubwub

20

Bash + Cygwin (หรือ WSL), 21 ไบต์

คำตอบนี้ถูกขโมยส่วนใหญ่มาจากเควินคำตอบ ดังนั้นจงโยน upvote ด้วยวิธีนี้ถ้าคุณคิดว่ามันสมควร

wmic qfe|grep 4012212

Cygwin สามารถเข้าถึงคำสั่ง Windows นอกเหนือจาก coreutils เราสามารถใช้ coreutils grepแทน Windows findดังนั้นเราไม่จำเป็นต้องใช้เครื่องหมายคำพูด 2 ไบต์ถูกบันทึกไว้เนื่องจากสิ่งนี้


1
โอ้ใช่สั้นกว่าของฉัน; ฉันไม่ได้เลือกผู้ใช้ MS ที่ดีที่จะขโมยจาก!
แอรอน

2
มีคนแก้ไขสิ่งนี้เพื่อรวม "หรือ WSL" ซึ่งฉันคิดว่าเป็นความจริง แต่คุณต้องแก้ไขเส้นทางก่อน
Captain Man

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;

-33 ไบต์ขอบคุณ @KevinCruijssen ลบ white space และแทนที่ true และ false ด้วย 1 และ 0

-5 ไบต์ขอบคุณ @KevinCruijssen การย่อชื่อตัวแปร

เห็นได้ชัดว่าจะไม่ชนะรางวัลใด ๆ แต่สคริปต์ PowerShell นี้จะตรวจสอบบันทึกประวัติการใช้งานของ Microsoft Update สำหรับ KB4013429 (หนึ่งในโปรแกรมแก้ไขที่มีอยู่ในลิงค์ ) ซึ่งสามารถแทนที่ได้ด้วยโปรแกรมแก้ไขใด ๆ คิดว่าฉันจะโพสต์เพราะน่าเชื่อถือมากขึ้นถ้าแพทช์ถูกแทนที่ด้วยภายหลัง


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 bytes )
Kevin Cruijssen

2
โอ้และอีกสิ่งหนึ่งที่คุณสามารถเล่นกอล์ฟได้ซึ่งฉันเพิ่งสังเกตเห็นตอนนี้: ควรใช้ชื่อตัวแปร / วิธี / คลาสเดียวเสมอ เพื่อให้คุณสามารถเปลี่ยนHcไปHและSeไปT(หรืออื่นนอกเหนือจากตัวอักษรเดียวHหรือSที่คุณใช้อยู่แล้ว) เพื่อประหยัดอีก 5 ไบต์ :)
Kevin Cruijssen

2
คุณไม่สามารถส่งผ่าน $H โดยตรงแทนที่จะเก็บไว้ใช่ไหม นอกจากนี้%{ }และ?{ }แทนและForEach-Object ifค่อนข้างแน่ใจว่าคุณสามารถส่งออกไปป์ไลน์มากกว่า echo เนื่องจากคุณควรจะมีผลลัพธ์เดียวและฉันคิดว่ามันจะนับเป็นความจริงตาม OP
pinkfloydx33

16

C #, 178 143 141 134 ไบต์

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

คอมไพล์ไปยังFunc<int, bool>ตำแหน่งที่ไม่ได้ใช้อินพุต

บันทึก 35 ไบต์ด้วยความช่วยเหลือของ @Ryan
Saved 2 ไบต์ขอบคุณ @KevinCruijssen
บันทึกแล้ว 7 ไบต์ขอบคุณ @ErikKarlsson

เวอร์ชันที่จัดรูปแบบ:

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"หรือ
Julian Wolf

@JulianWolf ไม่เพราะหลังจะตรวจสอบเฉพาะรายการแรกที่กลับมาในขณะที่อดีตตรวจสอบซ้ำแต่ละครั้ง
TheLethalCoder

1
คุณสามารถเพิ่มส่วนคำสั่ง where ในแบบสอบถาม ManagementObjectSearcher และเพิ่ม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 ไบต์
Ryan

5
+1 สำหรับการไม่อยู่ในภาษาสคริปต์เชลล์
Hjulle

2
เอริคคาร์ลสัน (ที่ไม่ได้มีตัวแทนพอที่จะแสดงความคิดเห็น) ปัญหาในการแก้ไขเพื่อประหยัด 7 ไบต์โดยการแทนที่ด้วยSELECT HotFixID SELECT *
Martin Ender

14

Cygwin, 31 ไบต์

เพียงเพื่อเล่นกบฏ

grep KB4012212 "$WINDIR"/*e.log

รหัสส่งคืนจะเป็น 0 หากมีการใช้งานโปรแกรมแก้ไขหรือ 1 ถ้าไม่มี

ทดสอบภายใต้ Windows 7 ด้วย Cygwin 2.6.0


งานนี้ถ้าคุณจะเอาKB?
TheLethalCoder

@TheLethalCoder ฉันไม่แน่ใจและฉันไม่คิดว่าฉันจะหาคำตอบได้ คำตอบของฉันมาจากryanและเราทั้งคู่ค้นหาข้อความใน WindowsUpdate.log ขนาดใหญ่ซึ่งมีชื่อ KB มากกว่าฉันจะไม่เดิมพันหมายเลขไม่สามารถปรากฏในบริบทอื่นได้
Aaron

ยุติธรรมเพียงพอผมไม่ทราบว่าพอเกี่ยวกับสิ่งที่คุณกำลังทำอะไรอยู่จึงเป็นคำถามที่ไม่ได้เป็นข้อเสนอแนะ :)
TheLethalCoder

3
สิ่งนี้จะใช้ได้ผลถ้าคุณลบKBเนื่องจากมันไม่น่าเป็นไปได้ที่4012212จะมีอยู่ในทุกสิ่งยกเว้นเส้นทาง คุณสามารถบันทึกได้ 1 ไบต์หากคุณลบเฉพาะ K เพราะคุณจะไม่พบB4012212แบบสุ่มหากไม่มีเส้นทาง
ไซเรน

4
@ ไซเรนฉันไม่มั่นใจเกี่ยวกับการทดสอบตัวเลขเท่านั้นฉันกลัวที่จะจับคู่ 1) จำนวนไบต์ที่ถ่ายโอน 2) อัปเดตรายงานเหตุการณ์และงาน UID หรือ 3) รหัสข้อผิดพลาดฐานสิบหก (และอื่น ๆ ) การลบเฉพาะรายการKแรกนั้นสมเหตุสมผล แต่จากนั้นB...จะกลายเป็นการแสดง
Aaron

12

PowerShell v4, 64 ไบต์

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

ตรวจสอบการอ้างอิง KB ทั้งหมดโดยใช้ RegEx (ตอนนี้คุณมีปัญหาสองข้อ)


3
ยินดีต้อนรับสู่เว็บไซต์! คำตอบแรกที่ดี!
programmer5000

7

Batch / Command Prompt, 27 25 ไบต์

systeminfo|find "4012212"

หากพบว่า KB4012212 มีเอาต์พุตนั้นมิฉะนั้นจะไม่มีสิ่งใดส่งออก

ขอบคุณ @Kevin สำหรับการบันทึก 2 ไบต์ :)


1
ฉันคิดว่าคุณสามารถลบช่องว่างรอบ ๆ ท่อ: systeminfo|find "4012212"สำหรับ -2 ไบต์
Kevin Cruijssen

5

Powershell 2.0, 142 ไบต์

  • ส่งคืน 0 สำหรับ "false", ไม่ได้รับการแพตช์ "<0 สำหรับ" true ", ได้รับการแก้ไขแล้ว

ด้านล่างมี KB ทั้งหมดตั้งแต่เดือนมีนาคม แต่ความต้องการขยายตัวในเดือนเมษายนและ KB อาจเป็นเดือนก่อนหน้าซึ่งมีการแทนที่ทั้งหมดก่อนหน้านี้

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

ฉันไม่แน่ใจ แต่ฉันคิดว่าคุณสามารถเปลี่ยน(Get-HotFix | whereเป็น(HotFix|where(ลบช่องว่างและGet-ลบออกได้
Kevin Cruijssen

3

Powershell 5.1 134 ไบต์

เหมือนกับ Mark Pippin แต่เปลี่ยน Get-Hotfix เป็น Hotfix และจะได้ที่ไหน ประหยัด 8 ไบต์

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

ฉันไม่สามารถทำให้จำนวนไบต์ต่ำกว่าคำตอบของ Kevin


1
คุณสามารถลบช่องว่างรอบ ๆ ไปป์: (HotFix|? HotFixID ...สำหรับ -2 ไบต์
Kevin 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

ส่งออกข้อมูลประจำตัวของแพคเกจถ้ามันติดตั้งหรือไม่มีอะไรเป็นอย่างอื่น
ในภาพหน้าจอด้านล่าง4012212ติดตั้งโปรแกรมแก้ไขแล้วและ4012215ไม่ใช่

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.