2011-12-08 14 views
13

Duplicar posible:
How do I tell if a win32 application uses the .NET runtime¿Cómo saber si un proceso ".exe" fue escrito con C++ o C#?

Hay una manera de reconocer manualmente si un proceso de ".exe" específica fue escrito en C++ (código no administrado) o con C# (código administrado) ?

+2

Ya puedo decir que hay una forma, ya que Process Explorer hace eso. Ahora tenemos que encontrar cómo: p –

+0

Intente golpear el exe con [Reflector] [1] para ver qué sucede. [1]: http://stackoverflow.com/questions/214764/best-free-decompiler-for-c-sharp-with-vs-integration – jp2code

+1

Tenga en cuenta que los programas escritos en VB.NET generar la el mismo "tipo" de ejecutable que los escritos en C#, y solo puedes adivinar qué se usó para crear la aplicación no administrada. Como mencionaron los otros, puede distinguir el código no gestionado del gestionado. –

Respuesta

8

Si usted está tratando de determinar si un procesoes un proceso .NET, puedo sugerir una solución inspirada en respuesta Dave Van den Eynde de en este tema: How do I tell if a win32 application uses the .NET runtime

"Una aplicación es un ejecutable .NET si requiere la ejecución de mscoree.dll".

Dado que, compruebe los módulos del proceso para ver si mscoree aparece en la lista.

 foreach (var process in Process.GetProcesses()) 
     { 
      if (process.Modules.OfType<ProcessModule>().Any(m => m.ModuleName.Equals("mscoree.dll", StringComparison.OrdinalIgnoreCase))) 
      { 
       Console.WriteLine("{0} is a .NET process", process.ProcessName); 
      } 
     } 
+0

¿Tiene "mscoree.dll" el recurso dll principal de un código administrado de C# binnary? ¿Puedo confiar en que no hay ningún binario en C++ que use el mismo dll? – Diogo

+0

No es una biblioteca administrada, pero todo en este dll está relacionado con .NET Framework. No garantiza que el proceso sea una aplicación .NET pura, pero al menos está alojando un código .NET. Por ejemplo, si carga un complemento .NET en Microsoft Word, este dll aparecerá en los módulos, incluso si Word no es una aplicación .NET por sí mismo. –

+1

¿Por qué una aplicación de consola escrita en C# no se muestra como una aplicación administrada cuando se usa de esta manera para verificar? – stt106

2

Puede ejecutar peverify o ildasm (disponible en el entorno de línea de comandos de Visual Studio) en el archivo y le dará un error si no se trata de un código administrado. Tenga en cuenta que esto fallará en algunos casos en que utilicen un sistema de protección que encripte el IL y oculte el gestor de arranque CLR, pero la mayoría de los programas no tienen esta protección.

1

Si es un .exe .NET (o .dll para el caso), que va a tener una dependencia de mscoree.dll que se puede ver mediante el examen con Dependency Walker o algo similar.

Si desea hacerlo programáticamente, puede tomar this VB project como punto de partida.

Sin embargo, esto no le dirá el idioma con seguridad. No se puede distinguir un C# de un programa VB.NET (u otro lenguaje .NET) o un C++ de un programa C (u otro lenguaje que no sea .NET). Hay algunas cosas que pueden descartar que uno u otro sea el único idioma utilizado, o que uno u otro sea más probable. Incluso podría haber código no administrado haciendo uso de mscoree.dll de alguna manera extraña.

Cuestiones relacionadas