2011-12-08 3 views
13

Eventuali duplicati:
How do I tell if a win32 application uses the .NET runtimeCome sapere se un processo ".exe" è stato scritto con C++ o C#?

C'è un modo per riconoscere manualmente se uno specifico processo di ".exe" è stato scritto in C++ (codice non gestito) oppure con C# (il codice gestito) ?

+2

Posso già dire che c'è un modo, dal momento che Process Explorer lo fa. Ora dobbiamo scoprire come: p –

+0

Prova a colpire l'exe con [Reflector] [1] per vedere cosa succede. [1]: http://stackoverflow.com/questions/214764/best-free-decompiler-for-c-sharp-with-vs-integration – jp2code

+1

Si noti che i programmi scritti in VB.NET generare il stesso "tipo" di eseguibile di quelli scritti in C#, e puoi solo indovinare cosa è stato usato per creare l'applicazione non gestita. Come menzionato dagli altri, puoi distinguere unmanaged dal codice gestito. –

risposta

8

Se si sta cercando di determinare se un processo è un processo NET, posso suggerire una soluzione ispirata dalla risposta Dave Van den Eynde In questo argomento: How do I tell if a win32 application uses the .NET runtime

"Un'applicazione è un eseguibile .NET se richiede l'esecuzione di mscoree.dll.".

Detto questo, si controllano i moduli del processo per vedere se mscoree è elencato.

 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

Does "mscoree.dll" è la risorsa dll principale di un codice binnary gestito da C#? Posso fidarmi che non esiste un binario C++ che usa la stessa dll? – Diogo

+0

Non è una libreria gestita, ma tutto in questa DLL è correlato a .NET Framework. Non garantisce che il processo sia una pura applicazione .NET, ma per lo meno ospita un codice .NET. Ad esempio, se carichi un componente aggiuntivo .NET in Microsoft Word, questa dll verrà visualizzata nei moduli, anche se Word non è un'applicazione .NET di per sé. –

+1

Perché un'app console scritta in C# non viene visualizzata come app gestita quando si utilizza questo modo per verificare? – stt106

2

È possibile eseguire peverify o ildasm (disponibile dall'ambiente della riga di comando di Visual Studio) sul file e vi darà un errore se non è un codice gestito. Si noti che ciò non riuscirà in alcuni casi quando utilizzano un sistema di protezione che crittografa l'IL e nasconde il bootloader CLR, ma la maggior parte dei programmi non ha questa protezione.

1

Se è un exe .NET (o dll è per questo), avrà una dipendenza da mscoree.dll quale si può vedere esaminando con Dependency Walker o qualcosa di simile.

Se si desidera farlo in modo programmatico, è possibile prendere this VB project come punto di partenza.

Questo non vi dirà la lingua di sicuro però. Non è possibile indicare un C# da un programma VB.NET (o altro linguaggio .NET) o un C++ da un programma C (o un altro linguaggio non .NET). Ci sono alcune cose che possono escludere l'una o l'altra come l'unica lingua utilizzata, o rendere più probabile l'una o l'altra. Ci potrebbe anche essere codice non gestito facendo uso di mscoree.dll in qualche modo strano.