Мы можем проверить, используют ли запущенное приложение или программа платформу .NET для выполнения себя?
Есть трюк, который я однажды выучил из списка вопросов для интервью Скотта Хэнселмана . Вы можете легко перечислить все программы, выполняющие .NET в командной строке, используя:
tasklist /m "mscor*"
Он перечислит все процессы, которые имеют mscor*
среди загруженных модулей.
Аналогичный метод можно применить и в коде:
public static bool IsDotNetProcess(this Process process)
{
var modules = process.Modules.Cast<ProcessModule>().Where(
m => m.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase));
return modules.Any();
}
Используйте System.reflection.Assembly.loadFrom
Функция для загрузки файла .exe. Эта функция бросит исключение, если вы попытаетесь загрузить двоичный файл, который не является .NET assuse.
Я предлагаю загрузку dotnetreflector redgate's dotnetreflector и проверяю, может ли он открыть приложение.
Используйте интерфейсы CLR COM ICORPUBLISH и ICORPUBLISHPROCSESS. Самый простой способ сделать это от C # - заимствовать какой-нибудь код от отладчика Sharpdevelop и выполните следующие действия:
ICorPublish publish = new ICorPublish();
ICorPublishProcess process;
process = publish.GetProcess(PidToCheck);
if (process == null || !process.IsManaged)
{
// Not managed.
}
else
{
// Managed.
}
Программно вы получите начальное имя изображения с использованием API Win32, подобных NTQueryInformationProcess
, или в использовании .Net System.diagnostics.process.getProcesses ()
и прочитать process.startinfo.filename
.
Затем открыть и декодируйте заголовки PE этого изображения с использованием деталей, предписанных в статье MSDN ниже:
http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Предостережения: только обнаруживать .NET встроенные сборки, например, Не обнаружит Win32 EXES динамически хостинг CLR с использованием APIS CONHOST.