На главную

Библиотека Интернет Индустрии I2R.ru

Rambler's Top100

Малобюджетные сайты...

Продвижение веб-сайта...

Контент и авторское право...

Забобрить эту страницу! Забобрить! Блог Библиотека Сайтостроительства на toodoo
  Поиск:   
Рассылки для занятых...»
I2R » Хакеры и безопасность » Вирусы

Вирусы для среды .NET CLR

Сегодня весь компьютерный мир говорит о новой платформе Microsoft. Реализация, которую мы имеем на сегодняшний день (Январь 2002) известна как .NET FrameWork SDK и предоставляет нам набор базовых сервисов. Также уже существует вторая бета-версия Microsoft Visual Studio.NET (когда я переводил эту статью у меня уже лежал релиз Studio .NET, но это совсем не значит, что в статье что-то стало не актуальным. прим.пер.), новой визуальной среды предназначенной для создания приложений .NET. Я написал эту статью потому, что я не могу сидеть и ждать пока кто-нибудь проведет похожие исследования вместо меня. Ну, вы меня знаете - я довольно странный парень. Итак я начинаю...

Что такое MS .NET?

Microsoft .NET - это новая, основанная на компонентах, платформенно независимая архитектура. Описание .NET может занять несколько килобайт текста и я постараюсь выбирать лишь самое главное. .NET FrameWork SDK - это набор приложений предоставляющих нам функциональность .NET на наших non-dotnet операционных системах. Полностью .NET ОС будет выпущена как второй потомок WinXP. Однако, Microsoft пытается пропагандировать свою новую платформу точно также как в свое время это происходило с Win32s - ограниченная Win32 среда для Win16 систем. Сегодня у нас есть .NET FrameWork SDK - по сравнению с полноценной .NET архитектурой функциональности соотносятся примерно так же, как Win32s с Win32. .NET FrameWork SDK предоставляет нам среду .NET Common Language Runtime. Это сердце .NET и именно о ней пойдет речь в этой статье.

(Я опустил исторический обзор и начало введения в среду исполнения [сейчас подобных материалов на русском языке достаточно]. прим.пер)

Сборка - не просто обычный EXE-файл - это целое приложение в одном файле. Сборки содержат всю необходимую программе информацию. Представьте себе сборку как исполняемый файл (EXE), компоненты (DLL/OCX), библиотеки типов (TLB), ресурсы (RES) и так далее, собранные вместе. Файл будет содержать метаданные, данные программы и другую информацию, необходимую для выполнения. Каждая сборка содержит список всех своих компонентов - манифест.

MSIL

Мы рассмотрели необходимый нам минимум внутреннего устройства .NET CLR. Теперь попытаемся понять как устроен метакод (MicroSoft Intermediate Language). Создадим такой шаблон в C# (sample.cs): 

<------------------ врезка ------------------> 

using System; 
class Sample { 
            public static void Main () {
                        Console.WriteLine("Hello world");
            }
} 

<------------------ врезка ------------------> 

Компилируем так: CSC sample.cs и получаем новый исполняемый файл sample.exe. Открыв его в любом просмотрщике вы сразу увидите, что это не стандартный PE File. Он не содержит кода, зато в нем достаточно "странных" структур. Вы смотрите на скомпилированную в MSIL программу sample.cs. 

Теперь запустим ILDASM.EXE и получим код проекта в MSIL. Структура файла представлена в виде дерева: 

<------------------ врезка ------------------> 

___[MOD] D:\!!work\.net\sample.exe
   |      M A N I F E S T
   |___[CLS] Sample
   |   |     .class private auto ansi beforefieldinit
   |   |___[MET] method .ctor : void()
   |   |___[STM] method Main : void()
   | 

<------------------ врезка ------------------> 

Если удалить все ненужную информацию (комментарии, ресурсы, лишний код..), то вы увидите вот это (sample.il): 

<------------------ врезка ------------------> 

assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 1:0:2411:0
}
.assembly sample
{
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module sample.exe
.imagebase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001
.class private auto ansi beforefieldinit Sample
       extends [mscorlib]System.Object
{
  .method public hidebysig static
          void  Main() cil managed
  {
    .entrypoint
    // Method begins at RVA 0x2050
    // Code size       11 (0xb)
    .maxstack  8
    IL_0000:  /* 72   | (70)000001 */ ldstr      "Hello world"
    IL_0005:  /* 28   | (0A)000001 */ call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  /* 2A   |            */ ret
  }
} 

<------------------ врезка ------------------> 

Это и есть метаданные. Выглядят они достаточно просто и я думаю у программистов не должно возникнуть проблем с интуитивным пониманием этого кода. Возможно стоит объяснить что такое "mscorlib" - на самом деле это динамически присоединяемая библиотека, хранящаяся у вас на диске и содержащая все библиотеки базовых классов. 

Теперь, когда мы удалили из MSIL кода все лишнее (лишнее, но не по мнению компилятора) запускаем ILASM.EXE и восстанавливаем MSIL EXE: ILASM sample.il 

Получили два килобайта чистого <Хелло Ворда>. 

Что делаем теперь? Предлагаю изучить структуру файла. Что же делает из обычного PE File исполняемый файл MSIL? Посмотрите не это: 

<------------------ врезка ------------------> 

File type: WINDOWS EXECUTABLE  
File Header:
  Machine:                       0x014C (Intel x86)
  Number of Sections:            2
  Time Date Stamp:               0x3C3886C7 (6. 1. 2002 18:17:59)
  Pointer to Symbol Table:       0x00000000
  Number of Symbols:             0
  Size of Optional Header:       0x00E0 (224)
  Characteristics:               0x010E
    File is executable.
    Line numbers stripped from file.
    Local symbols stripped from file.
    32 bit word machine.  

Optional Header:
  Magic:                         0x010B
  Linker Version:                6.00
  Size of Code:                  0x00000400 (1024)
  Size of Initialized Data:      0x00000200 (512)
  Size of Uninitialized Data:    0x00000000 (0)
  Adress of Entry Point:         0x0000229E
  Base of Code:                  0x00002000
  Base of Data:                  0x00004000
  Image Base:                    0x00400000
  Section Align:                 0x00002000
  File Align:                    0x00000200
  Operating System Version:      4.00
  Image Version:                 0.00
  Subsystem Version:             4.00
  Size of Image:                 0x00006000 (24576)
  Size of Headers:               0x00000200 (512)
  Checksum:                      0x00000000
  Subsystem:                     0x0003 (Windows character subsytem)
  DLL Characteristics:           0x0000
  Size of Stack Reserve:         0x00100000 (1048576)
  Size of Stack Commit:          0x00001000 (4096)
  Size of Heap Reserve:          0x00100000 (1048576)
  Size of Heap Commit:           0x00001000 (4096)
  Loader Flags:                  0x00000000
  Number of Rva and Sizes:       16 

<------------------ врезка ------------------> 

Заголовок выглядит абсолютно нормально. Смотрим ниже. 

<------------------ врезка ------------------> 

Data Directory:
  Export directory:               VA: 0           Size: 0
  Import directory:               VA: 0x00002250  Size: 0x0000004B (75)
  Resource directory:             VA: 0           Size: 0
  Exception directory:            VA: 0           Size: 0
  Security directory:             VA: 0           Size: 0
  Base relocation table:          VA: 0x00004000  Size: 0x0000000C (12)
  Debug directory:                VA: 0           Size: 0
  Architecture-specific data:     VA: 0           Size: 0
  RVA of global pointer:          VA: 0           Size: 0
  Thread local storage directory: VA: 0           Size: 0
  Load configuration directory:   VA: 0           Size: 0
  Bound import directory:         VA: 0           Size: 0
  Import address table:           VA: 0x00002000  Size: 0x00000008 (8)
  Delay load import descriptors:  VA: 0           Size: 0
  COM run-time descriptor:        VA: 0x00002008  Size: 0x00000048 (72)
  (unknown directory entry):      VA: 0           Size: 0 

Import Table:
  mscoree.dll
    Import Adress Table:                0x00002000
    Import Name Table:                  0x00002278
    Time Date Stamp:                    0x00000000
    Index of first forwarder reference: 0x00000000  

    0x00002280         0   _CorExeMain 

Section Table:
  Section Header #1
    Name:                             .text
    Virtual Size:                     0x000002A4 (676)
    Virtual Address:                  0x00002000
    Size of Raw Data:                 0x00000400 (1024)
    File Pointer to Raw Data:         0x00000200
    File Pointer to Relocation Table: 0x00000000
    File Pointer to Line Numbers:     0x00000000
    Number of Relocations:            0
    Number of Line Numbers:           0
    Characteristics:                  0x60000020
      Section contains code.
      Section is executable.
      Section is readable. 

  Section Header #2

    Name:                             .reloc
    Virtual Size:                     0x0000000C (12)
    Virtual Address:                  0x00004000
    Size of Raw Data:                 0x00000200 (512)
    File Pointer to Raw Data:         0x00000600
    File Pointer to Relocation Table: 0x00000000
    File Pointer to Line Numbers:     0x00000000
    Number of Relocations:            0
    Number of Line Numbers:           0
    Characteristics:                  0x42000040
      Section contains initialized data.
      Section can be discarded.
      Section is readable. 

<------------------ врезка ------------------> 

Вот оно! Просматривая структуру файла можно заметить, что MSIL PE файл состоит из ОДНОЙ секции ".text". программа импортирует только API функцию "_CorExeMain" и точка входа, установленая на инструкцию 40229Eh: 

:0040229E FF2500204000   jmp    [SAMPLE.00402000] 

осуществляет переход на эту функцию внутри MSCOREE.DLL. Очевидно, что _CorExeMain - это движок, вызываемый любой программой в начале исполнения и осуществляющий трансляцию метакода.  

Первые 8 байт секции ".text" зарезервированы для виртуального адреса _CorExeMain API, а следующие 72 байта для заголовка CLR. Первый байт заголовка содержит его размер (72 байта). Затем следуют записи с информацией о файле (флаги, версия компилятора, точка входа) и после этого можно увидеть каталог данных (data directory), как и в привычном PE заголовке.

Обычное содержимое этой структуры - каталог метаданных, ресурсов, Strong Name сигнатуры, таблицы CodeManager, VTableFixups каталог, каталог экспортируемых адресов и прекомпилируемый заголовок. Также в каталоге хранится RVA точки входа. Метаданные обычно начинаются с 80-го байта (402050h), а первая запись в каталоге данных (402010h) хранит указатель на метаданные. 

Все последующие мысли вполне могут быть моими спекуляциями и догадками. Я не уверен в этих вещах и только мой опыт позволяет мне утверждать, что это может быть так. Если у вас есть более точная информация - пожалуйста свяжитесь со мной.

Похоже, что первый(е) байт(ы) (402050h) - это зависящие от метода\модуля записи и непосредственно за ними следуют метаданные. Я заметил, что записи метаданных всегда хранятся ниже метакода. 424A5342h ("BSJB") похоже на magic number каталога метаданных, а за ним записаныo флаги и внутренние записи (имена и токены содержащихся в классе методов, атрибутов, свойств и т.д.)  

Я надеюсь что где-нибудь в сети появится документация по внутренним форматам MSIL/CLR, которая позволит нам лучше понять эти вещи.  

Заключение

Итак, что же полезного можно извлечь из этого исследования? Во-первых похоже на то, что Microsoft не собирается менять опкоды и это исследование может быть продолжено более детально. Также при помощи MSDN и утилит поставляемых с .NET возможно создание кода, перезаписывающего MSIL PE файл на основе собранной в этом исследовании информации. Если кто-то досконально разберется со структурой заголовка CLR, то я уверен, что появление первого MSIL .NET вируса не заставит долго себя ждать. Если существуют инфекторы Java, то почему бы не быть созданному и вирусу под эту платформу?

Benny, перевод wirepuller
Industrial safety

Рассылки Subscribe.Ru
Все о защите данных на Идваре
Другие разделы
Прочие опасности
Вирусы
Хакеры
Киберпреступность
Уязвимость ПО
Новое в разделе
Защита данных
I2R-Журналы
I2R Business
I2R Web Creation
I2R Computer
рассылки библиотеки +
И2Р Программы
Всё о Windows
Программирование
Софт
Мир Linux
Галерея Попова
Каталог I2R
Партнеры
Amicus Studio
NunDesign
Горящие путевки, идеи путешествийMegaTIS.Ru

2000-2008 г.   
Все авторские права соблюдены.
Rambler's Top100