![](/img/trans.png)
[英]Is there a way to find out which .NET Framework version uses which version of zlib? (in relation to CVE-2018-25032)
[英]How to find out which version of the .NET Framework an executable needs to run?
我認為您可以可靠地獲得的最接近的是確定需要哪個版本的CLR 。 您可以通過使用 ILDASM 並查看“MANIFEST”節點或反射器並將“Application.exe”節點的分解視圖作為 IL 來執行此操作。 在這兩種情況下,都有指示 CLR 版本的注釋。 在 ILDASM 中,注釋是“// Metadata version”,在 Reflector 中,注釋是“Target Runtime Version”。
以下是名為 WindowsFormsApplication1.exe 的 .NET WinForms 應用程序的示例:
伊爾達斯姆:
// Metadata version: v2.0.50727
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern System
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
反射器:
.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727
您還可以查看引用的程序集列表並查找具有最高版本號的引用。
再次使用 ILDASM 查看“MANIFEST”節點數據:
.assembly extern System.Drawing
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 2:0:0:0
}
.assembly extern System.Core
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 3:5:0:0
}
並使用 Reflector,查看列出的每個參考的可拆卸性(仍為 IL):
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
通過查找具有最高版本元數據的引用,您可以確定引用來自哪個版本的 Framework,這表明您需要安裝相同版本的 Framework 才能運行應用程序。 話雖如此,我不會將其視為 100% 可靠,但我認為它不會很快改變。
更簡化的方法是使用dotPeek並查看樹中顯示的內容。
您現在可以使用ILSpy檢查程序集的目標框架。 加載程序集后,點擊程序集節點的根節點,可以在TargetFramework聲明下找到信息:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
從代碼中,您可以使用Assembly.ImageRuntimeVersion
但通過查看文件,最好的辦法可能是使用反射器並查看正在引用哪個版本的mscorlib
。
編輯:更好的是使用ildasm ,打開你的程序集,然后查看程序集的清單。 清單的第一行將告訴您程序集所針對的 CLR 的確切版本。
從命令行: find "Framework" MyApp.exe
您可以使用名為 CorFlags.exe 的工具。 它從 .NET 2.0 開始就存在,我確信它包含在 Windows SDK 7.0 中。 默認情況下(在 Windows XP Pro 上)它安裝到 C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0A\\bin\\CorFlags.exe。 為其提供托管模塊的文件路徑(沒有任何其他命令行標志)以顯示其頭信息,其中包括版本。
請記住,此實用程序旨在修改模塊的 PE32 標頭,因此在仔細閱讀文檔之前不要使用任何標志。
您可以使用 Powershell 在 Windows 中獲取文件的 .NET 版本。 以下腳本;
$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
$filename = $file.BaseName
$version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
select-object -ExpandProperty ConstructorArguments |
select-object -ExpandProperty Value |
select-string -Pattern '.NET')
Write-Output "$filename,$version"
}
請注意,結果為該文件夾中的 exe 文件提取了 .NET 版本,但它也會為 dll 執行相同的操作。
或者您可以找出它具有 System.Core 的哪個引用。 這將告訴您此應用程序正在使用的 .NET Framework 版本。 對於 2.0,System.Core 的版本將為 2.0.xxx.xxx。 對於 3.5,版本將為 3.5.xxx.xxx 等。
在 Linux/OSX/unix 上,您可以使用:
strings that_app.exe | grep 'v2.\|Framework'
對於較新的 .NET 6.0 應用程序,記事本方法對我不起作用,但如果在 exes 旁邊有一個 *.deps.json 文件,這是一個很大的線索 - 通常包含以下部分形式的版本
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0/win-x86"
編輯:跟進,您還可以查找一對同名的.exe 和.dll 文件,嘗試在記事本中打開 DLL 文件並搜索NETCoreApp ,您應該會找到如下內容:
.NETCoreApp,Version=v6.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.