exe编程语言标识

时间:2015-04-17 15:38:51

标签: c# c++ .net

要继续我的课程project,我需要确定示例exe的编程语言。以下是我对exe的了解:

  1. 使用x86 .Net 4.0框架 - 它通过JetBrains dotPeek程序引用mscorlib。
  2. 有win32 gui和win32按钮和标签 - 根据UI Verify上的框架ID(仍使用旧版本)。我针对WPF和WinForm示例exe测试了UI Verify框架ID。
  3. 起初我假设它是一个C ++ / CLI项目,但我也发现了一个对System.Windows.Forms的引用和可以反编译为C#的方法。

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


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


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

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

2 个答案:

答案 0 :(得分:6)

我已经通过在Visual Studio中创建一些空的控制台应用程序来完成一些实验。

C#:

C#程序中没有什么特别之处。它非常简单"。其他组件没有奇怪的参考。空应用程序仅引用mscorlib。 Main方法是hidebysig。

VB.NET:

即使是空的控制台应用程序也会引用Microsoft.VisualBasic(assemblynamespace).My(assemblynamespace).My.Resources中定义了大量内容。 Main方法 hidebysig。

F#:

即使是几乎空的Consol App也会引用FSharp.CoreMain方法 hidebysig。

C ++ / CLI with / clr:

<CppImplementationDetails><CrtImplementationDetails>命名空间中有类。 ILSPY中显示了对kernel32.dll的引用。 start方法是internal unsafe static int mainCRTStartupStrArray(string[] arguments)。它不是hidebysig

C ++ / CLI with / pure:

<CppImplementationDetails><CrtImplementationDetails>命名空间中有类。 ILSPY中显示了对kernel32.dll的引用。 start方法是internal unsafe static int mainCRTStartupStrArray(string[] arguments)。它不是hidebysig

C ++ / CLI with / safe:

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

ILASM:

未经测试,但非常确定可以生成任何纯IL代码

其他语言:

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

-

请注意,如果exe是&#34; pure&#34; IL代码应该有一个

.corflags 0x00000001 // ILOnly

如果是混合原生+ ILCode:

.corflags 0x00000000 // 0

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

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

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

答案 1 :(得分:2)

您的问题很难确定,但Visual Studio VB.Net,C#和C ++编译器在编译项目时都输出略有不同的程序集,因此您可以进行相当准确的猜测。

某些功能(如指针)仅可通过C#或C ++ / CLI获得,其他特殊隐藏类型可以区分这两种功能。在大多数情况下,您应该查看反编译成IL的代码,而不是VB.Net或C#,因为IL中的某些属性可能不会被反编译器正确地(或根本没有)反编译成目标语言。在这种情况下,ILDasm可能是最好的选择(即使它的用户界面使用起来最不方便) - 它显示了其他反编译器可能隐藏的一些额外信息。

这种工作的另一个有用工具是CFF Explorer - 它显示了PE可执行文件的二进制结构。

无论您的猜测是什么,如果程序集已从多个不同的程序集合并,或者它已被混淆或以其他方式转换,它可能会关闭。

坦率地说,这似乎是一个非常毫无意义的练习,因为即使你可以告诉编译器生成输出的内容,它也不会给你太多。其他供应商的编译器可能会生成不同的编译输出,因此如果您的.exe已由非Microsoft编译器输出,则会使其更难。

相关问题