exe编程语言标识

SIL*_*ENT 2 .net c# c++

要继续我的课程项目,我需要识别示例exe的编程语言.以下是我对exe的了解:

  1. 使用x86 .Net 4.0框架 - 它通过JetBrains dotPeek程序引用mscorlib .
  2. 有win32 gui和win32按钮和标签 - 根据UI验证的框架ID (仍然使用旧版本).我针对WPF和WinForm示例exe测试了UI Verify框架ID.

起初我假设它是一个C++/CLI项目,但我也发现了一个对System.Windows.Forms的引用和可以反编译为C#的方法.

这个exe编写的编程语言是什么?


更新1:使用ILSpy,我发现exe是"混合+本机代码",根据@xanatos建议.我也注意到它引用了Microsoft.VisualC.


更新2:至于我的参考以及可能需要帮助来识别.net引用的exe的其他人,我做了以下事情:

  1. 通过JetBrains或ILSpy验证引用.Net(.mscorlib)的exe
  2. 检查GUI及其控件,以帮助通过UI验证识别框架ID
  3. .corflags通过ILSpy的IL视图检查以确定它是ILOnly还是混合
  4. 通过ILSpy识别exe的入口点(我必须将其更改为C#View并选择exe)
  5. 检查入口点方法是否hidebysig通过ILSpy(我点击了入口点,它将我重定向到方法,然后我将视图更改回IL)

xan*_*tos 6

我已经通过在Visual Studio中创建一些空的控制台应用程序做了一些实验.

C#:

C#程序没有什么特别之处.这非常"平淡".其他组件没有奇怪的参考.空应用程序仅引用mscorlib.该Main方法是hidebysig.

VB.NET:

即使是空的控制台应用程序也有引用Microsoft.VisualBasic.在里面(assemblynamespace).My和里面定义了很多东西(assemblynamespace).My.Resources.该Main方法不是 hidebysig.

F#:

即使是几乎空的Consol App也有参考FSharp.Core.该Main方法不是 hidebysig.

带/ clr的C++/CLI:

命名空间<CppImplementationDetails><CrtImplementationDetails>命名空间中都有类.ILSPY中显示了对kernel32.dll的引用.启动方法是internal unsafe static int mainCRTStartupStrArray(string[] arguments).事实并非如此hidebysig.

C++/CLI with/pure:

命名空间<CppImplementationDetails><CrtImplementationDetails>命名空间中都有类.ILSPY中显示了对kernel32.dll的引用.启动方法是internal unsafe static int mainCRTStartupStrArray(string[] arguments).事实并非如此hidebysig.

带/ safe的C++/CLI:

外部类的方法在一个内部定义internal class <Module>.的main(小写)方法 hidebysig.

ILASM:

没有经过测试,但可以确定可以生成任何纯IL代码

其他语言:

您经常可以查看引用的程序集.通常,为.NET编译的语言有一些额外的程序集,它们具有特殊的类(如VB.NET)Microsoft.VisualBasic

-

请注意,如果exe是"纯"IL代码,那么应该有一个

.corflags 0x00000001 // ILOnly

如果是混合原生+ ILCode:

.corflags 0x00000000 // 0

我可以通过在ILSPY中加载exe,选择它并在工具栏的组合框中选择IL来看到它.这是最后一行

起初我假设它是一个C++/CLI项目,但我也发现了一个对System.Windows.Forms的引用和可以反编译为C#的方法.

使用C++/CLI或C#并使用System.Windows.Forms正交.您可以使用任何.NET语言System.Windows.Forms.最大的区别在于,使用C++/CLI,您可以输入exe非IL代码和IL代码,而使用C#,您只能生成IL代码.