GottaFix for WannaCrypt?


109

警告

针对特定版本补丁的此挑战测试的答案,该补丁有助于阻止WannaCrypt / WannaCry攻击。根据您的操作系统,您可能具有不同的补丁程序。保护自己的最佳方法是确保您的PC完全是最新的,并且在打开附件和Web链接时要小心。


介绍

我喜欢认为程序员天生就是好人,即使有些人不是那么好,所以请帮助人们确保他们受到MS17-010补丁的保护。

挑战

您面临的挑战是编写一个完整的程序或函数,以返回真或假根据真实操作系统中是否安装了MS17-010补丁程序值值。

输入输出

输入:无需输入

输出:真实或假值(用于每种情况的指示)。错误/异常可以认为是错误值。

规则

  • 您的代码应至少在一个有补丁程序的Windows操作系统上运行(并正确输出),但不必在每个操作系统上都运行(请说明任何限制)。
  • 适用标准漏洞
  • 这是,因此以最少的字节提交为准!

3
嗯,一个问题。关于真假值,是否允许将错误作为假值,将真值作为实际回报,还是不允许?
凯文·克鲁伊森

3
@KevinCruijssen我很高兴将错误视为错误的值。我认为这清楚地表明未安装该补丁。
Notts90 '17

12
如果用户错过了此补丁程序,但安装了更高版本的补丁程序,则它们仍将受到保护,因此可能会对某些用户造成负面影响。
伊恩·米勒

2
@MichealJohnson不确定鼓励人们发布演示如何利用此漏洞的代码是明智的。
Notts90 '17

7
主机感染是否为有效的假值?这显然会得到跨越点
尼克·罗伯逊

Answers:


158

PowerShell 2.0中,24个 20 16字节

hotfix KB4012212

-4个字节感谢@whatever通过删除-id。通过将@DankoDurbić更改为
-4个字节。get-hotfixhotfix

KB4012212是Windows 7的补丁。可以用补丁链接页面中的任何KB代码替换。

安装时,将以真实值返回SourceDescriptionHotFixIDInstalledByInstalledOn信息,如果找不到它为虚假值,则将给出错误消息。

这是一个真实和错误输出的示例(因此KB4012212安装在我的机器上,但KB4012215没有安装):

在此处输入图片说明


82
对PPCG的回答实际上对实际有用吗?我印象深刻
约翰·德沃夏克

1
您无需指定ID Get-HotFix KB4012212也可以使用。(仅通过PSv4测试)。但是我同意扬·德沃拉克(Jan Dvorak)的观点,我认为输出结果不能证明这一挑战。
无论

6
如果您已经在下一个或以后的每月汇总中,则无法使用,因为它们会相互替换。
Sumyrda

6
@ Notts90是的,此注释是对尝试使用该代码并获得假否定的人的提示。
Sumyrda

10
仅仅hotfix KB4012212是不够的。在Powershell中,您无需编写get-
丹科·杜比奇(DankoDurbić)'17年

43

批处理/ Windows CMD,31 29 28 23字节

wmic qfe|find "4012212"

@SteveFest更改findstr 4012212为-1个字节find "4012212"
-5字节感谢@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更新,这将成为问题
John Dvorak

1
使用find而不是findstr,它可以节省3个字节
stevefestl

2
如果您已经在下一个或以后的每月汇总中,则无法使用,因为它们会相互替换。
Sumyrda

2
@Sumyrda面临的挑战是检查此特定补丁程序,而不必检查替换补丁程序。
Notts90 '17

1
find "4012212"也适用于-1字节,wmic qfe|find "4012212"似乎也可以使用,但也许我在那儿缺少什么?
Bassdrop Cumberwubwubwub

20

Bash + Cygwin(或WSL),21个字节

这个答案大部分是从凯文的答案中偷走的。因此,如果您认为这值得一去,请以同样的方式提出投票。

wmic qfe|grep 4012212

除coreutils外,Cygwin还可以访问Windows命令。我们能够使用coreutils grep而不是Windows,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;

-33个字节,这要感谢@KevinCruijssen删除空格并用1和0替换true和false。

-5个字节,感谢@KevinCruijssen缩短了变量名

显然不会赢得任何奖金,但是此powershell脚本将检查Microsoft更新历史记录日志中是否有KB4013429(链接上列出的修补程序之一),可以将其替换为任何修补程序。以为我会发布它,因为如果用以后的补丁替换了补丁,它会更可靠。


13
嗨,欢迎来到PPCG!:)由于此问题被标记为代码高尔夫,所以其想法是以尽可能少的字节完成挑战。我知道您的答案可能永远不会赢,并且您使用的方法比我使用的更完整,但是您仍然可以通过删除不必要的空格来寻找当前答案,并使用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
哦,还有一件您现在可以注意到的事情:最好始终使用单字符变量/方法/类名。因此,您可以将Hcto HSeto 更改为T(或除已使用HS已用过的另一个单个字母)以保存另外5个字节。:)
凯文·克鲁伊森

2
您不能$H 直接通过 而不是存储吗?也可以%{ }?{ }而不是ForEach-Objectif。可以肯定的是,您只能输出到管道而不是回声,因为您只应该有一个结果匹配,并且我认为根据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>未使用输入的位置。

在@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个字节
瑞安(Ryan)

5
+1不使用Shell脚本语言。
Hjulle

2
埃里克·卡尔松(谁没有足够的代表评论)在编辑建议更换保存7个字节SELECT HotFixIDSELECT *
马丁·恩德

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除了路径之外,几乎所有内容都不会出现。如果仅删除K,则也可以节省1个字节,因为在没有B4012212路径的情况下不会随机查找。
警报器

4
@Sirens我对仅测试该数字没有把握,我害怕匹配1)传输的字节数,2)更新,报告事件和作业UID或3)十六进制错误(及其他)代码。只删除第K一个似乎是合理的,但随后删除B...为有效的十六进制表示形式,可能与UID和十六进制代码发生冲突
Aaron

12

PowerShell v4,64字节

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

使用RegEx检查所有KB引用(现在有两个问题)


3
欢迎光临本站!不错的第一答案!
程序员

7

批处理/命令提示符,27 25字节

systeminfo|find "4012212"

如果找到KB4012212,则输出,否则不输出。

感谢@Kevin保存2个字节:)


1
我认为您可以删除管道周围的空格:systeminfo|find "4012212"-2个字节。
凯文·克鲁伊森

5

Powershell 2.0,142个字节

  • 对于“ false”(未修补),返回0;对于“ true”(修补),返回0。

下面包含了3月以来的所有KB,但需求随着4月而扩大,5月的KB都取代了以前的所有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相同,但将Get-Hotfix更改为Hotfix,并在何处更改了?节省8个字节

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

我不能让它的字节数比凯文的答案低


1
您可以删除管道周围的空格:(HotFix|? HotFixID ...-2个字节。
凯文·克鲁伊森

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但未安装。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.