识别GDR和LDR SOS.dll和mscordacwks.dll

时间:2014-10-20 19:56:18

标签: c# security dll windbg code-injection

我第一次注意到我的集合中的一个mscordacwks DLL是不同的(SVN告诉我)。当我做一些研究时,我发现有这些DLL的LDR版本和GDR版本。

对于有问题的文件,我注意到其中一个没有经过数字签名,但另一个是(很幸运的是)。

现在我有以下问题:

  • 如果我有LDR和GDR版本,我该如何找出哪一个?
  • 是否由Microsoft签署了DLL的GDR和LDR版本?
  • 由于其中一个未签名,有人可能会将恶意代码注入mscordacwks.dll,然后当我在WinDbg中使用它时,会在我的机器上执行调试权限吗?

我将尝试找出我从哪里获得未签名的DLL。当我需要特定版本时,我很可能会从一些或多或少可疑的网站上下载它。

仅供参考:VirusTotal analysis没有发现任何病毒。

1 个答案:

答案 0 :(得分:-1)

感谢评论中的帮助,我可以总结一下:

数字签名

根据Hans Passant的说法,所有的Microsoft DLL都应该签名,因此我们必须小心使用未签名的DLL。

不幸的是,这个声明并非100%正确,我已经验证了Mscordacwks.dll 2.0.50727.312和SOS.dll 2.0.50727.312。 Microsoft已将该版本与Windows Vista一起发布。我尝试从头开始安装Windows Vista。

这是Windows Vista附带的DLL上sigcheck -h的输出:

 Verified:       Unsigned
 Link date:      09:05 19.10.2006
 Publisher:      Microsoft Corporation
 Description:    Microsoft .NET External Data Access Support
 Product:        Microsoft« .NET Framework
 Prod version:   2.0.50727.312
 File version:   2.0.50727.312 (rtmLHS.050727-3100)
 MachineType:    32-bit
 MD5:    9252D83D169E84A442BB154A79AC2189
 SHA1:   63464F337295D689384BAA514F260C54D06291C6
 PESHA1: 99D57B38C554FFD4BEC6E6C2FAD7F77B980CB47B
 PE256:  EF387EF84028497D5F7D231ED3A6F5FB05C02D96BD3B0E470C6BEBFAD6942AC8
 SHA256: 5ADB79D39FC8401CB9542B571EEEC82CAFCADAE2F26997C789E14EC8E9635C08

另请参阅VirusTotal中具有相同哈希码的详细信息。请注意,通过列出“Authenticode签名块”,该网站有点误导。实际上,这只是文件的版本信息。此DLL中缺少标记为“签名验证:已签名文件,已验证签名”的最重要行。

如果文件真的签名,这就是应该的样子: Example of how signed files look like

sigcheck和Windows资源管理器的输出也显示文件未签名

Verified:       Unsigned
Link date:      09:05 19.10.2006
Publisher:      Microsoft Corporation
Description:    Microsoft .NET External Data Access Support
Product:        Microsoft« .NET Framework
Prod version:   2.0.50727.312
File version:   2.0.50727.312 (rtmLHS.050727-3100)
MachineType:    32-bit

Windows资源管理器的屏幕截图,其中文件没有数字签名选项卡:

Digital signatures tab missing

在VirusTotal报告结束时,您会找到NIST(美国国家标准与技术研究院)的声明,该声明称该文件随Windows Vista Ultimate一起提供,并且似乎是安全的。这是我上传未签名版本后我被引导访问的网站。

NIST Statement on that file

区分GDR和LDR版本

SysInternals sigcheck 工具显示的版本号比Windows资源管理器更多。如果它包含“GDR”,则它是GDR版本。如果它不包含GDR,则它是LDR版本。

要在C#中获取要进行比较的字符串,可以使用以下代码:

var versionInfo = FileVersionInfo.GetVersionInfo(fullFileName);
var fileVersion = versionInfo.FileVersion;

受影响的版本

我检查了所有我的DLL签名,发现了比预期更多的未签名DLL。但是,之前已在VirusTotal上扫描过大多数文件。但是,这些版本都没有NIST条目

恶意代码注入

如Jeroen Mostert所述,DLLMain入口点将被执行,因此可能存在恶意代码注入。