Код документа: RU2634172C1
Область техники
Изобретение относится к способам управления исполнением машинных инструкций, а именно к способам передачи управления между адресными пространствами.
Уровень техники
Современные технологии, предназначенные для формирования журнала вызовов API-функций во время исполнения программы, требуют вмешательства в содержимое адресного пространства процесса или файлов на диске, например, изменение кода в системных библиотеках операционной системы в памяти и на диске. Изменения заключаются во «внедрении кода», отвечающего за механизм журналирования вызовов API-функций. Основными шагами журналирования могут являться:
- перехват управления библиотекой (например, с помощью перехвата API-функций путем изменения кода целевой функции);
- переход при вызове API-функции в регион памяти, содержащий код обработчика, отвечающий за обработку API-функции и запись в журнал вызовов;
- выполнение кода обработчика системы журналирования;
- возврат управления библиотеке.
Для перехвата управления системой журналирования также могут быть использованы способы, заключающиеся в изменении адресов вызова API-функций из библиотек в таблице импорта исполняемого файла и/или помещения «промежуточной» библиотеки (атака DLL Hijacking), к которой будет первоначальное обращение перед переходом к оригинальной вызываемой API-функции из оригинальной библиотеки.
Недостатком существующих систем журналирования является то, что известные системы журналирования, как правило, имеют трудности при их реализации на различных операционных системах и их версиях. Так, обновление операционной системы может привести к тому, что система журналирования перестает работать, так как потребуется доработка (адаптация) под обновленную версию.
Еще одним недостатком современных систем является то, что их присутствие может быть обнаружено вредоносными программами вне зависимости от их привилегий, так как практически любое «вторжение» в адресное пространство процесса может быть обнаружено.
Указанные недостатки преодолеваются в известном изобретении US 9116621, но данное изобретение существенно снижает производительность логирования в том случае, когда программный код журналируемых API функций содержится в виртуальных страницах памяти совместно с другим программным кодом библиотеки, которая экспортирует интересующее API.
На основании анализа существующего уровня техники становится ясно, что необходимо создание такой системы, которая не вносит изменения в анализируемую программу, не может быть обнаруженной и имеет высокую производительность.
Раскрытие изобретения
Настоящее изобретение предназначено для отслеживания выполнения программного кода процессором в физической памяти. Применением настоящего изобретения является формирование журнала вызовов API-функций, вызываемых во время исполнения программы.
Технический результат настоящего изобретения заключается в сокращении числа создаваемых уведомлений при передаче выполнения на страницы памяти, содержащие, помимо инструкций кода и данных интересующих участков, инструкции кода и данные участков, отличных от интересующих участков, путем установки меток на интересующие участки адресного пространства в зависимости от содержания страницы, содержащей инструкции кода и данные интересующего участка.
Технический результат настоящего изобретения заключается в повышении производительности отслеживания выполнения процессором кода, загруженного в системной памяти, при передаче выполнения на страницы памяти, содержащие, помимо инструкций кода и данных интересующих участков, инструкции кода и данные участков, отличных от интересующих участков, путем установки меток на интересующие участки адресного пространства в зависимости от содержания страницы, содержащей инструкции кода и данные интересующего участка.
Способ передачи выполнения инструкций из одного адресного пространства другому, в котором: определяют в оригинальном адресном пространстве процесса по меньшей мере один участок памяти (далее интересующий участок памяти); определяют страницы памяти оригинального адресного пространства процесса, которые содержат инструкции кода и данные интересующего участка памяти, определенного ранее; создают по меньшей мере одно адресное пространство дублированием страниц оригинального адресного пространства процесса, где дублируются по меньшей мере страницы, содержащие инструкции кода и данные интересующего участка памяти, определенные ранее; помечают страницы памяти в оригинальном адресном пространстве, при этом метки страниц, содержащие только инструкции кода и данные интересующего участка в оригинальном адресном пространстве, отличны от меток страниц, содержащих помимо инструкций кода и данных интересующего участка памяти инструкции кода и данные участков, отличных от интересующих, и страниц, содержащих только инструкции кода и данные участков, отличных от интересующего; помечают в оригинальном адресном пространстве инструкции кода интересующего участка в страницах, содержащих помимо инструкций кода и данных интересующего участка памяти инструкции кода и данные участков, отличных от интересующих; помечают страницы памяти в продублированном адресном памяти, при этом метки страниц, содержащих инструкции кода и данные интересующего участка в оригинальном адресном пространстве, отличны от меток страниц, содержащих только инструкции кода и данные участков, отличных от интересующего; осуществляют выполнение инструкций в оригинальном адресном пространстве или продублированном адресном пространстве до создания уведомления, при этом уведомление создается при передаче управления инструкции кода из участка, помеченного одной меткой, в участок адресного пространства, помеченный отличной меткой или при передаче управления помеченной инструкции; передают выполнение инструкций адресному пространству, отличному от того, выполнение инструкций в котором создало уведомление. В частном случае адресное пространство процесса является виртуальным адресным пространством, а страница адресного пространства является логической страницей и дублирование осуществляется копированием таблиц и каталогов. Передача управления адресному пространству, отличному от того, выполнение инструкций в котором создало уведомление в данном случае, осуществляется путем перезаписи адреса каталога страниц.
В другом частном случае адресное пространство процесса является физическим адресным пространством, а страница адресного пространства является физической страницей.
В частном случае интересующий участок равен по меньшей мере одной странице.
Участки памяти в адресном пространстве помечают путем установки атрибутов в таблице страниц для страниц, на которые отображен участок.
В частном случае страницы оригинального адресного пространства, содержащие инструкции кода и данные только интересующего участка, имеют атрибут «неисполняемые», а страницы оригинального адресного пространства, содержащие, помимо инструкций кода и данных интересующего участка памяти, инструкции кода и данные участков, отличных от интересующего, имеют атрибут «исполняемые», при этом дубликаты страниц, содержащие инструкции кода и данные интересующего участка, имеют атрибут «исполняемые».
В частном случае инструкции кода интересующего участка, содержащиеся на страницах оригинального адресного пространства, помечаются установкой байта 0×СС.
В частном случае уведомление является исключением, которое создается процессором и является, например, исключением Page-Fault Exception.
Краткое описание чертежей
Сопровождающие чертежи включены для обеспечения дополнительного понимания изобретения и составляют часть этого описания, показывают варианты осуществления изобретения и совместно с описанием служат для объяснения принципов изобретения.
Заявленное изобретение поясняется следующими чертежами, на которых:
Фиг. 1 показывает пример компьютерной системы общего назначения;
Фиг. 2 показывает способ описания виртуальной памяти;
Фиг. 3 показывает принцип дублирования памяти;
Фиг. 4 показывает способ дублирования виртуальной памяти;
Фиг. 5 показывает способ подготовки и механизма передачи управления выполнения инструкций от одной виртуальной области памяти другой;
Фиг. 6 показывает пример памяти процесса, который создается ОС, и примеры виртуального адресного пространства;
Фиг. 7 показывает основные шаги подготовки к работе системы журналирования;
Фиг. 8 показывает шаги работы системы журналирования;
Фиг. 9 показывает случай подготовки системы журналирования, когда интересующие участки занимают страницу не целиком, а лишь часть страницы в адресном пространстве;
Фиг. 10 показывает способ подготовки и механизма передачи управления выполнения инструкций от одного адресного пространства другому.
Хотя изобретение может иметь различные модификации и альтернативные формы, характерные признаки, показанные в качестве примера на чертежах, будут описаны подробно. Следует понимать, однако, что цель описания заключается не в ограничении изобретения конкретным его воплощением. Наоборот, целью описания является охват всех изменений, модификаций, входящих в рамки данного изобретения, как это определено приложенной формулой.
Описание изобретения
Объекты и признаки настоящего изобретения, способы для достижения этих объектов и признаков станут очевидными посредством отсылки к примерным вариантам осуществления. Однако настоящее изобретение не ограничивается примерными вариантами осуществления, раскрытыми ниже, оно может воплощаться в различных видах. Приведенное описание предназначено для помощи специалисту в области техники для исчерпывающего понимания изобретения, которое определяется только в объеме приложенной формулы.
Фиг. 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 106.
Итак, для адресации в 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 Manual»_(стр. 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 бит в структуре РТЕ. Например, для страниц интересующего участка 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 тетогу» и «process heap», в данных участках могут содержаться любые вспомогательные данные.
Стоит отметить, что, так как библиотек огромное количество (Фиг. 6а не отражает всего многообразия библиотек), то для системы журналирования разделяют все библиотеки только на две группы, интересующие и неинтересующие. Интересующие библиотеки образуют в области памяти интересующие участки памяти 303 и 303а, неинтересующие библиотеки совместно с другими модулями составляют все остальные участки памяти 304 и 304а. Примерами интересующих библиотек являются библиотеки «kernel32.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-функции, все шаги по смене ВАП повторяются. И так до тех пор, пока выполняется программный код.
Стоит отметить, что одной из особенностей технологии является то, что система не меняет содержимое памяти, а вмешивается только в механизмы ОС по работе с памятью.
На Фиг. 9 изображен случай подготовки системы журналирования, когда интересующие участки занимают страницу не целиком, а лишь часть страницы в адресном пространстве. На Фиг. 9а изображена некоторая область ВАП процесса (ВАП частный случай адресного пространства). На части страницы 100а' расположен интересующий участок 303, на другой части неинтересующий участок 304. Такое расположение участков возможно в случаях, когда журналировать необходимо не все API-функции из библиотеки. Например, из интересующей библиотеки исключаются API-функции, которые не важны для последующего анализа, но вызов их происходит часто или, наоборот, интересует какая-то конкретная API-функция из библиотеки, но ей занята лишь часть страницы памяти. Стоит отметить, так как страниц, которые составляют ВАП, много, то на фигуре изображены всего три страницы, которые отражают все многообразие страниц ВАП. А именно страница 100а, которая содержит инструкции кода и данные только интересующего участка 303. Страница 100а, которая содержит инструкции кода и данные только неинтересующего участка 304. Страница
На Фиг. 9б и Фиг. 9в приведены варианты ВАП, одно ВАП является оригинальным 301 (Фиг. 9б), второе ВАП является дубликатом 301а (Фиг. 9в) оригинального ВАП. В частном случае оригинальным ВАП является непосредственно ВАП процесса (Фиг. 9а). Таким образом, производится разделение памяти процесса на две части.
В первом оригинальном ВАП 301 интересующие участки 303 и неинтересующие участки 304, расположенные на страницах первого типа 100а, помечаются путем пометок страниц (в данном случае понятие пометить участок и пометить страницу, содержащую данный участок, тождественны), при этом метки страниц первого типа 100а, на которых расположены инструкции кода и данные интересующего участка 303, отличаются от меток страниц первого типа 100а, на которых расположены инструкции и код неинтересующего участка 304. В частном случае страницы первого типа 100а, содержащие инструкции кода и данные интересующего участка 303, помечаются как неисполняемые, а страницы первого типа 100а, содержащие инструкции кода и данные неинтересующего участка 304, помечаются как исполняемые.
Страницы второго типа
В дубликате ВАП 301а интересующие участки 303 и неинтересующие участки 304, расположенные на страницах первого типа 100а, помечаются путем пометок страниц, при этом метки страниц первого типа 100а, на которых расположены инструкции кода и данные интересующего участка 303, отличаются от меток страниц первого типа 100а, на которых расположены инструкции кода и данные неинтересующего участка 304. В частном случае происходит инверсия меток, страницы первого типа 100а, которые в оригинальном ВАП помечены как исполняемые в дубликате ВАП, помечаются как неисполняемые, а страницы первого типа 100а, которые в оригинальном ВАП помечены как неисполняемые, в дубликате ВАП помечаются как исполняемые. Страницы второго типа
Переключение между оригинальным ВАП 301 и дубликатом ВАП 301а происходит после создания уведомления. Уведомление в оригинальном ВАП 301 создается:
- при передаче управления из участка, помеченного одной меткой, в участок оригинального ВАП, помеченного отличной меткой;
- при передаче управления помеченной инструкции кода или данным интересующего участка 303, содержащимся на странице второго типа
В частном случае уведомление в оригинальном ВАП 301а создается:
- при передаче управления из неинтересующего участка памяти 304, содержащегося на страницах первого типа 100а или второго типа
- при передаче управления из неинтересующего участка памяти 304, содержащегося на страницах первого типа 100а или второго типа
Уведомление в дубликате ВАП 301а создается:
- при передаче управления из участка, содержащегося на странице первого типа 100а, помеченной одной меткой, в участок дубликата ВАП 301а, помеченный отличной меткой и содержащийся также на странице первого типа 100а;
- при передаче управления из участка, содержащегося на странице второго типа 100а', помеченной одной меткой, в участок дубликата ВАП 301а, помеченный отличной меткой и содержащийся на странице первого типа 100а.
В частном случае уведомление в дубликате ВАП 301а создается:
- при передаче управления из интересующего участка памяти 303 инструкции неинтересующего участка 304, содержащегося на странице первого типа 100а;
- при передаче управления из неинтересующего участка памяти 304, содержащегося на странице второго типа
На Фиг. 10 показан способ подготовки и механизма передачи управления выполнения инструкций от одного адресного пространства другому. Изначально получают оригинальное адресное пространство процесса (этап 1000). На этапе 1010 определяют в оригинальном адресном пространстве процесса 301 по меньшей мере один интересующий участок памяти 303, далее на этапе 1020 определяют страницы памяти 100а и
- при передаче управления инструкции кода из участка, помеченного одной меткой, в участок адресного пространства, помеченный отличной меткой;
- при передаче управления помеченной инструкции.
После создания уведомления на этапе 1070 на следующем этапе 1080 передают выполнение инструкций адресному пространству, отличному от того, выполнение инструкций в котором создало уведомление на этапе 1070.
В заключение следует отметить, что приведенные в описании сведения являются примерами, которые не ограничивают объем настоящего изобретения, определенного формулой. Специалисту в данной области становится понятным, что могут существовать и другие варианты осуществления настоящего изобретения, согласующиеся с сущностью и объемом настоящего изобретения.
Изобретение относится к способу передачи выполнения инструкций из одного адресного пространства другому. Технический результат заключается в управлении выполнением инструкций кода. В способе определяют в оригинальном адресном пространстве процесса интересующий участок памяти, определяют страницы памяти оригинального адресного пространства процесса, содержащие инструкции кода и данные интересующего участка памяти, создают адресное пространство дублированием страниц оригинального адресного пространства процесса, где дублируются страницы, содержащие инструкции кода и данные интересующего участка памяти, помечают страницы памяти в оригинальном адресном пространстве, помечают в оригинальном адресном пространстве инструкции кода интересующего участка в страницах, содержащих помимо инструкций кода и данных интересующего участка памяти инструкции кода и данные участков, отличных от интересующего участка, помечают страницы памяти в продублированном адресном памяти, осуществляют выполнение инструкций в оригинальном адресном пространстве или продублированном адресном пространстве до создания уведомления, создают уведомление, передают выполнение инструкций адресному пространству, отличному от того, выполнение инструкций в котором создало уведомление. 15 з.п. ф-лы, 14 ил.
Способ передачи управления между областями памяти