WannaCrypt를위한 GottaFix?


109

경고

이 챌린지 테스트에 대한 답변은 WannaCrypt / WannaCry 공격을 막는 데 도움이되는 특정 버전의 패치에 대한 답변입니다. 운영 체제에 따라 다른 패치가있을 수 있습니다. 자신을 보호하는 가장 좋은 방법은 PC를 최신 상태로 유지하고 첨부 파일과 웹 링크를 열 때주의해야합니다.


소개

나는 프로그래머가 본질적으로 좋은 사람이라고 생각하고 싶습니다. 일부는 그렇게 좋지는 않지만 사람들이 MS17-010 패치 로 보호받을 수 있도록 도와줍니다 .

도전

문제는 MS17-010 패치가 현재 운영 체제에 설치되어 있는지 여부에 따라 진실 또는 거짓 값 을 반환하는 전체 프로그램 또는 함수를 작성하는 것 입니다.

입력과 출력

입력 : 입력이 필요하지 않습니다

출력 : 진실 또는 거짓 값 (각 사례에 사용되는 값을 나타냄). 오류 / 예외는 잘못된 값으로 간주 될 수 있습니다.

규칙

  • 패치를 사용할 수있는 하나 이상의 Windows 운영 체제에서 코드를 실행하고 올바르게 출력해야하지만 모든 운영 체제에서 실행할 필요는 없습니다 (제한 사항을 명시하십시오).
  • 표준 허점 적용
  • 이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

3
흠, 하나의 질문입니다. 진실 / 거짓 값과 관련하여 오류는 거짓 값으로 허용되고 진실은 실제 수익으로 허용됩니까, 아니면 허용되지 않습니까?
케빈 크루이 센

3
@KevinCruijssen 오류를 잘못된 값으로 간주하게되어 기쁩니다. 패치가 설치되지 않았다는 것이 명백한 지표라고 생각합니다.
Notts90

12
사용자가이 패치를 놓쳤지만 이후 패치를 설치 한 경우 여전히 보호되어 일부 사용자에게 잘못된 부정을 줄 수 있습니다.
Ian Miller

2
@MichealJohnson은 사람들이 취약점을 악용하는 방법을 보여주는 코드를 게시하도록 장려하는 것이 현명하지 않다.
Notts90

7
호스트 PC의 감염이 유효한 잘못된 값입니까? 그것은 분명 걸쳐 포인트 얻을 것
닉 로버트슨

답변:


158

PowerShell 2.0, 24 20 16 바이트

hotfix KB4012212

@whatever 를 제거 하여 -4 바이트 -id. 로 변경 하여 @ DankoDurbić
덕분에 -4 바이트 .get-hotfixhotfix

KB4012212Windows 7 용 패치 입니다. 패치의 링크 된 페이지 에서 모든 KB 코드로 대체 될 수 있습니다 .

정확한 값으로 설치되면 Source , Description , HotFixID , InstalledByInstalledOn 정보를 반환하고 잘못된 값으로 찾을 수 없으면 오류를 발생시킵니다.

다음은 진실과 거짓 출력의 예입니다 ( KB4012212내 컴퓨터에도 설치되어 있지만 KB4012215그렇지 않습니다).

여기에 이미지 설명을 입력하십시오


82
실제로 실용적인 목적으로 유용한 PPCG에 대한 답변? 나는 감동.
John Dvorak

1
ID Get-HotFix KB4012212도 지정할 필요가 없습니다 . (PSv4로만 테스트). 그러나 나는 Jan Dvorak에 동의합니다. 나는 결과가 도전을 확인한다고 생각하지 않습니다.
어떤

6
다음 또는 이후 매월 롤업 할 경우 서로 교체되므로 작동하지 않습니다.
Sumyrda

6
@ Notts90 그렇습니다.이 주석은 코드를 시도하고 허위 부정을하는 사람들을위한 힌트입니다.
Sumyrda

10
그냥 hotfix KB4012212충분하다. Powershell에서는 글을 쓸 필요가 없습니다 get-.
Danko Durbić가

43

배치 / Windows CMD, 31 29 28 23 바이트

wmic qfe|find "4012212"

로 변경 하여 @SteveFest 덕분에 -1 바이트 . 를 제거 하여 @BassdropCumberwubwubwub 덕분에 -5 바이트 .findstr 4012212find "4012212"
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
다음 또는 이후 매월 롤업 할 경우 서로 교체되므로 작동하지 않습니다.
Sumyrda

