2011-12-08 10 views
13

Powiel możliwe:
How do I tell if a win32 application uses the .NET runtimeJak sprawdzić, czy proces ".exe" został napisany przy użyciu C++ lub C#?

Jest na to sposób, aby ręcznie rozpoznać, czy dany proces ".exe" został napisany w C++ (kod niekontrolowana) lub C# (kod zarządzany) ?

+2

Mogę już powiedzieć, że jest sposób, ponieważ Process Explorer to robi. Teraz musimy dowiedzieć się, jak: p –

+0

Spróbuj uderzyć exe za pomocą [Reflektora] [1], aby zobaczyć, co się pojawi. [1]: http://stackoverflow.com/questions/214764/best-free-decompiler-for-c-sharp-with-vs-integration – jp2code

+1

Zauważ, że programy napisane w VB.NET generowania ten sam "typ" pliku wykonywalnego, jak te napisane w języku C#, i można tylko zgadywać, co zostało użyte do utworzenia aplikacji niezarządzanej. Jak wspomnieli inni, można odróżnić niezarządzanego od zarządzanego kodu. –

Odpowiedz

8

Jeśli starasz się ustalić, czy proces jest procesem NET, mogę zaproponować rozwiązanie inspirowane z odpowiedzią Dave Van den Eynde za w tym temacie: How do I tell if a win32 application uses the .NET runtime

"Aplikacja jest plikiem .NET, jeśli wymaga uruchomienia mscoree.dll.".

Biorąc to pod uwagę, sprawdzamy moduły procesów, aby sprawdzić, czy na liście znajduje się mscoree.

 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

Czy "mscoree.dll" jest głównym zasobem biblioteki DLL kodu zarządzanego w języku C#? Czy mogę zaufać, że nie ma binarny C++, który używa tej samej biblioteki dll? – Diogo

+0

Nie jest to biblioteka zarządzana, ale wszystko w tej bibliotece DLL jest powiązane z .NET Framework. Nie gwarantuje to, że proces jest czystą aplikacją .NET, ale przynajmniej zawiera trochę kodu .NET. Na przykład, jeśli załadujesz dodatek .NET do programu Microsoft Word, ta biblioteka dll pojawi się w modułach, mimo że program Word nie jest aplikacją .NET. –

+1

Dlaczego aplikacja konsolowa napisana w języku C# nie jest wyświetlana jako aplikacja zarządzana, gdy używa się tej metody do sprawdzania? – stt106

2

Można uruchomić peverify lub ildazm (dostępne w środowisku wiersza poleceń programu Visual Studio) i spowoduje to błąd, jeśli nie jest to kod zarządzany. Zauważ, że to się nie powiedzie w niektórych przypadkach, gdy używają systemu ochrony, który szyfruje IL i ukrywa bootloader CLR, ale większość programów nie ma tego zabezpieczenia.

1

Jeśli jest to exe .NET (lub .dll dla tej sprawy), będzie to miało uzależnienie od Mscoree.dll które można zobaczyć badając ją Dependency Walker lub coś podobnego.

Jeśli chcesz zrobić to programowo, możesz wziąć this VB project jako punkt wyjścia.

Na pewno nie powie Ci tego języka. Nie można powiedzieć C# z programu VB.NET (lub innego języka .NET) lub C++ z programu C (lub innego języka .NET). Są pewne rzeczy, które mogą rządzić jednym lub drugim jako jedynym używanym językiem, lub sprawiają, że jedno lub drugie jest bardziej prawdopodobne. Może istnieć nawet niezarządzany kod wykorzystujący mscoree.dll w jakiś dziwny sposób.

Powiązane problemy