внутри сети ДРОЗДОВ АНДРЕЙ AKA SULVERUS Спецвыпуск: Хакер, номер #072, стр. 072-044-5 Далее начинается проверка для каждой инструкции, - являются ли безопасной инструкция из взятого массива относительно созданной конфигурации стека. В случае отрицательного результата верифицируемый массив считается небезопасным, в обратном случае моделируется выполнение инструкции для вычисления конфигурации стека после ее реального выполнения и определяется, куда может быть передано управление после выполнения этой инструкции. Далее идет проверка на совместимость конфигураций. После всех проверок, если все инструкции являются верифицируемыми, код допускается в систему выполнения. [Common Language Runtime.] Если приложение использует много ресурсов, взаимодействует с какими-либо сервисами и другими приложениями, то оно должно каким-то образом обмениваться данными с ними. Для этого и был придуман общий язык выполнения - Common Language Runtime(CLR). Поскольку весь код транслируется в CIL, язык, на котором была написана та или иная сборка или программа, не имеет значения. Выполнение программ полностью контролируется CLR, он управляется Just-In-Time компиляцией, верификатором кода и информацией о состоянии программы. Таким образом, если два объекта находятся на одном компьютере, благодаря особенностям платформы .NET они могут легко общаться независимо от языка программирования, на котором они написаны. Для CLR любая сборка может импортировать типы из других сборок и использовать их. Существует еще две технологии: импортирование сборок через рефлексию кода и недокументируемая технология туннелей, позволяющая взаимодействовать приложениям подобно взаимодействию через Socket'ы, но о ней известно очень мало. [немного о PE.] В принципе, PE в .NET не сильно отличается от PE в Win32, просто некоторые параметры обнулены, а некоторые используются не по назначению. Это и является лакомым кусочком для вирусописателей. Поскольку в PE добавился CLI PE Header, очень многие параметры в других заголовках обнуляют. О PE-заголовке написано уже порядочно, поэтому в данной статье я расскажу только про CLI-заголовок. Относительно всего PE-файла CLI Header считается дополнительной секцией PE, (раньше она называлась необязательной). В необязательные секции PE-файла входили секции импорта и релокаций. С появлением CLI был введен заголовок, содержащий в себе данные о метаданных .NET. Структура CLI-заголовка long Cb; //Длина заголовка short MajorRuntimeVersion; //Старшая версия системы выполнения .NET short MinorRuntimeVersion; //Младшая версия системы выполнения .NET struct {long RVA, Size; } Metadata; //RVA - размер метаданных в PE-файле long Flags; //Свойства сборки .NET long EntryPointToken; //Адрес точки входа в сборку .NET struct { long RVA, Size; } Resources; //RVA и размер ресурсов сборки. struct { long RVA, Size; } StrongNameSignature; //RVA и размер данных, используемых загрузчиком CLI для контроля версий DLL. long CodeManagerTable[2]; //Не используются и всегда заполняются нулями |