Способ выполнения инструкций в системной памяти
Иллюстрации
Показать всеИзобретение относится к вычислительной технике. Технический результат заключается в организации выполнения инструкций, загруженных в системной памяти, путем попеременной передачи выполнения инструкций из одной области памяти в другую, отличную от той, выполнение инструкций в которой создало уведомление. Способ передачи выполнения инструкций из одной области памяти в другую, в котором определяют в оригинальной области памяти, состоящей из участков памяти, по меньшей мере, один интересующий участок памяти; создают область памяти дублированием интересующего участка памяти оригинальной области памяти; помечают все участки памяти в оригинальной области памяти; запускают выполнение инструкций, записанных в оригинальной области памяти, в любом из имеющихся участков памяти в оригинальной области памяти, кроме интересующего участка памяти; осуществляют выполнение инструкций в участках памяти оригинальной области памяти процессором до создания уведомления, при этом уведомление создается при передаче управления инструкции из участка памяти, помеченного одной меткой, в интересующий участок памяти, помеченный отличной меткой; передают выполнение инструкций из участка памяти оригинальной области памяти интересующему участку памяти, но в продублированной области памяти, после создания уведомления. 10 з.п. ф-лы, 8 ил.
Реферат
Область техники
Изобретение относится к способам управления исполнением машинных инструкций, а именно к способам передачи управления между областями памяти.
Уровень техники
В настоящее время современные технологии, предназначенные для формирования журнала вызовов API-функций во время исполнения программы, требуют вмешательства в содержимое адресного пространства процесса или файлов на диске, например изменение кода в системных библиотеках операционной системы в памяти и на диске. Изменения заключаются во «внедрении кода», отвечающего за механизм журналирования вызовов API-функций. Основными шагами данного механизма могут являться следующие шаги:
- перехват управления библиотекой (например, с помощью перехвата API функций путем изменения кода целевой функции);
- переход при вызове API в регион памяти, содержащий код обработчика, отвечающего за обработку API-функции и запись в журнал вызовов;
- выполнение кода обработчика системы журналирования;
- возврат управления библиотеке.
Для перехвата управления системой журналирования также могут быть использованы способы, заключающиеся в изменение адресов вызова API-функций из библиотек в таблице импорта исполняемого файла и/или помещения «промежуточной» библиотеки, к которой будет первоначальное обращение перед переходом к оригинальной вызываемой API-функции из оригинальной библиотеки.
Еще одним недостатком существующих систем журналирования является то, что известные системы журналирования, как правило, имеют трудности при их реализации на различных операционных системах и их версиях. Так обновление операционной системы может привести к тому, что система журналирования перестает работать, так как потребуется доработка (адаптация) под измененную версию.
Еще одним недостатком современных систем является то, что их присутствие может быть обнаружено вредоносными программами вне зависимости от их привилегий, так как практически любое «вторжение» в адресное пространство процесса может быть обнаружено.
На основании анализа существующего уровня техники становится ясно, что необходимо создание такой системы, которая не вносит изменения в анализируемую программу и, соответственно, не может быть обнаруженной.
Раскрытие изобретения
Настоящее изобретение предназначено для отслеживания выполнения программного кода процессором в физической памяти. Применением настоящего изобретения является формирования журнала вызовов API-функций, вызываемых во время исполнения программы.
Технический результат настоящего изобретения заключается в организации выполнения инструкций, загруженных в системной памяти, путем попеременной передачи выполнения инструкций из одной области памяти в другую, отличную от той, выполнение инструкций в которой создало уведомление.
Способ передачи выполнения инструкций из одной области памяти в другую, в котором: определяют в оригинальной области памяти, состоящей из участков памяти, по меньшей мере, один интересующий участок памяти; создают область памяти дублированием интересующего участка памяти оригинальной области памяти; помечают все участки памяти в оригинальной области памяти, при этом метки для интересующего участка памяти в оригинальной области памяти отличны от меток остальных участков памяти оригинальной области памяти; запускают выполнение инструкций, записанных в оригинальной области памяти, в любом из имеющихся участков памяти в оригинальной области памяти, кроме интересующего участка памяти; осуществляют выполнение инструкций в участках памяти оригинальной области памяти процессором до создания уведомления, при этом уведомление создается при передаче управления инструкции из участка памяти, помеченного одной меткой, в интересующий участок памяти, помеченный отличной меткой; передают выполнение инструкций из участка памяти оригинальной области памяти интересующему участку памяти, но в продублированной области памяти, после создания уведомления; осуществляют выполнение инструкций в интересующем участке памяти продублированной области памяти процессором до создания уведомления, при этом уведомление создается при любой передаче управления из интересующего участка продублированной области памяти; возвращают выполнение в оригинальную область памяти в соответствующий участок памяти.
В частном случае уведомление является исключением (exception), которое создается процессором и при передаче управления из интересующего участка памяти создается исключение Page Fault Exception.
В другом частном случае дублирование осуществляется копированием таблиц и каталогов. Продублированная область памяти может состоять из одного интересующего участка памяти, а в частном случае интересующий участок равен, по меньшей мере, одной странице.
В частном случае передают выполнение инструкций области памяти отличной от той, выполнение инструкций в которой создало уведомление, путем перезаписи адреса каталога страниц.
В еще одном частном случае участки памяти в области памяти помечают путем установки атрибутов в таблице страниц для страниц, на которых отображен участок и, например, страницы интересующего участка имеют атрибут «неисполняемые», а дубликаты страниц интересующего участка имеют атрибут «исполняемые».
Краткое описание чертежей
Сопровождающие чертежи включены для обеспечения дополнительного понимания изобретения и составляют часть этого описания, показывают варианты осуществления изобретения и совместно с описанием служат для объяснения принципов изобретения.
Заявленное изобретение поясняется следующими чертежами, на которых:
Фиг. 1 показывает пример компьютерной системы общего назначения;
Фиг. 2 показывает способ описания виртуальной памяти;
Фиг. 3 показывает принцип дублирования памяти;
Фиг. 4 показывает способ дублирования виртуальной памяти;
Фиг. 5 показывает алгоритм подготовки и механизма передачи управления выполнения инструкций от одной виртуальной области памяти другой;
Фиг. 6 показан пример памяти процесса, который создается ОС и примеры виртуального адресного пространства;
Фиг. 7 показаны основные шаги подготовки к работе системы журналирования;
Фиг. 8 показаны шаги работы системы журналирования.
Хотя изобретение может иметь различные модификации и альтернативные формы, характерные признаки, показанные в качестве примера на чертежах, будут описаны подробно. Следует понимать, однако, что цель описания заключается не в ограничении изобретения конкретным его воплощением. Наоборот, целью описания является охват всех изменений, модификаций, входящих в рамки данного изобретения, как это определено приложенной формулой.
Описание изобретения
Объекты и признаки настоящего изобретения, способы для достижения этих объектов и признаков станут очевидными посредством отсылки к примерным вариантам осуществления. Однако настоящее изобретение не ограничивается примерными вариантами осуществления, раскрытыми ниже, оно может воплощаться в различных видах. Приведенное описание предназначено для помощи специалисту в области техники для исчерпывающего понимания изобретения, которое определяется только в объеме приложенной формулы.
Фиг. 1 представляет пример компьютерной системы общего назначения, персональный компьютер или сервер 20, содержащий центральный процессор 21, системную память 22 и системную шину 23, которая содержит разные системные компоненты, в том числе память, связанную с центральным процессором 21. Системная шина 23 реализована, как любая известная из уровня техники шинная структура, содержащая в свою очередь память шины или контроллер памяти шины, периферийную шину и локальную шину, которая способна взаимодействовать с любой другой шинной архитектурой. Системная память содержит постоянное запоминающее устройство (ПЗУ) 24, память с произвольным доступом (ОЗУ) 25. Основная система ввода/вывода (BIOS) 26, содержит основные процедуры, которые обеспечивают передачу информации между элементами персонального компьютера 20, например, в момент загрузки операционной системы с использованием ПЗУ 24.
Персональный компьютер 20 в свою очередь содержит жесткий диск 27 для чтения и записи данных, привод магнитных дисков 28 для чтения и записи на сменные магнитные диски 29 и оптический привод 30 для чтения и записи на сменные оптические диски 31, такие как CD-ROM, DVD-ROM и иные оптические носители информации. Жесткий диск 27, привод магнитных дисков 28, оптический привод 30 соединены с системной шиной 23 через интерфейс жесткого диска 32, интерфейс магнитных дисков 33 и интерфейс оптического привода 34 соответственно. Приводы и соответствующие компьютерные носители информации представляют собой энергонезависимые средства хранения компьютерных инструкций, структур данных, программных модулей и прочих данных персонального компьютера 20.
Настоящее описание раскрывает реализацию системы, которая использует жесткий диск 27, сменный магнитный диск 29 и сменный оптический диск 31, но следует понимать, что возможно применение иных типов компьютерных носителей информации 56, которые способны хранить данные в доступной для чтения компьютером форме (твердотельные накопители, флеш карты памяти, цифровые диски, память с произвольным доступом (ОЗУ) и т.п.), которые подключены к системной шине 23 через контроллер 55.
Компьютер 20 имеет файловую систему 36, где хранится записанная операционная система 35, а также дополнительные программные приложения 37, другие программные модули 38 и данные программ 39. Пользователь имеет возможность вводить команды и информацию в персональный компьютер 20 посредством устройств ввода (клавиатуры 40, манипулятора «мышь» 42). Могут использоваться другие устройства ввода (не отображены): микрофон, джойстик, игровая консоль, сканер и т.п. Подобные устройства ввода по своему обычаю подключают к компьютерной системе 20 через последовательный порт 46, который в свою очередь подсоединен к системной шине, но могут быть подключены иным способом, например, при помощи параллельного порта, игрового порта или универсальной последовательной шины (USB). Монитор 47 или иной тип устройства отображения также подсоединен к системной шине 23 через интерфейс, такой как видеоадаптер 48. В дополнение к монитору 47, персональный компьютер может быть оснащен другими периферийными устройствами вывода (не отображены), например, колонками, принтером и т.п.
Персональный компьютер 20 способен работать в сетевом окружении, при этом используется сетевое соединение с другим или несколькими удаленными компьютерами 49. Удаленный компьютер (или компьютеры) 49 являются такими же персональными компьютерами или серверами, которые имеют большинство или все упомянутые элементы, отмеченные ранее при описании существа персонального компьютера 20, представленного на Фиг. 1. В вычислительной сети могут присутствовать также и другие устройства, например, маршрутизаторы, сетевые станции, пиринговые устройства или иные сетевые узлы.
Сетевые соединения могут образовывать локальную вычислительную сеть (LAN) 50 и глобальную вычислительную сеть (WAN). Такие сети применяются в корпоративных компьютерных сетях, внутренних сетях компаний и, как правило, имеют доступ к сети Интернет. В LAN- или WAN-сетях персональный компьютер 20 подключен к локальной сети 50 через сетевой адаптер или сетевой интерфейс 51. При использовании сетей персональный компьютер 20 может использовать модем 54 или иные средства обеспечения связи с глобальной вычислительной сетью, такой как Интернет. Модем 54, который является внутренним или внешним устройством, подключен к системной шине 23 посредством последовательного порта 46. Следует уточнить, что сетевые соединения являются лишь примерными и не обязаны отображать точную конфигурацию сети, то есть в действительности существуют иные способы установления соединения техническими средствами связи одного компьютера с другим.
Память с произвольным доступом 25, часть системной памяти 22, которая в рамках данной заявки будет именоваться как физическая память, вся физическая память делится на физические страницы 100, пример разделения приведен на Фиг. 2. Набор адресов для адресации физической памяти образуют физическое адресное пространство. Так как размер физической памяти ограничен, для исполнения программ создана виртуальная память, набор адресов для адресации виртуальной памяти образует виртуальное адресное пространство. Под виртуальной памятью в рамках данной заявки понимается совокупность логических страниц в совокупности со структурами, которые эти страницы описывают (указатель на каталог страниц, каталог страниц, таблица страниц). Указанные структуры будут описаны ниже. В рамках данной заявки понятия виртуальное адресное пространство и виртуальная память тождественны.
Виртуальное адресное пространство делится на логические страницы 100а. Логическая страница имеет свой виртуальный адрес, и может быть отображена на любой физический адрес, как это показано на Фиг. 2. Таким образом, логические страницы соответствуют физическим страницам или другими словами, логические страницы отображаются на физические страницы. Логические страницы, в частном случае отображаются на физические страницы в произвольном порядке, как это изображено на Фиг. 2. В другом частном случае логические страницы тождественно отображаются на физические страницы. На одну физическую страницу может отображаться несколько логических страниц.
Логические страницы 100а являются виртуальными объектами (то есть реально не существующими в отличии от физических страниц 100) и каждая такая страница имеет в частном случае два адреса:
- линейный - тот, по которому она расположена в адресном пространстве;
- физический - тот, на который она отображена в физической памяти компьютера 25, в некоторых случаях его может не быть.
Виртуальная память, это некоторый способ использования системной памяти 22 на локальном компьютере, а в частном случае - на локальном компьютере и удаленном компьютере. Благодаря страничной организации памяти возможно реализовать механизм виртуальной памяти с управлением на уровне процессора. Логическую страницу памяти можно выгрузить, например, на жесткий диск 24, при этом убрав ее содержимое из физической памяти 25, размер реально используемой виртуальной памяти значительно возрастает и уже ограничен размером доступных жестких дисков, при этом необязательно, что жесткие диски, на которые выгружаются страницы, должны располагаться на локальном компьютере.
Механизм описания виртуальной памяти при обычной, 32-разрядной страничной адресации (англ. paging), представлен на Фиг. 2. Для описания страницы может использоваться структура данных, состоящая из физического адреса, на который отображена страница, и флагов(атрибутов), определяющих свойства этой страницы. Информация о 32-разрядном адресе начала страницы находится в старших 20 разрядах - они и хранятся в описании страницы. Описания страниц группируются в таблицы страниц 101. Описатели страниц - это 4-байтовые элементы (entries). Эти элементы называются PTE (Page Table Entries) и представляют собой указатели на страницы, по формату - структуры данных, которые описаны в документе «Intel® 64 and IA-32 Architectures Software Developer's Manual» (стр. 4-12 - 4-16). Таблицы страниц группируются в каталог страниц 102. Каталог страниц 102 - это массив размером в 4Кб, состоящий из 4-байтовых элементов PDE (Page Directory Entries). Каждый элемент указывает на таблицу страниц 101 и по формату почти совпадает с РТЕ. Элемент PDE определяет положение таблицы страниц, указывая адрес физической страницы памяти, а также атрибуты таблицы страниц. Формат PDE описан в документе «Intel® 64 and IA-32 Architectures Software Developer's Manual» (стр. 4-12 - 4-16). Для того чтобы процессор мог использовать страничное преобразование, ему необходимо указать адрес начала каталога страниц 103 (англ. Page Directory Base - PDB). Этот адрес хранится в регистре CR3.
Итак, для адресации в 32-разрядном адресном пространстве, для того чтобы указать номер страницы в таблице страниц, необходимо 10-разрядное значение (т.к. в таблице хранится 1024 описания страниц). Для того чтобы указать, какая именно таблица в каталоге страниц будет использоваться, также требуется 10-разрядное значение. Для того чтобы указать смещение внутри страницы, необходимо 12-разрядное значение. Если сложить размеры этих значений, то получается, что для доступа к памяти нужно задать 32-разрядную структуры данных: 10 бит - номер таблицы, еще 10 - номер страницы в таблице и 12 - смещение внутри самой страницы.
В случае, когда используется режим адресации РАЕ (Physical Address Extension), добавляется дополнительный уровень иерархии - таблица каталогов страниц 104, которая содержит PDPTE (Page-Directory-Pointer-Table Entry) элементы. В данном случае CR3 регистр содержит физический адрес 105 выровненной таблицы каталогов страниц 104. Более подробно указанный режим и формат PDE, PTE, PDPTE элементов для данного режима описаны в документе «Intel® 64 and IA-32 Architectures Software Developer's Мanual»_(стр. 4-17 - 4-25).
В случае, когда используется режим 1А-32е, к таблице страниц, каталогу страниц и таблице каталогов добавляется дополнительный уровень иерархии - таблица уровней страничной адресации 107, которая содержит PML4E (Page Map Level Entry) элементы. В данном случае CR3 регистр 106 содержит структуру, в которой указан физический адрес 108 выровненной таблицы уровней страничной адресации 107. Более подробно указанный режим и формат PDE, PTE, PDPTE, PML4E элементов для данного режима описаны в документе «Intel® 64 and IA-32 Architectures Software Developer's Manual» (стр. 4-26 - 4-39).
При запуске программы операционная система создает процесс, в рамках которого будут исполняться его потоки. Файл программы загружается в некоторую область физической памяти компьютера. В случае использования виртуальной памяти файл загружается в некоторую область виртуальной памяти, на которую система отображает некоторый пул физических адресов. Затем программа начинает выполняться, то есть процессор выполняет машинные инструкции в той последовательности, в какой они записаны в файле программы. Процесс, создаваемый операционной системой, является, по сути, контейнером ресурсов, необходимых для выполнения кода программы. В частном случае в многозадачной операционной системе каждому процессу соответствует собственное виртуальное адресное пространство. Из описания механизма адресации виртуального адресного пространства следует, что чтобы получить доступ к виртуальному адресному пространству процесса, необходим доступ к регистру управления CR3 106. Управляя структурами и их элементами, к которым получают доступ на основании информации содержащейся в регистре управления CR3 106, управляют виртуальным адресным пространством процесса. В частном случае реализации, при 32-разрядной адресации, каждый процесс имеет свой каталог страниц, и, соответственно, при переключении между процессами осуществляется перезапись CR3 регистра 106, который хранит физический адрес выровненного каталога страниц. Программе совсем не обязательно определять все страницы, таблицы и элементы каталога, достаточно определить только те, которые реально будут использоваться и динамически добавлять или убирать новые описания в процессе работы.
На Фиг. 3 изображена часть системной памяти 22 в некоторой области 301 которой записаны инструкции для выполнения. Под областью памяти в одном частном случае понимается область физической памяти, в другом частном случае под областью памяти понимается область системной памяти, на которую отображены логические страницы, то есть область виртуальной памяти. Для осуществления подконтрольного выполнения программы в оригинальной области памяти 301 определяют интересующий участок. Интересующим участком области памяти является любой участок области памяти, при передаче управления инструкциям которого необходимо создать уведомление. В частной интерпретации интересующий участок- это некоторый участок в некоторой области памяти, который выделяют среди других на основании некоторых признаков, определяющих содержание участка, его расположение, назначение. Интересующими участками в частном случае являются участки области памяти, содержащие программные инструкции, при передаче управления которым необходимо проверить состояние регистров, для того чтобы оценить последовательность выполнения программных инструкций. Также интересующий участок может объединять набор инструкций, предназначенных для выполнения некоторого действия (обращение к жесткому диску, передача информации по сети и т.д.).
Далее осуществляют дублирование участков оригинальной области памяти, где дублируют, по меньшей мере, интересующий участок 303. Дублирование памяти осуществляют разными способами. В одном частном случае осуществляется непосредственное копирование инструкций и данных участка в другую область памяти 301а, как это изображено на Фиг. 3. Таким образом, в физической памяти появляются участки с идентичным содержимым. В другом частном случае копирование данных не происходит, создаются новые каталоги 102 и таблицы страниц 101, указывающие на те же самые области физической памяти (Фиг. 4).
Далее помечают участки памяти в оригинальной области памяти 301, при этом метки для интересующих участков 303 отличны от меток остальных участков 304 оригинальной области. В качестве меток может использоваться модификация байт инструкций участка памяти. В другом частном случае сами инструкции и данные никак не изменяются, а меняются атрибуты в структурах, описывающих эти участки. Например, страницам интересующего участка выставляют атрибут неисполняемые, а страницам остальных участков выставляют атрибут исполняемые. Также можно использовать атрибуты чтения/записи и другие. На следующем шаге помечают участки в продублированной области памяти 301а, при этом метки для интересующего участка отличны от меток остальных участков продублированной области памяти 301а. В одном частном случае для продублированного участка 303а применяются те же самые метки, что и для оригинального 303, в другом частном случае применяются другие метки. Например, в оригинальной области памяти страницам интересующего участка 303 выставляют атрибут «неисполняемые», а страницам других участков 304 оригинальной области выставляют атрибут «исполняемые», участки которые имели атрибут «неисполняемые», сохранят этот атрибут. Для продублированной области 301а выполняют инверсию атрибутов, где страницам интересующего участка выставляют атрибут «исполняемые», а страницам остальных участков выставляют атрибут «неисполняемые». Далее выбирается область памяти для выполнения инструкций, которые она содержит процессором.
После вышеописанных манипуляций осуществляют выполнение инструкций в выбранной области памяти процессором, до появления уведомления, где уведомление создается при передаче управления инструкции из участка, помеченного одной меткой, в участок области, помеченный отличной меткой. Такими уведомлениями могут быть, по меньшей мере, исключения и прерывания. Прерывания и исключения - события, означающие что где-то в системе (оборудовании) или внутри текущей выполняющейся программы или задачи возникло состояние, требующее немедленного внимания процессора. Прерывания и исключения приводят к принудительной передаче управления от текущей выполняемой программы или задачи к специальной программной процедуре или задаче, называемой обработчиком прерывания или обработчиком исключения. Действие в ответ на прерывание или исключение - обработка прерывания или исключения.
Исключения возникают, когда процессор определяет возникновение ошибки в процессе выполнения инструкции. Возможные варианты прерываний и исключений описаны в документе «Intel® 64 and IA-32 Architectures Software Developer's Manual» (p. 6-1 - 6-68).
В частном случае обработкой полученного уведомления является передача выполнения инструкций области памяти отличной от той, в которой создано уведомление. Например, если выполнение осуществлялось в оригинальной области памяти 301, выполнение передают дублированной области памяти 301а, и если выполнение осуществлялось в дублированной области памяти 301а, выполнение передают оригинальной области памяти 301 или другой продублированной области памяти. Передача выполнения осуществляется разными способами, в зависимости от способа, которым осуществлялось дублирование участков оригинальной области памяти. В одном частном случае изменяется адрес следующей инструкции выполнения, а в другом частном случае все адреса остаются неизменными, изменяется лишь значение регистра управления CR3 106, как это показано на Фиг. 4.
На Фиг. 5 представлен алгоритм передачи управления выполнения инструкций от одной виртуальной области памяти, другой. На этапе 500 определяют в оригинальной виртуальной области памяти интересующий участок памяти, который состоит, по меньшей мере, из одной логической страницы. На следующем этапе 501 создают, по меньшей мере, еще одну виртуальную область памяти, которая в частном случае отображена на те же физические страницы, что и оригинальная виртуальная область памяти. Для этого создают каталог страниц и, по меньшей мере, одну таблицу страниц. Для создания виртуальной области памяти, в частном случае копируют РТЕ и PDE оригинальной виртуальной области.
Далее, на этапе 502, помечают участки в оригинальной виртуальной области памяти, при этом метки для интересующего участка отличны от меток остальных участков оригинальной области, в частном случае для этого используется бит NX в структуре РТЕ: в частном случае для страниц интересующего участка бит может быть установлен, для страниц других участков данный бит сбрасывается, в другом частном случае для страниц интересующего участка бит сбрасывается, для страниц других участков данный бит устанавливается. После установки меток в оригинальной области на этапе 503 помечают участки, в по меньшей мере одной, созданной продублированной области памяти, при этом метки для интересующего участка отличны от меток остальных участков продублированной области памяти. В частном случае на данном шаге применяется тот же механизм установки NX бита, что и для оригинального участка. В частном случае применяется инверсия, то есть если в оригинальной области памяти NX бит для страниц интересующего участка сброшен, то в дубликате оригинальной области для страниц интересующего участка данный бит устанавливается. В других частных случаях для меток страниц участков используются другие биты PDE и РТЕ структур, например, R/W бит. Еще в одном частном случае биты комбинируются, например, для оригинальной виртуальной области используют бит NX, для дубликатов виртуальной области R/W бит.
На этапе 504 выбирают область памяти, для выполнения записанных в ней инструкций. В зависимости от целей для которых используют переключение между областями (журналирование, отладка, противодействие эксплуатации уязвимостям и т.д.) выбирают оригинальную область памяти или одну из продублированных областей памяти.
На этапе 505 осуществляют выполнение инструкций в выбранной области памяти процессором до появления уведомления, где уведомление создается при передаче управления инструкции из участка, помеченного одной меткой, в участок области, помеченный другой меткой. В частном случае при использовании в качестве метки NX бита таким уведомлением будет исключение страничного нарушения (#PF - Page-Fault Exception). Это уведомление создается при передаче управления от инструкций участка области памяти, для страниц которого бит NX сброшен, инструкции участка области памяти для страниц которого бит NX установлен.
На заключительном этапе 506 передают выполнение инструкций области памяти отличной от той, выполнение инструкций в которой создало уведомление. В частном случае передача управления осуществляется путем перезаписи содержимого CR3, тип перезаписываемого содержимого определяется режимом адресации (paging mode).
Вышеописанный алгоритм передачи выполнения в частном случае применяется в системах журналирования, предназначенных для формирования журнала вызовов API-функций, вызываемых во время исполнения программы. Процесс имеет виртуальное адресное пространство (ВАП), в которое загружаются необходимые секции файлов программы, а также связанные с ним динамические библиотеки DLL. Во время исполнения программного кода происходят вызовы API-функций из различных библиотек DLL, которые и должны быть внесены в журнал вызовов API-функций.
На Фиг. 6а показан пример памяти процесса, который создается ОС. В памяти процесса для наглядности отдельно выделены участки, которые содержат программные инструкции модулей и библиотек, например, модуль «ΕΧΕ», содержащий программные инструкции исполняемого файла, при запуске которого был создан процесс, различные динамические библиотеки (Unknown.dll, other known.dll, kernel32.dll и Ntdll.dll). Также имеются участки «other memory» и «process heap», в данных участках могут содержаться любые вспомогательные данные.
Стоит отметить, что, так как библиотек огромное количество (Фиг. 6а не отражает всего многообразия библиотек), то для системы журналирования все библиотеки разделяют только на две группы, интересующие и неинтересующие. Интересующие библиотеки в области памяти образуют интересующие участки памяти 303 и 303а, неинтересующие библиотеки совместно с другими модулями составляют все остальные участки памяти 304 и 304а. Примерами интересующих библиотек являются библиотеки «kemel32.dll» и «Ntdll.dll». Примерами неинтересующих библиотек являются библиотеки «Unknown.dll» и «Other known.dll». Может быть сформирован список интересующих динамических библиотек, в котором будут содержаться библиотеки необходимые для журналирования. Как правило, список самых популярных и часто используемых всеми процессами библиотек может охватить работу всех остальных. Соответственно, все остальные библиотеки будут являться неинтересующими.
На Фиг. 6б и Фиг. 6в приведены примеры ВАП, одно ВАП является оригинальным (Фиг. 6б), второе дубликат оригинального ВАП (Фиг. 6в). В частном варианте реализации для формирования списка вызовов API-функций система журналирования во время запуска исполняемого файла вместо оригинально ВАП создает два новых ВАП. В другом частном случае реализации создаются два новых ВАП, но при этом используется совместно с ними и оригинальное ВАП, которое в дальнейшем будет предоставляться ОС в случае ее обращения к ВАП.
Таким образом, производится разделение памяти процесса на две части. В первом оригинальном ВАП 301, интересующие участки 303 помечаются как неисполняемые, способом, описанным выше, вызовы экспортируемых функций библиотек, программные инструкции которых содержаться в страницах интересующего участка будут журналироваться. В оставшиеся участки 304, например, ЕХЕ-модуль или неинтересующие библиотеки DLL помечаются как исполняемые. В дубликате ВАП 301а осуществляется инверсия, интересующие участки 303а помечаются как исполняемые, оставшиеся участки 304а помечаются как неисполняемые.
Стоит отметить, что вне зависимости от ВАП содержимое памяти процесса всегда остается одним и тем же (то есть целостность адресного пространства не нарушается). Изменяются только атрибуты у соответствующих таблиц/страниц. Данное утверждение верно только для режима User Mode, в котором происходит физическое разделение памяти. Разделение заключается в том, что для каждой копии ВАП будут созданы свои каталоги страниц и таблицы страниц, а в частном случае таблицы каталогов и таблицы уровней страничной адресации со своими значением регистра управления CR3. Одна и та же физическая страница отображена в двух каталогах, но с разными атрибутами для библиотек, вызовы которых необходимо журналировать. Таким образом, переключение между ВАП производится за счет перезаписи (смены содержимого) регистра управления CR3.
Для того чтобы система журналирования могла управлять ВАЛ (переключать работу между ВАП), производят расстановку флагов (NX-бит) в разделе атрибутов каждой страницы для соответствующих страниц в каждом ВАП. NX-бит является специальным флагом, в соответствии с которым определяется возможность исполнения программного кода, размещенного на данной странице памяти, или возникновения исключения (Page Fault, далее #PF) в случае попытки исполнения кода. Под «#PF» понимается исключение, которое возникает при попытке выполнения программного кода из страницы памяти, для которой такое выполнение запрещено. За счет установки данных NX-битов достигается возможность переключения созданных ВАП в момент вызова API-функции. Стоит отметить, что вызовы будут журналироваться при переключении из оригинального ВАП 301 в дубликат ВАП 301а, а также при переключении и в обратную сторону будут журналироваться возвращаемое значение и некоторые выходные параметры функций. Данный принцип позволяет исполнять в дубликате ВАП 301а только интересующие динамические библиотеки, а в оригинальном ВАП 301 весь остальной исполняемый код.
Рассмотрим механизм исполнения программы и работу системы журналирования. Система журналирования содержит список интересующих библиотек, а также формирует некую «карту библиотек», которая содержит информацию, по меньшей мере, об адресах точек входа в библиотеки.
На Фиг. 7 показаны основные шаги подготовки к работе системы журналирования. В начале запуска исполняемого файла на этапе 700 система журналирования перехватывает управление на этапе 701 и формирует два ВАП, оригинальный ВАП 301 и дубликат ВАП 301а. на этапе 702. Далее на этапе 703 определяют интересующие библиотеки и их страницы. Во время формирования двух ВАП в каждом из них в атрибутах страниц, принадлежащих интересующим библиотекам и страницах принадлежащих всему остальному коду, производится расстановка NX-битов, этап 704. Далее возвращается управление ОС, этап 705.
На Фиг. 8 показаны шаги работы системы журналирования во время формирования журнала вызовов API-функций. Предположим, что во время выполнения исполняющегося файла производится вызов какой-либо API-функции из интересующей библиотеки. Например, это вызов функции «CreateFile», которая находится в динамической библиотеке «kernel32.dll». Соответственно, во время передачи управления (перехода) по указанному адресу обращения для дальнейшего выполнения функции возникает исключение PageFault (#PF) в соответствии с заранее расставленными NX-битами. Данная ситуация связана с тем, что исполнение происходит в оригинальном ВАП 301, а как писалось выше, в атрибутах страниц для интересующих библиотек были установлены NX-биты, которые указывают на невозможность выполнения кода в данных страницах оригинального ВАП. Далее с помощью обработчика исключений производится анализ контекста исключения #PF с целью определения причины возникновения данного исключения и определения адреса API-функции, которую вызвали. Таким образом, анализ заключается в поиске API-функции, которая соответствует адресу памяти, куда был обращен вызов, по таблице API-функций (которая заранее была создана). После определения API-функции информация о ней заносится в журнал вызовов API-функций, и производится переключение с оригинального ВАП 301 на дубликат ВАП 301а, где производится дальнейшей выполнение кода интересующей библиотеки, а точнее выполнение определенной API-функции.
После того, как API-функция выполнила свою задачу, происходит выход из нее, то есть обратный переход к программному коду исполняемого файла (если посмотреть на Фиг. 6, то переход от модуля «Logging.dll» к модулю «Ехе»). Но в связи с тем, что в дубликате ВАП 301а данный регион памяти является неисполняемой, то возникает исключение #PF. Данный #PF также анализируется для определения причины возникновения. Во время анализа определяется, что происходит возврат из API-функции, например, с помощью информации об адресе перехода. В этом случае, происходит переключение ВАП с дубликата 301а на оригинальное 301, в котором и происходит дальнейшей выполнение программного кода. После того как опять выявляется вызов API-функции, все шаги по смене ВАП повторяются. И так до тех пор, пока выполняется программный код.
Стоит отметить, что одной из особенностей технологии является то, что система не меняет содержимое памяти, а вмешивается только в механизмы ОС по работе с памятью.
В заключение следует отметить, что приведенные в описании сведения являются примерами,