2
@Sumyrda의 과제는이 특정 패치를 확인하는 것이므로 교체 패치를 확인할 필요가 없습니다.
Notts90

1
find "4012212"또한 -1 바이트에서도 작동 wmic qfe|find "4012212"하지만 작동하는 것 같지만 어딘가에 뭔가 빠져 있습니까?
Bassdrop Cumberwubwubwub

20

Bash + Cygwin (또는 WSL), 21 바이트

이 답변은 대부분 Kevin의 답변 에서 도난당했습니다 . 따라서 가치가 있다고 생각되면 투표를 그 방법으로 던지십시오.

wmic qfe|grep 4012212

Cygwin은 coreutils 외에도 Windows 명령에 액세스 할 수 있습니다. grepWindows 대신 coreutils를 사용할 수 find있으므로 따옴표를 사용할 필요가 없습니다. 이 때문에 2 바이트가 저장됩니다.


1
오 그래 그래 내 것보다 짧아. 나는 좋은 MS 사용자를 훔치지 않았다!
Aaron

2
누군가 내가 이것을 추측하기 위해 "또는 WSL"을 포함하도록 이것을 편집했지만 먼저 경로를 수정해야합니다.
Captain Man

17

파워 쉘 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 덕분에 -33 바이트 덕분에 공백을 제거하고 true와 false를 1과 0으로 바꿉니다.

@KevinCruijssen 단축 변수 이름 덕분에 -5 바이트

당첨되지는 않지만,이 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
아, 그리고 지금 당신이 알아 차릴 수있는 또 다른 것 : 항상 단일 문자 변수 / 메소드 / 클래스 이름을 사용하는 것이 가장 좋습니다. 그래서 당신은 변경할 수 있습니다 HcHSeT(이외의 다른 단일 문자 나 H또는 S이미 사용한 적이있는) 다른 5 바이트를 저장합니다. :)
Kevin Cruijssen

2
$H 저장하는 대신 직접 전달할 수 없습니까 ? 또한 %{ }?{ }대신 ForEach-Object하고 if. 확신 당신은 당신은 단지 하나의 결과가 일치하지 않고 에코보다 파이프 라인에 바로 출력을해야 할 수 있기 때문에 나는 그 영업을 기반으로 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"?
Julian Wolf

@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 바이트를 절약하려면
Ryan

5
+1 쉘 스크립팅 언어가 아닌 경우.
Hjulle

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없으므로 제거하면 작동합니다 . B4012212경로없이 무작위로 찾지 않기 때문에 K 만 제거하면 1 바이트를 절약 할 수도 있습니다 .
사이렌

4
@Sirens 나는 숫자 만 테스트하는 것에 대해 확신하지 못합니다 .1) 전송 된 바이트 수, 2) 업데이트, 보고서 이벤트 및 작업 UID 또는 3) 16 진수 오류 (및 기타) 코드와 일치하는 것을 두려워합니다. K첫 번째 만 제거하는 것이 합리적이지만 B...유효한 16 진 표현이되어 UID 및 16 진 코드와 충돌 할 수 있습니다.
Aaron

12

PowerShell v4, 64 바이트

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

RegEx를 사용하여 모든 KB 참조를 확인합니다 (현재 두 가지 문제가 있음).


3
사이트에 오신 것을 환영합니다! 좋은 첫 대답!
programmer5000

7

배치 / 명령 프롬프트, 27 25 바이트

systeminfo|find "4012212"

KB4012212가 발견되면 출력이 없으면 아무것도 출력되지 않습니다.

2 바이트를 절약 한 @Kevin에게 감사드립니다 :)


1
파이프 주위의 공백을 제거 할 수 있다고 생각합니다 : systeminfo|find "4012212"-2 바이트.
케빈 크루이 센

5

Powershell 2.0, 142 바이트

  • 패치되지 않은 "거짓"에 대해서는 0을, "true"에 대해서는 0을 반환합니다.

아래에는 3 월의 모든 KB가 포함되어 있지만 각각 이전 KB보다 우선하는 5 월 4 월로 확장해야합니다.

(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과 동일하지만 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

패키지 ID가 설치되어 있으면 출력하거나 그렇지 않은 경우 출력합니다.
아래 스크린 샷에는 패치 4012212가 설치되어 있지만 설치되어 4012215있지 않습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.