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.
Теперь для лучшего понимания следующего далее материла дадим пару определений.
Выборка (дайджест, digest) — это блок данных фиксированной длины, выделенный (выбранный) из всего набора данных, требующих проверки.
Подпись (signature) – это зашифрованный определенным образом (с использованием приватного ключа) хеш выборки от некоего блока данных (сообщения/файла).
Экспортируемые и внутренние функции библиотеки:
Из ядра Windows 7, например, на этапе начальной загрузки, вызываются функции CiInitialize, CiValidateImageHeader, CiValidateImageData. Если проверка собственной целостности не проходит, то функция CiInitialize возвращает статус STATUS_UNSUCCESSFUL, в этом случае загрузка операционной системы прекращается с ошибкой. В случае успешного прохождения тестов, функция CiInitialize возвращает (инициализированную) структуру с именем _g_CiCallbacks, через которую впоследствии будет осуществляться обратный вызов экспортируемых и некоторых внутренних функций (были описаны выше). Вызывающий код в дальнейшем может использовать эти функции для проведения проверки любого исполняемого образа на целостность.
Все представленные в данном разделе модификации приведены сугубо для ознакомления и выполнялись исключительно из исследовательских соображений с единственной целью определения причин зависания процедуры загрузки операционной системы на ранних этапах (на этапе выполнения модулей winload.exe/ntoskrnl.exe).
Отдельным довеском публикую алгоритмы изменения исходного кода библиотеки. В одном из экспериментов с 32-битной реализацией Windows 7 потребовалось отключение проверки целостности модулей начальной загрузки. Конечно же, подобная возможность официально имеется для 32-битных операционных систем Windows, тем не менее были выявлен ряд причин по которым требовалось ручное, принудительное изменение кода. Интерес для нас представляет код функции CiGetPEInformation:
Можно было непосредственно изменить его, тем не менее, более корректным вариантом будет изменить код вызываемой «вложенной» функции PEProcessDispatch:
PAGE:1789FC56 ; =============== S U B R O U T I N E ======================================= PAGE:1789FC56 PAGE:1789FC56 ; Attributes: bp-based frame PAGE:1789FC56 PAGE:1789FC56 ; __stdcall PEProcessDispatch(x, x, x) PAGE:1789FC56 _PEProcessDispatch@12procnear PAGE:1789FC56 PAGE:1789FC56 var_14 =dwordptr—14h PAGE:1789FC56 var_10 =dwordptr—10h PAGE:1789FC56 var_C =dwordptr—0Ch PAGE:1789FC56 var_8 =dwordptr—8 PAGE:1789FC56 var_1 =byteptr—1 PAGE:1789FC56 arg_0 =dwordptr 8 PAGE:1789FC56 arg_4 =dwordptr 0Ch PAGE:1789FC56 arg_8 =dwordptr 10h PAGE:1789FC56 PAGE:1789FC568BFF mov edi,edi PAGE:1789FC5855 push ebp PAGE:1789FC598BEC mov ebp,esp PAGE:1789FC5B83EC14 sub esp,14h PAGE:1789FC5E56 push esi PAGE:1789FC5F8B7508 mov esi,[ebp arg_0] PAGE:1789FC6257 push edi PAGE:1789FC6333FF xor edi,edi PAGE:1789FC65897DF8 mov [ebp var_8],edi PAGE:1789FC68C645FF00 mov [ebp var_1],0 PAGE:1789FC6C3BF7 cmp esi,edi PAGE:1789FC6E750A jnz shortloc_1789FC7A PAGE:1789FC70B80D0000C0 mov eax,0C000000Dh PAGE:1789FC75E9A2010000 jmp loc_1789FE1C |
Требуется заменить начальные байты функции так, что бы значение регистра EAX
(в котором возвращается результат выполнения) равнялось 0 и сразу после этого осуществлялся возврат из функции.
Источник ошибок 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).