概要
プロデルが、CLRらしいので、調べて見た。
exeファイルのpeヘッダー読んでみた。
CSCでコンパイルした場合
>pe1
Inspecting PE header for:
C:\Users\ore\csc\a0.exe
[Import Table Names]
mscoree.dll
[Detected Microsoft Visual C++ Runtime]
No runtime detected
32bits executable
mindでコンパイルした場合
>pe1
Inspecting PE header for:
C:\Users\ore\csc\moji1.exe
[Import Table Names]
KERNEL32.dll
[Detected Microsoft Visual C++ Runtime]
No runtime detected
32bits executable
プロデルでコンパイルした場合
>pe1
Inspecting PE header for:
C:\Users\ore\csc\run0.exe
[Import Table Names]
mscoree.dll
[Detected Microsoft Visual C++ Runtime]
No runtime detected
32bits executable
サンプルコード
using System;
using System.Collections.Generic;
namespace peheader
{
class Program {
enum VcRuntime {
none,
msvcrt,
msvc_2008,
msvc_2010,
msvc_2012,
msvc_2013,
msvc_2015,
msvc_2017,
universal
};
static string VcRuntimeDescription(VcRuntime runtime) {
switch(runtime)
{
case VcRuntime.none:
return "";
case VcRuntime.msvcrt:
return "Microsoft VC Runtime 5.0 / 6.0";
case VcRuntime.msvc_2008:
return "Microsoft VC Runtime 2008";
case VcRuntime.msvc_2010:
return "Microsoft VC Runtime 2010";
case VcRuntime.msvc_2012:
return "Microsoft VC Runtime 2012";
case VcRuntime.msvc_2013:
return "Microsoft VC Runtime 2013";
case VcRuntime.msvc_2015:
return "Microsoft VC Runtime 2015";
case VcRuntime.msvc_2017:
return "Microsoft VC Runtime 2017";
case VcRuntime.universal:
return "Microsoft VC Universal Runtime, as of VS 2015";
default:
return runtime.ToString();
}
}
static void Main(string[] args) {
string filename;
//filename = @"c:\windows\system32\notepad.exe";
filename = @"C:\Users\ore\csc\a0.exe";
//filename = @"C:\Users\ore\csc\run0.exe";
//filename = @"C:\Users\ore\csc\moji1.exe";
Console.WriteLine("Inspecting PE header for:");
Console.WriteLine(filename);
PeHeaderReader reader = new PeHeaderReader(filename);
Console.WriteLine();
Console.WriteLine("[Import Table Names]");
Dictionary<VcRuntime, bool> found = new Dictionary<VcRuntime, bool>();
foreach (var name in reader.ImportTableNames)
{
var lower = name.ToLowerInvariant();
VcRuntime runtime = VcRuntime.none;
Console.Write(name);
if (lower == "msvcrt.dll")
runtime = VcRuntime.msvcrt;
if (lower == "msvcr90.dll" || lower == "msvcp90.dll")
runtime = VcRuntime.msvc_2008;
else if (lower == "msvcr100.dll" || lower == "msvcp100.dll" || lower == "vcruntime100.dll")
runtime = VcRuntime.msvc_2010;
else if (lower == "msvcr110.dll" || lower == "msvcp110.dll" || lower == "vcruntime110.dll")
runtime = VcRuntime.msvc_2012;
else if (lower == "msvcr120.dll" || lower == "msvcp120.dll" || lower == "vcruntime120.dll")
runtime = VcRuntime.msvc_2013;
else if (lower == "msvcr140.dll" || lower == "msvcp140.dll" || lower == "vcruntime140.dll")
runtime = VcRuntime.msvc_2015;
else if (lower == "msvcr150.dll" || lower == "msvcp150.dll" || lower == "vcruntime150.dll")
runtime = VcRuntime.msvc_2017;
else if (lower.StartsWith("api-ms-win-core-winrt-l"))
runtime = VcRuntime.universal;
if (runtime != VcRuntime.none && !found.ContainsKey(runtime))
{
found.Add(runtime, true);
Console.WriteLine(" [" + VcRuntimeDescription(runtime) + "]");
}
else
{
Console.WriteLine();
}
}
Console.WriteLine();
Console.WriteLine("[Detected Microsoft Visual C++ Runtime]");
if (found.Count == 0)
{
Console.WriteLine("No runtime detected");
}
else
{
foreach(var item in found)
{
Console.WriteLine(VcRuntimeDescription(item.Key));
}
}
Console.WriteLine();
if (reader.Is32BitHeader)
{
Console.WriteLine("32bits executable");
}
else
{
Console.WriteLine("64bits executable");
}
Console.ReadKey();
}
}
}
以上。