Dll search client что это
В этой статье описывается, что такое динамическая библиотека ссылок (DLL) и различные проблемы, которые могут возникнуть при использовании DLLs. В нем также описаны некоторые сложные проблемы, которые следует учитывать при разработке собственных DLLs.
Применяется к: Windows 10 — все выпуски
Исходный номер КБ: 815065
Сводка
В описании того, что такое DLL, в этой статье описываются методы динамической связи, зависимости от DLL, точки входа DLL, экспорт функций DLL и средства устранения неполадок DLL.
Для Windows операционных систем большая часть функций операционной системы предоставляется DLL. Кроме того, при запуске программы на одной из Windows операционных систем большая часть функций программы может быть предоставлена DLLs. Например, некоторые программы могут содержать много различных модулей, и каждый модуль программы содержится и распространяется в DLLs.
Использование DLLs способствует модульизации кода, повторному использованию кода, эффективному использованию памяти и уменьшению дискового пространства. Таким образом, операционная система и программы загружаются быстрее, работают быстрее и меньше места на диске на компьютере.
Если программа использует DLL, проблема, называемая зависимостью, может привести к тому, что программа не будет работать. Когда программа использует DLL, создается зависимость. Если другая программа переописает и нарушает эту зависимость, оригинальная программа может не успешно выполниться.
Дополнительная информация
DLL — это библиотека, которая содержит код и данные, которые могут использоваться одновременно более чем одной программой. Например, в Windows операционных системах DLL Comdlg32 выполняет общие функции, связанные с диалоговое окно. Каждая программа может использовать функции, содержащиеся в этом DLL, для реализации открытого диалоговое окно. Это способствует повторному использованию кода и эффективному использованию памяти.
С помощью DLL программа может быть модульной в отдельные компоненты. Например, программа бухгалтерского учета может быть продана модулем. Каждый модуль может быть загружен в основную программу во время запуска, если этот модуль установлен. Поскольку модули являются отдельными, время загрузки программы быстрее. Модуль загружается только при запросе этой функции.
Кроме того, обновления легче применять к каждому модуле, не затрагивая другие части программы. Например, у вас может быть программа заработной платы, и налоговые ставки меняются каждый год. Если эти изменения изолированы в DLL, вы можете применить обновление, не нуждаясь в сборке или установке всей программы снова.
В следующем списке описываются некоторые файлы, реализованные как DLLs в Windows операционных системах:
ActiveX Файлы элементов управления (.ocx)
Пример управления ActiveX — это управление календарем, которое позволяет выбрать дату из календаря.
Файлы панели управления (.cpl)
Примером файла .cpl является элемент, расположенный в панели управления. Каждый элемент — это специализированная DLL.
Файлы драйвера устройства (drv)
Пример драйвера устройства — это драйвер принтера, который управляет печатью на принтере.
Преимущества DLL
В следующем списке описываются некоторые преимущества, которые предоставляются при помощи программы DLL:
Использует меньше ресурсов
Если несколько программ используют ту же библиотеку функций, DLL может уменьшить дублирование кода, загружаемого на диск и в физической памяти. Это может значительно повлиять на производительность не только программы, запущенной на переднем плане, но и других программ, работающих на Windows операционной системе.
Продвигает модульную архитектуру
DLL помогает развивать модульные программы. Это помогает разрабатывать крупные программы, которые требуют нескольких языковых версий или программы, которая требует модульной архитектуры. Пример модульной программы — это программа учета, которая имеет множество модулей, которые можно динамически загрузить во время запуска.
Облегчает развертывание и установку
Если функции в DLL требуется обновление или исправление, развертывание и установка DLL не требуют повторной связи программы с DLL. Кроме того, если несколько программ используют один и тот же DLL, все эти программы будут получать выгоду от обновления или исправления. Эта проблема может возникать чаще при использовании стороннее DLL, регулярно обновляемого или исправленного.
Зависимости от DLL
Когда программа или DLL используют функцию DLL в другой DLL, создается зависимость. Программа больше не является самостоятельной, и в случае слома зависимости у нее могут возникнуть проблемы. Например, программа не может работать, если происходит одно из следующих действий:
- Зависимая DLL обновляется до новой версии.
- Фиксирована зависимая DLL.
- Зависимая DLL перезаписана более ранней версией.
- Зависимая DLL удаляется с компьютера.
Эти действия называются конфликтами DLL. Если обратная совместимость не обеспечивается, программа может не успешно выполняться.
В следующем списке описываются изменения, внесенные в Windows 2000 г. и в более поздних Windows операционных системах, чтобы свести к минимуму проблемы зависимости:
Windows Защита файлов
В Windows защиты файлов операционная система предотвращает обновление или удаление системных DLLs несанкционированным агентом. Когда установка программы попытается удалить или обновить DLL, определяемую как система DLL, Windows файловой защиты будет искать допустимую цифровую подпись.
Частные DLLs позволяет изолировать программу от изменений, внесенных в общие DLLs. Частные DLLs используют сведения, определенные для версии, или пустой файл, чтобы обеспечить выполнение версии .local DLL, используемой программой. Чтобы использовать частные DLLs, найдите DLLs в корневой папке программы. Затем для новых программ добавьте сведения о версии в DLL. Для старых программ используйте пустой .local файл. Каждый метод сообщает операционной системе использовать частные DLLs, расположенные в корневой папке программы.
Средства устранения неполадок DLL
Для устранения неполадок DLL доступны несколько средств. Вот некоторые из этих средств.
Уокер зависимостей
Средство Уокер зависимостей может повторно сканировать все зависимые DLLs, используемые программой. При открываемой программе в "Уолкер зависимостей" уолкер зависимостей делает следующие проверки:
- Уокер зависимостей проверяет отсутствующие DLLs.
- Уокер зависимостей проверяет файлы программы или DLLs, которые не являются допустимыми.
- Уокер зависимостей проверяет соответствие функций импорта и экспорту.
- Уокер зависимостей проверяет на наличие ошибок круговой зависимости.
- Уокер зависимостей проверяет для модулей, которые не являются действительными, так как модули для другой операционной системы.
С помощью Уолкера зависимостей можно документировать все DLLs, которые использует программа. Это может помочь предотвратить и устранить проблемы DLL, которые могут возникнуть в будущем. В следующем каталоге при установке Visual Studio 6.0 расположено приложение Dependency Walker.
drive\Program Files\Microsoft Visual Studio\Common\Tools
Универсальное решение проблем DLL
Средство универсального решения проблем DLL (DUPS) используется для аудита, сравнения, документа и отображения данных DLL. В следующем списке описываются утилиты, которые составляют средство DUPS:
Эта утилита регистрирует все DLLs на компьютере и регистрирует сведения в текстовом файле или файле базы данных.
Эта утилита сравнивает DLLs, перечисленные в двух текстовых файлах, и создает третий текстовый файл, содержащий различия.
Эта утилита загружает текстовые файлы, созданные с помощью Dlister.exe и Dcomp.exe в базу данных dllHell.
Эта утилита предоставляет графический пользовательский интерфейс (GUI) версии Dtxt2DB.exe утилиты.
База данных справки DLL
База данных справки по DLL поможет вам найти конкретные версии DLLs, установленные программным обеспечением Майкрософт.
Разработка DLL
В этом разделе описываются проблемы и требования, которые следует учитывать при разработке собственных DLLs.
Типы DLLs
При загрузке DLL в приложении два метода связывания разрешат вызывать экспортируемую функцию DLL. Два метода связывания — динамическая привязка во время нагрузки и динамическая связь во время работы.
Динамическая привязка по времени нагрузки
В динамической привязке времени нагрузки приложение делает явные вызовы для экспортируемой DLL-функций, таких как локальные функции. Чтобы использовать динамическое связывание во время нагрузки, при компиляции и ссылке приложения предостережете файл (.h) и файл импортной библиотеки (.lib). При этом linker предоставит системе сведения, необходимые для загрузки DLL и решения экспортируемой точки функции DLL во время нагрузки.
Динамическая привязка по времени
При динамической привязке во время работы приложение вызывает функцию или функцию для загрузки LoadLibrary LoadLibraryEx DLL во время запуска. После успешной загрузки DLL вы используете функцию для получения адреса экспортируемой функции GetProcAddress DLL, которую необходимо вызвать. При использовании динамической привязки во время запуска не требуется файл библиотеки импорта.
В следующем списке описываются критерии применения для использования динамической привязки во время нагрузки и использования динамической привязки по времени.
Если важна начальная производительность запуска приложения, необходимо использовать динамическую привязку к времени выполнения.
В динамических связях с нагрузкой экспортные функции DLL похожи на локальные функции. Это упрощает вызов этих функций.
При динамической привязке во время работы приложение может ветвь для загрузки различных модулей по мере необходимости. Это важно при разработке многоязычных версий.
Точка входа в DLL
При создании DLL можно дополнительно указать функцию точки входа. Функция точки входа называется, когда процессы или потоки присоединяются к DLL или отсоединяются от DLL. Функцию точки входа можно использовать для инициализации структур данных или для уничтожения структур данных, как того требует DLL. Кроме того, если приложение многопоточное, можно использовать локальное хранилище потоков (TLS) для выделения памяти, которая является закрытой для каждого потока в функции точки входа. Следующий код является примером функции точки входа DLL.
Когда функция точки входа возвращает значение FALSE, приложение не будет запускаться, если вы используете динамическую привязку по времени нагрузки. Если используется динамическая привязка по времени запуска, загрузка только отдельной DLL не будет.
Функция точки входа должна выполнять только простые задачи инициализации и не должна вызывать другие функции загрузки или завершения DLL. Например, в функции точки входа не следует прямо или косвенно вызывать функцию LoadLibrary или LoadLibraryEx функцию. Кроме того, не следует вызывать FreeLibrary функцию, когда процесс завершается.
В многопотоковых приложениях убедитесь, что доступ к глобальным данным DLL синхронизирован (безопасный поток), чтобы избежать возможного повреждения данных. Для этого используйте TLS для предоставления уникальных данных для каждого потока.
Экспорт функций DLL
Чтобы экспортировать функции DLL, можно добавить ключевое слово функции в экспортируемую функцию DLL или создать файл определения модуля (.def), в который перечислены экспортные функции DLL.
Чтобы использовать ключевое слово функции, необходимо объявить каждую функцию, которую необходимо экспортировать со следующим ключевым словом:
__declspec(dllexport)
Чтобы использовать экспортируемые функции DLL в приложении, необходимо объявить каждую функцию, которую необходимо импортировать по следующему ключевому слову: __declspec(dllimport)
Как правило, для раздельного экспортного утверждения и утверждения используется один файл загона, в который имеется определенное заявление и ifdef import заявление.
Вы также можете использовать файл определения модуля для объявления экспортных функций DLL. При использовании файла определения модуля не нужно добавлять ключевое слово функции к экспортируемой функции DLL. В файле определения модуля объявляется заявление и LIBRARY EXPORTS утверждение для DLL. Следующий код — пример файла определения.
Пример DLL и приложения
В Visual C++ 6.0 можно создать DLL, выбрав тип проекта Win32 Dynamic-Link Library или тип MFC AppWizard (dll).
Следующий код — пример DLL, созданного в Visual C++ с помощью типа проекта Win32 Dynamic-Link Library.
Следующий код — пример проекта приложения Win32, который вызывает экспортируемую функцию DLL в DLL SampleDLL.
При динамической привязке во время нагрузки необходимо связать импортную библиотеку SampleDLL.lib, созданную при создании проекта SampleDLL.
При динамической привязке во время работы используется код, аналогичный следующему коду, для вызова SampleDLL.dll экспортируемой функции DLL.
При компиляции и ссылке приложения SampleDLL операционная Windows ищет DLL SampleDLL в следующих расположениях в этом порядке:
Папка Windows системы
Функция GetSystemDirectory возвращает путь к папке Windows системы.
Функция GetWindowsDirectory возвращает путь Windows папки.
Файл сборки содержит манифест сборки, метаданные типа, код промежуточного языка Microsoft (MSIL) и другие ресурсы. Манифест сборки содержит метаданные сборки, которые предоставляют всю информацию, необходимую для самостоятельного описания сборки. В манифест сборки включены следующие сведения:
- Имя сборки
- Сведения о версии
- Сведения о культуре
- Информация о сильных именах
- Список файлов сборки
- Тип справочной информации
- Справочные и зависящие сведения о сборке
Код MSIL, содержащийся в сборке, не может выполняться напрямую. Вместо этого выполнение кода MSIL управляется с помощью CLR. По умолчанию при создании сборки сборка является закрытой для приложения. Для создания общей сборки необходимо назначить сборке сильное имя, а затем опубликовать сборку в кэше глобальной сборки.
В следующем списке описываются некоторые функции сборки по сравнению с функциями DLLs Win32:
При создании сборки в манифесте сборки содержатся все сведения, необходимые clR для запуска сборки. Манифест сборки содержит список зависимых сборок. Таким образом, CLR может поддерживать согласованный набор сборок, используемых в приложении. В DLL Win32 невозможно поддерживать согласованность между набором DLLs, используемыми в приложении при использовании общих DLLs.
В манифесте сборки сведения о версиях записываются и применяются clR. Кроме того, политики версий могут обеспечить применение использования для конкретной версии. В DLL Win32 версия не может применяться операционной системой. Необходимо убедиться, что DLLs совместимы с обратной совместимость.
Развертывание бок о бок
Сборки поддерживают развертывание бок о бок. Одно приложение может использовать одну версию сборки, а другое приложение может использовать другую версию сборки. Начиная с Windows 2000 г. развертывание поддерживается путем размещения DLLs в папке приложения. Кроме того, Windows защита файлов предотвращает перезаписываемую или замену системных DLLs несанкционированным агентом.
Самостоятельное сдерживание и изоляция
Приложение, разработанное с помощью сборки, может быть автономным и изолированным от других приложений, работающих на компьютере. Эта функция помогает создавать установки с нулевым воздействием.
Сборка запускается под разрешениями безопасности, которые поставляются в манифесте сборки и контролируются clR.
Ниже мы рассмотрим проблемы с работой DDL файлов в самых популярных версиях операционной системы Windows, разберем почему возникают проблемы с DLL, а также предоставим способы их устранения.
Содержание:
- Почему возникают ошибки с DLL?
- Решение проблем с DDL файлами.
- Недостающие компоненты C++ Runtime Library и DirectX.
- Удаление сбойного приложения.
- Обновление драйверов устройства.
- Другие проблемы с DLL библиотеками.
- Что делать если важный файл или DLL библиотека были случайно удалены?
Динамические исполняемые библиотеки (DLL) представляют собой специальные программные компоненты, которые позволяют обращаться к одному файлу сразу нескольким приложениям. Основным предназначением таких библиотек является расширение возможностей утилит и экономия места, поскольку для использования аналогичных компонентов можно иметь всего одну версию файла, которая будет делиться между другими программами.
Почему возникают ошибки с DLL?
Ошибки DLL могут возникать по самым различным причинам. Чаще всего они проявляют себя при запуске каких-либо приложений и программ. Нередки случаи, когда ошибки с DLL происходят во время запуска недавно вышедших компьютерных игр или программ.
Из-за ошибок DLL приложение может не корректно работать или вовсе не загружаться, поэтому следует ознакомиться с возможными причинами появления ошибок.
Одними из основных причин возникновения ошибок DLL является простое отсутствие библиотек , которые требуются для работы приложений. Недостающие файлы могут быть удалены самим пользователем, уничтожены вирусами или перезаписанными более старыми версиями в процессе установки программных компонентов. Помимо этого, ошибки могут возникать из-за неправильной работы драйверов , недостающего программного обеспечения таких, как NET Framework, DirectX и т.д.
Стоит отметить, ошибки DLL могут быть вызваны и более серьезными проблемами, связанными с жестким диском .
Решение проблем с DDL файлами
DLL библиотеки тесно вплетены в различные системные процессы, поэтому при повреждении некоторых из них, операционная система может попросту перестать запускаться. Если это произошло, следует прибегнуть к встроенным средствам восстановления системы . Что бы попасть в среду восстановления достаточно вставить загрузочную флешку или диск с Windows, либо автоматически попасть в среду после трех неудачных попыток загрузки .
Пункты "Восстановление системы" "Восстановление образа системы" и "Восстановление при загрузке" подойдут для решения большинства логических проблем операционной системы. Пункты "Восстановление системы" "Восстановление образа системы" и "Восстановление при загрузке" подойдут для решения большинства логических проблем операционной системы.Для быстрого возврата работоспособности системы пользователь может выбрать один из трех пунктов восстановления , представленных в левой части окна среды восстановления.
Если проблема кроется в некорректной работе загрузчика, рекомендуем ознакомится со способами исправления в статье «Как восстановить загрузчик Windows 10» .
Недостающие компоненты C++ Runtime Library и DirectX
Чаще всего пользователи сталкиваются с проблемой ошибок DLL, которые связаны с отсутствием необходимых компонентов C++ Runtime Library либо DirectX .
Существует два способа решения проблем с недостающими компонентами DLL. Первый и более правильный – полная переустановка сбоящего ПО. Второй – скачивание непосредственного одного компонента, вызывающего ошибку.
Ошибка msvcr100.dll – сбойный компонент в системе безопасности.
Ошибки dxgi.* , d3dx9_25.*, d3d11.*, d3dx9.*, d3dx9_43.*, xinput1_3.*, d3dx9_31.*, xinput1_2.*, d3dx9_31.*, d3dx9_34.*, d3dx9_42.*, x3daudio1_7.*, x3daudio1_6.*, xrsound.* d3dx10_43.*, d3dx9_26.*, d3dx9_30.*, d3dx9_27.*, d3dx11_43.*, d3dcompiler_43.*, d3d10.*.
Ошибка steam_api.dll – распространённая ошибка среди геймеров и пользователей магазина цифровой дистрибуции Steam. Часто возникает при установке пиратских сборок игр и взломанных клиентов Steam.
Важно: мы настоятельно не рекомендуем скачивать отдельные недостающие файлы steam_api.dll, которые можно часто встретить на просторах интернета. Это обусловлено тем, что многие злоумышленники специально распространяют зараженные файлы или шпионские утилиты под видом dll-файлов. Если такой файл попадет на компьютер пользователя, существует большая вероятность утери доступа к аккаунту.
Ошибка uplay_r1_loader.* , Uplay.exe, uplay.*, ubiorbitapi_r2_loader.* — аналогичная ошибка, как и с со Steam.
Ошибка xlive – проблемы с файлами цифрового магазина Microsoft.
Ошибка msvcrt.* , msvcr71.*, msvcrt.*, msvcp120.*, msvcp110.* x64 msvcr90.*, msvcr110.*, msvcr100.*, msvcr80.*, msvcr120.*.
Ошибка physxcudart_20.* , physxloader.* и т.д.- проблемы с файлами NVIDIA PHYSX SYSTEM.
Удаление сбойного приложения
В некоторых случаях установка компонентов может не помочь, поскольку проблема кроется в сбойной программе , использующей DLL библиотеки.
Чтобы определить сбойное приложение, необходимо:
Шаг 1. Нажимаем левой кнопкой мыши по иконке «Поиск» (изображение лупы возле кнопки «Пуск») и вводим в строку фразу «Панель управления» , после чего переходим в непосредственно сам пункт «Панель управления» .
В этой статье мы рассмотрим концепцию перехвата порядка поиска динамически подключаемых библиотек (DLL hijacking) и то, как она может быть использована для достижения устойчивости (persistence) в юзерленде в системах Windows. Этот метод описан в MITER ATT&CK в разделе: «Перехват порядка поиска DLL (T1038)».
Подмена DLL может быть использована злоумышленниками для множества разных целей, но в этой статье основное внимание будет уделено достижению устойчивости с помощью приложений с автозапуском. Например, поскольку Slack и Microsoft Teams запускаются при загрузке (по умолчанию), подмена DLL в одном из этих приложений позволит злоумышленнику получить устойчивый доступ к своей цели — всякий раз, когда пользователь входит в систему.
После представления концепции DLL, порядка поиска DLL, и подмены DLL, я раскрою процесс автоматизации обнаружения возможности перехвата DLL. В этой статье будет рассказано об обнаружении путей перехвата DLL в Slack, Microsoft Teams и Visual Studio Code.
Наконец, я обнаружил несколько путей перехвата DLL, которые использовались разными приложениями, исследовал основную причину и обнаружил, что приложения, использующие определенные вызовы API Windows, подвержены перехвату DLL, когда не работают из C:\Windows\System32\ .
Я хочу поблагодарить своего коллегу Джозайю Массари ( @Airzero24 ) за то, что он первым обнаружил некоторые из этих перехватов DLL, объяснил их методологию и вдохновил меня автоматизировать обнаружение.
Что такое DLL?
DLL — это библиотека, содержащая код и данные, которые могут использоваться одновременно более чем одной программой. (Сурс)
Функциональные возможности DLL могут быть использованы приложением Windows с помощью одной из функций LoadLibrary* . Приложения могут ссылаться на DLL, разработанные специально для этих приложений, или DLL Windows, уже находящиеся на диске в System32. Разработчики могут загружать DLL из System32, чтобы использовать в своих приложениях функционал, уже реализованный в Windows, без необходимости писать этот функционал с нуля.
Порядок поиска DLL и перехват
Поскольку DLL существуют в виде файлов на диске, вы можете задаться вопросом, как приложение узнает, откуда загружать DLL? Microsoft подробно задокументировала порядок поиска DLL здесь.
Начиная с Windows XP SP2, безопасный режим поиска DLL включен по умолчанию ( HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode ). При включенном безопасном режиме порядок поиска DLL следующий:
- Каталог, из которого загружено приложение.
- Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
- 16-битный системный каталог. Функции, которая предоставляет путь к этому каталогу, нет, но в нем происходит поиск.
- Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
- Текущий каталог.
- Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входят пути для каждого приложения, указанные в разделе реестра App Paths. Ключ App Paths не используется при вычислении пути поиска DLL.
Если приложение не указывает, откуда загружать DLL, Windows использует порядок поиска DLL по умолчанию, приведенный выше. Первая позиция в порядке поиска DLL (каталог, из которого загружается приложение) представляет интерес для злоумышленников.
Если разработчик приложения предполагает загрузку DLL из C:\Windows\System32 , но явно не прописал это в приложении, вредоносная DLL, помещенная в каталог приложения, будет загружена раньше, чем легитимная DLL из System32. Загрузка вредоносной DLL называется подменой (или перехватом) DLL и используется злоумышленниками для загрузки вредоносного кода в доверенные/подписанные приложения.
Использование подмены DLL для достижения устойчивости
Подмена DLL может использоваться для достижения устойчивости, когда уязвимое приложение/служба запускается и вредоносная DLL размещается в уязвимом месте. Мой коллега, @Airzero24 , обнаружил подмену DLL в Microsoft OneDrive, Microsoft Teams и Slack в виде userenv.dll .
Именно эти программы стали целью перехвата, потому что по умолчанию они настроены на запуск при загрузке Windows. Это можно увидеть ниже в диспетчере задач:
Приложения Windows, настроенные на автозапуск
Чтобы проверить подмену DLL, я создал загрузчик шеллкода DLL, который запускал Cobalt Strike Beacon. Я переименовал вредоносную DLL в userenv.dll и скопировал ее в каталог уязвимого приложения. Я запустил приложение и увидел свой новый Beacon коллбек.
Cobalt Strike Beacon через перехват DLL
Используя Process Explorer, я могу проверить, действительно ли моя вредоносная DLL была загружена уязвимым приложением.
Обозреватель процессов, показывающий загруженную вредоносную DLL
Автоматическое обнаружение возможности перехвата DLL
После подтверждения ранее известного перехвата DLL, я хотел проверить, смогу ли я найти другие возможности для подмены DLL, которые можно было бы эксплуатировать.
Код, использованный в моих проверка, можно найти здесь.
На примере Slack
Чтобы начать этот процесс, я запустил Process Monitor (ProcMon) со следующими фильтрами:
Затем я запустил Slack и изучил ProcMon на предмет любых DLL, которые Slack искал, но не смог найти.
Возможные пути перехвата DLL, обнаруженные с помощью ProcMon
Я экспортировал эти данные из ProcMon в виде CSV файла для облегчения парсинга в PowerShell.
С моей текущей DLL загрузчика шелл-кода я не смог бы легко определить имена DLL, которые были успешно загружены Slack. Я создал новую DLL, которая использовала GetModuleHandleEx и GetModuleFileName для определения имени загруженной DLL и записи его в текстовый файл.
Моя следующая цель состояла в том, чтобы проанализировать CSV-файл на наличие в списке путей к DLL, просмотреть этот список, скопировать мою тестовую DLL по указанному пути, запустить целевой процесс, остановить целевой процесс и удалить тестовую DLL. Если тестовая DLL была успешно загружена, она запишет свое имя в результирующий файл.
Когда этот процесс завершится, у меня будет список возможных перехватов DLL (я надеюсь), записанных в текстовый файл.
Всю магию в моем проекте DLLHijackTest творит скрипт PowerShell. Он принимает путь к CSV-файлу, сгенерированному ProcMon, путь к вашей вредоносной DLL, путь к процессу, который вы хотите запустить, и любые аргументы, которые вы хотите передать процессу.
Параметры Get-PotentialDLLHijack
Get-PotentialDLLHijack.ps1
Через несколько минут я проверяю текстовый файл, указанный в моей «вредоносной» DLL, на предмет возможных перехватов DLL. Я обнаружил следующие возможные пути перехвата для Slack:
На примере Microsoft Teams
Выполняем описанный выше процесс еще раз:
- Используйте ProcMon для выявления потенциальных путей перехвата DLL, экспортируйте эти данные в виде CSV файла.
- Определите путь запуска процесса.
- Определите любые аргументы, которые вы хотите передать процессу.
- Запустите Get-PotentialDLLHijack.ps1 с соответствующими аргументами.
Примечание: Мне пришлось внести небольшие изменения в скрипт PowerShell, чтобы завершить Teams.exe , так как мой скрипт пытается завершить процесс, который он пытался запустить, в данном случае это Update.exe .
На примере Visual Studio Code
Повторяя описанный выше процесс, я обнаружил следующие потенциальные пути перехвата для Visual Studio Code:
Подмена общих (shared) DLL
Я заметил, что Slack, Microsoft Teams и Visual Studio Code совместно используют следующие DLL:
- WINSTA.dll
- LINKINFO.dll
- ntshrui.dll
- srvcli.dll
- cscapi.dll
Методология: понимание путей перехвата общих DLL
Я следил за стек трейсом, когда Slack пытался загрузить WINSTA.dll , LINKINFO.dll , ntshrui.dll , srvcli.dll и cscapi.dll .
DLL с отложенной загрузкой
Я заметил сходство в стек трейсе при загрузке WINSTA.dll , LINKINFO.dll , ntshrui.dll и srvcli.dll .
Стек трейс, когда Code.exe пытается загрузить WINSTA.dll
Стек трейс, когда Teams.exe пытается загрузить LINKINFO.dll ,
Стек трейс, когда Slack пытается загрузить ntshrui.dll
Стек трейс постоянно содержит вызов _tailMerge_< dllname>_dll , delayLoadHelper2 за которым следует LdrResolveDelayLoadedAPI . Такое поведение было одинаковым для всех трех приложений.
Я определил, что это поведение связано с отложенной загрузкой DLL. Из стек трейса при загрузке WINSTA.dll я мог видеть, что модулем, ответственным за эту отложенную загрузку, был wtsapi32.dll .
Я открыл wtsapi32.dll в Ghidra и использовал Search -> For Strings -> Filter: WINSTA.dll . Двойной клик по найденной строке приведет вас к ее локации в памяти.
Строка « WINSTA.dll » в wtsapi32.dll
Кликнув правой кнопкой мыши по локации в памяти, мы сможем найти любые ссылки на этот адрес.
Ссылки на WINSTA.dll
Следуя ссылкам, мы видим, что строка WINSTA.dll передается в структуру с именем ImgDelayDescr . Глядя на документацию по этой структуре, мы можем подтвердить, что она связана с отложенной загрузкой DLL.
Эту структуру можно передать в __delayLoadHelper2 , который будет использовать LoadLibrary / GetProcAddress для загрузки указанной DLL и исправления адреса импортируемой функции в таблице адресов импорта отложенной загрузки (IAT).
Найдя другие ссылки на нашу структуру ImgDelayDescr , мы можем найти вызов __delayLoadHelper2 , который затем вызывает ResolveDelayLoadedAPI . Я переименовал имя функции, типы и переменные, чтобы облегчить понимание.
__delayLoadHelper2 и ResolveDelayLoadedAPI в Ghidra
Отлично! Это соответствует тому, что мы видели в нашем ProcMon стек трейсе, когда Slack пытался загрузить WINSTA.dll .
__delayLoadHelper2 и ResolveDelayLoadedAPI в ProcMon.
Такое поведение было единообразно для WINSTA.dll , LINKINFO.dll , ntshrui.dll и srvcli.dll . Основным отличием каждой DLL с отложенной загрузкой была «родительская» DLL. Во всех трех приложениях:
- wtsapi32.dll отложено загружала WINSTA.dll
- shell32.dll отложенно загружала LINKINFO.dll
- LINKINFO.dll отложено загружала ntshrui.dll
- ntshrui.dll отложено загружала srvcli.dll
Подмена DLL в NetShareGetInfo и NetShareEnum
Я следил за стек трейсом, когда Slack пытался загрузить cscapi.dll и видел вызов LoadLibraryExW , который, по-видимому, исходил из srvcli.dll .
Стек трейс при загрузке cscapi.dll
Я открыл srvcli.dll в Ghidra и использовал Search -> For Strings -> Filter: cscapi.dll . Двойной клик по найденной строке и переход по ссылкам приводит к ожидаемому LoadLibrary вызову.
srvcli.dll вызывает LoadLibrary для cscapi.dll
Переименовав функцию, содержащую вызов LoadLibrary , и проследовав по ссылкам, я получил два места использования функции:
NetShareGetInfo загружает cscapi.dll
Я проверил это с помощью РоС программ, которые вызывали NetShareEnum и NetShareGetInfo :
NetShareEnum.exe загружает cscapi.dll
NetShareGetInfo.exe загружает cscapi.dll
Результаты
В Slack доступны следующие пути подмены DLL:
В Microsoft Teams доступны следующие пути подмены DLL:
В Visual Studio Code доступны следующие пути подмены DLL:
Кроме того, я обнаружил, что программы, использующие NetShareEnum и NetShareGetInfo , предоставляют возможность подмены DLL в форме cscapi.dll из-за жестко захардкоженного вызова LoadLibrary . Я подтвердил это поведение с помощью Ghidra и PoC.
Заключение
Напомним, что перехват DLL — это метод, с помощью которого злоумышленники могут повлиять на выполнение кода в подписанных/доверенных приложениях. Я создал инструменты, помогающие автоматизировать обнаружение путей перехвата DLL. Используя этот инструмент, я обнаружил пути перехвата DLL в Slack, Microsoft Teams и Visual Studio Code.
Я заметил, что пути перехвата DLL этих трех приложений частично совпадают, и исследовал причину. Я осветил свою методику понимания данного совпадения. Я узнал о DLL с отложенной загрузкой и обнаружил два вызова API, которые делают возможным перехват DLL в любой программе, которая их вызывает:
- NetShareEnum загружает cscapi.dll
- NetShareGetInfo загружает cscapi.dll
Ссылки
Часть 1 , Что такое DLL?
DLL, что означает Dynamic Link Library, представляет собой файл, в котором хранятся инструкции, которые могут вызывать программы для выполнения определенных задач, включая встроенные и сторонние программы. На самом деле, несколько программ могут совместно использовать возможности в одном файле DLL и даже делать это одновременно. В отличие от клиентского файла программы, который заканчивается расширением EXE, файлы DLL не могут быть открыты или прочитаны напрямую. И они хранят молчание на вашем жестком диске, пока не будут вызваны определенным кодом, который работает. Другими словами, ошибка DLL может привести к повреждению программ и некоторых функций в Windows.
Большинство файлов DLL заканчиваются расширением .DLL; другие могут использовать .EXE, .OCX, .CPL или .DRV.
Часть 2 , Распространенные ошибки DLL
1. D3dx9_43.dll (D3dx9_43.dll не найден). Ошибки D3dx9_43.dll вызваны проблемами с Microsoft DirectX.
3. Xinput1_3.dll (Xinput1_3.dll отсутствует). Эта ошибка связана с Microsoft DirectX, особенно с играми и продвинутыми графическими программами.
4. Hal.dll (отсутствует или поврежден Hal.dll). Эта ошибка обычно появляется вскоре после первого запуска компьютера.
5. Kernel32.dll (ошибка неверной страницы в модуле Kernel32.dll). Kernel32.dll способен защитить пространство памяти Windows и не дать другим программам использовать то же пространство.
6. Ntdll.dll (Неизвестная трудная ошибка Ntdll.dll). Ошибка ntdll DLL обычно вызвана повреждением файла ntdll, драйверами оборудования и другими проблемами.
7. Ceber атакует ваш компьютер. (Использование Превосходный.)
Часть 3 , Исправлена ошибка отсутствия файлов DLL
Сканирование SFC - это встроенная функция Windows, целью которой является сканирование системных файлов и восстановление любых поврежденных или удаленных.
Шаг 1 : Перейдите в меню «Пуск» и запустите «Командную строку от имени администратора».
Шаг 2 : Введите «sfc / scannow» и нажмите клавишу «Enter», чтобы запустить процесс сканирования. После этого система должна автоматически восстановить отсутствующие файлы DLL.
Другой метод - DISM, инструмент для управления образами и обслуживанием.
Шаг 1 : Также запустите CMD и выполните команду «DISM / Online / Cleanup-Image / RestoreHealth».
Шаг 2 : 10 минут спустя, когда вы обнаружите, что процесс завершен, вы можете перезагрузить компьютер. Ошибка DLL должна исчезнуть.
Метод 3: переустановите программы
Как упоминалось ранее, файлы DLL связаны с программами. Если ошибка появляется при открытии определенной программы, например, Internet Explorer или стороннего приложения, обновите программу или переустановите ее. Обновление и установка могут содержать отсутствующий файл DLL.
Это решение также поможет вам восстановить потерянный файли другие системные файлы легко. Конечно, вы потеряете DLL-файлы на диске C.
Метод 4: скачать определенный файл DLL онлайн
Если вы попробовали описанные выше методы и проблема не устранена, вы можете загрузить определенный файл DLL онлайн.
Метод 5: исправление отсутствующих файлов DLL путем сброса ПК с Windows
Шаг 1 : Откройте меню «Пуск», перейдите в «Настройки»> «Обновление и безопасность» и выберите «Восстановление» на левой панели.
Шаг 1 : При возникновении ошибки DLL перезагрузите компьютер и продолжайте нажимать F8 до появления логотипа Windows. Затем выберите «Безопасный режим с командной строкой» в меню загрузки.
Шаг 2 : Выполните команду ниже, когда появится окно командной строки: «% systemroot% \ system32 \ restore \ rstrui.exe».
Шаг 3 : Затем следуйте инструкциям на экране, чтобы восстановить ваш компьютер и отсутствующие файлы DLL.
Часть 4 , Как восстановить отсутствующие файлы DLL
Если вы просто хотите быстро восстановить отсутствующие DLL-файлы, рекомендуем вам попробовать Apeaksoft Восстановление данных, Его основные функции:
1. Восстановите DLL-файлы за один клик, чтобы даже новички могли понять это за несколько секунд.
2. Восстановление отсутствующих DLL-файлов в различных ситуациях, например, файл был случайно удален, поврежден, поврежден, подвержен воздействию вирусов и т. Д.
3. Поддержка различных типов данных и форматов, включая DLL, EXE, OCX, CPL, DRV и т. Д.
4. Восстановите удаленные файлы DLL в оригинальном формате и качестве.
5. Посмотрите на все потерянные файлы DLL, упорядоченные по форматам, и решите восстановить все из них или несколько конкретных.
6. Помимо файлов DLL, вы также можете восстановить музыку, видео, фотографии, документы и другие данные с вашего компьютера.
7. Кроме того, восстановление данных доступно для Windows 10 / 8.1 / 8 / Vista / XP.
Короче говоря, это лучший вариант для быстрого восстановления отсутствующих файлов DLL и избавления от проблем, связанных с файлами DLL.
Как восстановить недостающие файлы DLL в один клик
Шаг 1. Сканирование всей системы для поиска файлов DLL
Перейдите в область типа данных, выберите опцию «Другие». Затем перейдите в область расположения и выберите, где изначально находился файл DLL, например, «Локальный диск». Восстановление данных будет работать, как только вы нажмете кнопку «Сканировать».
Шаг 2. Предварительный просмотр отсутствующих файлов DLL перед восстановлением
Когда появится окно результатов сканирования, нажмите «Другие» с левой стороны и откройте папки с названием «DLL» на правой панели для предварительного просмотра удаленных файлов DLL. Кроме того, функция «Фильтр» на верхней ленте позволяет быстро находить файл по ключевым словам. Если вы не можете найти соответствующий файл DLL, нажмите кнопку «Глубокое сканирование», чтобы выполнить глубокое сканирование системы.
Шаг 3. Восстановите отсутствующий файл DLL в один клик
Наконец, выберите потерянный файл DLL в окне результатов и нажмите кнопку «Восстановить», чтобы восстановить его до исходного состояния.
Заключение
Читайте также: