ci.dll — библиотека проверки цифровых подписей | Блог по Windows

Ci.dll — библиотека проверки цифровых подписей | блог по windows

И последним этапом в цепочке проверки целостности кода стадии загрузки 32-битной операционной системы Windows 7 является библиотека ci.dll (именуемая разработчиками Модулем Целостности Кода, Code Integrity Module). Данный компонент впервые появился в операционной системе Windows 7 и в своем составе имеет функции, обеспечивающие проверку целостности бинарных образов на этапе отображения/загрузки в адресное пространство ядра. Таким образом, можно сделать вывод, что фактически проверке по задумке разработчиков, подлежат только ключевые образы, являющиеся для системы критичными в плане безопасности. Область действия функционала ci.dll ограничивается только локальной системой, то есть той, на которой непосредственно происходит выполнение кода функций, иначе говоря библиотека является ни чем иным как изолированным идентификатором безопасности локальной системы.
Теперь, собственно, сделаем небольшое отступление для того, что бы дать краткое описание необходимых для понимания происходящего механизмов. С определенного времени в Windows появились так называемые сертификаты подписи кода.

Сертификат подписи кода (Code Signing Certificate) — цифровой «документ» для программного обеспечения (бинарные модули/скрипты), удостоверяющий автора программы и гарантирующий целостность (неизменность) кода.

Получается, что введение подобного типа сертификатов призвано обеспечить:

  • проверка подлинности кода;
  • проверка целостности кода;

Существует несколько видов сертификатов подписи кода, но в контексте данного материала нас интересуют лишь следующие:

  • Цифровая подпись Authenticode (Authenticode Signing) — сертификат, предназначающийся для удостоверения кода (программ/скриптов) пользовательского режима;
  • Цифровая подпись модулей режима ядра (Kernel Mode Signing) — сертификат, позволяющий удостоверять модули, предназначенные для работы в режиме ядра (нативные библиотеки/драйвера);

Цифровая подпись Authenticode используется для подписи 32- и 64-битных исполняемых файлов (.exe, .dll, .cab .msi, и некоторые другие). Помимо этого, позволяет подписывать код для Microsoft Office, Microsoft VBA, Silverlight 4. Цифровая подпись (сертификат разработчика) модулей режима ядра (Kernel Mode) позволяет подписывать приложения, предназначенные для работы в режиме ядра. Для 64-битных версий операционных это имеет особое значение, поскольку для систем данной разрядности (начиная с Windows Vista) необходимо, чтобы все kernel-mode-приложения были подписаны сертификатом, выпущенным доверенным центром сертификации. Как вы уже поняли, перечисленный перечень удостоверяющих процедур призваны осуществить функции, предоставляемые (экспортируемые) библиотекой ci.dll.
Справедливы следующие утверждения:

  • Библиотека ci.dll присутствует в операционных системах Windows 7 и более поздних.
  • Библиотека ci.dll функционирует в только в ситуации, когда Windows загружается в штатном (нормальном) режиме загрузки, подразумевающем отключенный режим отладки (Debug mode) и включенную проверку целостности драйверов (ENABLE_DRIVER_INTEGRITY).
  • основное назначение библиотеки ci.dll — проверка целостности драйверов и компонентов (подписанных цифровой подписью). Поэтому, логично что функции библиотеки ci.dll могут возвращать запрашивающему коду некий статус, сигнализирующий об успешном/неудачном прохождении вышеуказанных проверок целостности.
  • Библиотека ci.dll обеспечивает поддержку следующих алгоритмов: проверка цифровой подписи RSA PKCS#1 (v1.5), хэш SHA-1, хэш SHA-256, хэш SHA-384, хэш SHA-512.
  • Библиотека ci.dll обеспечивает на этапе инициализации тесты собственной целостности с использованием следующих алгоритмов: SHS (SHA-1) проверка известного ответа, SHS (SHA-256) проверка известного ответа, SHS (SHA-512) проверка известного ответа, RSA проверка на основе теста с использованием известной подписи формата PKCS#1 v1.5.
Дополнительно:  Как починить Mac, зависший во время обновления macOS | Блог Евгения Левашова

Теперь для лучшего понимания следующего далее материла дадим пару определений.

Выборка (дайджест, digest) — это блок данных фиксированной длины, выделенный (выбранный) из всего набора данных, требующих проверки.

Подпись (signature) – это зашифрованный определенным образом (с использованием приватного ключа) хеш выборки от некоего блока данных (сообщения/файла).

Экспортируемые и внутренние функции библиотеки:

Из ядра Windows 7, например, на этапе начальной загрузки, вызываются функции CiInitialize, CiValidateImageHeader, CiValidateImageData. Если проверка собственной целостности не проходит, то функция CiInitialize возвращает статус STATUS_UNSUCCESSFUL, в этом случае загрузка операционной системы прекращается с ошибкой. В случае успешного прохождения тестов, функция CiInitialize возвращает (инициализированную) структуру с именем _g_CiCallbacks, через которую впоследствии будет осуществляться обратный вызов экспортируемых и некоторых внутренних функций (были описаны выше). Вызывающий код в дальнейшем может использовать эти функции для проведения проверки любого исполняемого образа на целостность.

Все представленные в данном разделе модификации приведены сугубо для ознакомления и выполнялись исключительно из исследовательских соображений с единственной целью определения причин зависания процедуры загрузки операционной системы на ранних этапах (на этапе выполнения модулей winload.exe/ntoskrnl.exe).

Отдельным довеском публикую алгоритмы изменения исходного кода библиотеки. В одном из экспериментов с 32-битной реализацией Windows 7 потребовалось отключение проверки целостности модулей начальной загрузки. Конечно же, подобная возможность официально имеется для 32-битных операционных систем Windows, тем не менее были выявлен ряд причин по которым требовалось ручное, принудительное изменение кода. Интерес для нас представляет код функции CiGetPEInformation:

Можно было непосредственно изменить его, тем не менее, более корректным вариантом будет изменить код вызываемой «вложенной» функции PEProcessDispatch:

Требуется заменить начальные байты функции так, что бы значение регистра EAX (в котором возвращается результат выполнения) равнялось 0 и сразу после этого осуществлялся возврат из функции.

Дополнительно:  Root права и root explorer что это

Источник ошибок ci.dll

В основном ошибки ci.dll из-за отсутствия файлов ci.dll. Как внешний файл (ci.dll), это делает проблемы Windows более вероятными.

Файлы ci.dll повреждены от вредоносных программ, плохих отключений (ОС или Windows) и других сценариев, связанных с ci.dll. Поврежденные файлы ci.dll предотвращают правильную загрузку, что приводит к сообщениям об ошибках Windows или ci.dll.

Кроме того проблемы ci.dll вызваны плохими ссылками, связанными с Windowss в реестре Windows. Сломанные ссылки на DLL-файлы могут помешать правильной регистрации файла DLL, давая вам ошибку ci.dll Оставшиеся разделы реестра Windows или ci.dll, перемещенные или отсутствующие ci.dll, плохие установки или удаления, могут нарушить ссылки на пути к файлам ci.dll.

В частности, проблемы ci.dll, созданные:

Распространенные проблемы ci.dll

Наиболее распространенные ошибки ci.dll, которые могут возникнуть на компьютере под управлением Windows, перечислены ниже:

Эти сообщения об ошибках DLL могут появляться во время установки программы, в то время как программа, связанная с ci.dll (например, Windows) работает, во время запуска или завершения работы Windows, или даже во время установки операционной системы Windows. Важно отметить, когда возникают проблемы с ci.dll, так как это помогает устранять проблемы Windows (и сообщать Microsoft).

Оцените статью
Master Hi-technology
Добавить комментарий