~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 743116CA7C3AB1C2CE98B119364602FB__1715058600 ✰
Заголовок документа оригинал.:
✰ Dynamic-link library - Wikipedia ✰
Заголовок документа перевод.:
✰ Динамическая библиотека — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Dynamic-link_library ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/74/fb/743116ca7c3ab1c2ce98b119364602fb.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/74/fb/743116ca7c3ab1c2ce98b119364602fb__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 12:48:29 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 7 May 2024, at 08:10 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Динамическая библиотека — Википедия Jump to content

Динамическая библиотека

Из Википедии, бесплатной энциклопедии
Динамически подключаемая библиотека
Расширение имени файла
.dll
Тип интернет-СМИ
приложение/vnd.microsoft.portable-исполняемый файл
Единый идентификатор типа (UTI) com.microsoft.windows-динамическая-ссылка-библиотека
Магическое число МЗ
Разработан Майкрософт
Контейнер для Общая библиотека

Библиотека динамической компоновки (DLL) — это общая библиотека в Microsoft Windows или OS/2 операционной системе .

DLL может содержать исполняемый код (функции), данные и ресурсы в любой комбинации.

Расширения файлов [ править ]

Файл DLL часто имеет расширение. .dll, но может иметь любое расширение файла. Разработчики могут использовать расширение файла, которое описывает содержимое файла, например .ocx для элементов управления ActiveX и .drv для устаревшего драйвера устройства .

DLL, содержащую только ресурсы, можно назвать ресурсной DLL . Примеры включают значков библиотеку , иногда имеющую расширение .iclи библиотека шрифтов , имеющая расширения .fon и .fot. [1]

Формат файла [ править ]

Формат файла DLL такой же, как и у исполняемого файла (он же EXE ), но разные версии Windows используют разные форматы. В 32- и 64-разрядных версиях Windows используется переносимый исполняемый файл (PE), а в 16-разрядных версиях Windows — новый исполняемый файл (NE).

Основное различие между DLL и EXE заключается в том, что DLL не может быть запущена напрямую, поскольку операционной системе требуется точка входа для начала выполнения. Windows предоставляет служебную программу (RUNDLL.EXE/RUNDLL32.EXE) для выполнения функции, предоставляемой DLL.

Поскольку они имеют одинаковый формат, EXE-файл можно использовать как DLL. Потребляющий код может загружать EXE-файл с помощью того же механизма, что и загрузка DLL.

Предыстория [ править ]

Первые версии Microsoft Windows запускали программы вместе в одном адресном пространстве . Каждая программа должна была взаимодействовать, уступая центральный процессор другим программам, чтобы графический интерфейс пользователя (GUI) мог выполнять многозадачность и был максимально отзывчивым. Все операции на уровне операционной системы обеспечивались базовой операционной системой: MS-DOS . Все службы более высокого уровня предоставлялись библиотеками Windows «Библиотека динамической компоновки». рисования API , интерфейс графического устройства (GDI), был реализован в DLL под названием GDI.EXE, пользовательский интерфейс в USER.EXE. Эти дополнительные уровни поверх DOS должны были использоваться всеми запущенными программами Windows не только для того, чтобы позволить Windows работать на машине с менее чем мегабайтом оперативной памяти, но и для того, чтобы программы могли взаимодействовать друг с другом. Код в GDI должен был преобразовать команды рисования в операции на конкретных устройствах. На дисплее ему приходилось манипулировать пикселями в буфере кадра. При рисовании на принтере вызовы API нужно было преобразовать в запросы к принтеру. Хотя можно было обеспечить жестко запрограммированную поддержку ограниченного набора устройств (например, дисплея цветного графического адаптера HP LaserJet , языка команд принтера ), Microsoft выбрала другой подход. GDI будет работать, загружая разные фрагменты кода, называемые « драйверами устройств », для работы с разными устройствами вывода.

Та же архитектурная концепция, которая позволяла GDI загружать разные драйверы устройств, также позволяла оболочке Windows загружать различные программы Windows, а также вызывать эти программы вызовы API из общих библиотек USER и GDI. Этой концепцией было «динамическое связывание».

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

В тех ранних версиях Windows (от 1.0 до 3.11) библиотеки DLL были основой всего графического интерфейса. Таким образом, драйверы дисплея представляли собой просто библиотеки DLL с расширением .DRV, которые предоставляли пользовательские реализации одного и того же API рисования через унифицированный интерфейс драйвера устройства (DDI), а API рисования (GDI) и GUI (USER) были просто экспортированными вызовами функций. GDI и USER — системные библиотеки DLL с расширением .EXE.

Идея создания операционной системы из набора динамически загружаемых библиотек является основной концепцией Windows, которая сохраняется с 2015 года. . DLL предоставляют стандартные преимущества разделяемых библиотек , такие как модульность . Модульность позволяет вносить изменения в код и данные в одной автономной DLL, используемой несколькими приложениями, без каких-либо изменений в самих приложениях.

Еще одним преимуществом модульности является использование универсальных интерфейсов для подключаемых модулей. Может быть разработан единый интерфейс, который позволяет беспрепятственно интегрировать как старые, так и новые модули во время выполнения в уже существующие приложения без каких-либо изменений в самом приложении. Эта концепция динамической расширяемости доведена до крайности в объектной модели компонентов , лежащей в основе ActiveX .

В Windows 1.x, 2.x и 3.x все приложения Windows использовали одно и то же адресное пространство и одну и ту же память. DLL загружалась в это адресное пространство только один раз; с этого момента все программы, использующие библиотеку, имели к ней доступ. Данные библиотеки использовались всеми программами. Это можно использовать как косвенную форму межпроцессного взаимодействия или случайно повредить различные программы. С появлением 32-битных библиотек в Windows 95 каждый процесс выполнялся в собственном адресном пространстве. Хотя код DLL может быть общим, данные являются конфиденциальными, за исключением случаев, когда общие данные явно запрашиваются библиотекой. Тем не менее, большая часть Windows 95 , Windows 98 и Windows Me была построена на основе 16-битных библиотек, что ограничивало производительность микропроцессора Pentium Pro при запуске и в конечном итоге ограничивало стабильность и масштабируемость версий Windows для DOS.

Ограничения [ править ]

Хотя технология DLL является основой архитектуры Windows, у нее есть недостатки.

DLL Ад [ править ]

Ад DLL описывает плохое поведение приложения при использовании неправильной версии DLL. [2] Стратегии смягчения последствий включают в себя:

Общая память [ править ]

Исполняемый код DLL выполняется в пространстве памяти вызывающего процесса и с теми же правами доступа, что означает небольшие накладные расходы при их использовании, но также и отсутствие защиты вызывающей программы, если DLL имеет какой-либо тип ошибка.

Особенности [ править ]

Возможность обновления [ править ]

Технология DLL позволяет изменять приложение, не требуя повторной компиляции или повторного связывания компонентов. Библиотеку DLL можно заменить, чтобы при следующем запуске приложения использовалась новая версия DLL. Для корректной работы изменения DLL должны поддерживать обратную совместимость .

Даже операционную систему можно обновить, поскольку она доступна приложениям через библиотеки DLL. Системные библиотеки DLL можно заменить, чтобы при следующем запуске приложений они использовали новые системные библиотеки DLL.

Управление памятью [ править ]

В Windows API файлы DLL организованы в разделы . Каждый раздел имеет свой собственный набор атрибутов, например, доступен ли он для записи или только для чтения, исполняемый (для кода) или неисполняемый (для данных) и так далее.

Код в DLL обычно используется всеми процессами, использующими эту DLL; то есть они занимают одно место в физической памяти, а не занимают место в файле подкачки . Windows не использует позиционно-независимый код для своих DLL; вместо этого код перемещается по мере загрузки, фиксируя адреса всех точек входа в местах, свободных в пространстве памяти первого процесса, загружающего DLL. В старых версиях Windows, в которых все запущенные процессы занимали одно общее адресное пространство, для всех процессов всегда было достаточно одной копии кода DLL. Однако в более новых версиях Windows, которые используют отдельные адресные пространства для каждой программы, можно использовать одну и ту же перемещенную копию DLL в нескольких программах только в том случае, если каждая программа имеет одни и те же виртуальные адреса, свободные для размещения кода DLL. Если некоторые программы (или их комбинация уже загруженных DLL) не имеют этих свободных адресов, то необходимо будет создать дополнительную физическую копию кода DLL, используя другой набор перемещенных точек входа. Если необходимо освободить физическую память, занятую участком кода, ее содержимое отбрасывается, а затем при необходимости перезагружается непосредственно из файла DLL.

В отличие от разделов кода, разделы данных DLL обычно являются частными; то есть каждый процесс, использующий DLL, имеет собственную копию всех данных DLL. При желании разделы данных можно сделать общими, что позволит осуществлять взаимодействие между процессами через эту общую область памяти. Однако, поскольку пользовательские ограничения не распространяются на использование общей памяти DLL, это создает дыру в безопасности ; а именно, один процесс может повредить общие данные, что, вероятно, приведет к нежелательному поведению всех других процессов совместного использования. Например, процесс, запущенный под гостевой учетной записью, может таким образом повредить другой процесс, работающий под привилегированной учетной записью. Это важная причина избегать использования общих разделов в DLL.

Если DLL сжимается определенными упаковщиками исполняемых файлов (например, UPX ), все разделы ее кода помечаются как доступные для чтения и записи и не подлежат совместному использованию. Разделы кода для чтения и записи, как и разделы частных данных, являются частными для каждого процесса. Таким образом, библиотеки DLL с разделами общих данных не следует сжимать, если они предназначены для одновременного использования несколькими программами, поскольку каждый экземпляр программы должен иметь свою собственную копию DLL, что приводит к увеличению потребления памяти.

Импортировать библиотеки [ править ]

Как и статические библиотеки, библиотеки импорта для DLL отмечаются .libрасширение файла. Например, kernel32.dll , основная динамическая библиотека для базовых функций Windows, таких как создание файлов и управление памятью, связана через kernel32.lib. Обычный способ отличить библиотеку импорта от правильной статической библиотеки — это размер: библиотека импорта намного меньше, поскольку она содержит только символы, относящиеся к фактической DLL, которые должны обрабатываться во время компоновки. Тем не менее, оба файла являются файлами формата Unix .

Связывание с динамическими библиотеками обычно осуществляется путем связывания с библиотекой импорта при сборке или связывании для создания исполняемого файла. Созданный исполняемый файл затем содержит таблицу адресов импорта (IAT), по которой ссылаются на все вызовы функций DLL (каждая ссылочная функция DLL содержит собственную запись в IAT). Во время выполнения IAT заполняется соответствующими адресами, которые указывают непосредственно на функцию в отдельно загруженной DLL. [3]

В Cygwin/MSYS и MinGW библиотекам импорта обычно присваивается суффикс .dll.a, сочетающий в себе суффикс DLL Windows и суффикс ar Unix. Формат файла аналогичен, но символы, используемые для обозначения импорта, отличаются ( _head_foo_dll против __IMPORT_DESCRIPTOR_foo). [4] Хотя его набор инструментов GNU Binutils может генерировать библиотеки импорта и ссылаться на них, быстрее ссылаться на DLL напрямую. [5] Экспериментальный инструмент в MinGW под названием genlib можно использовать для создания библиотек импорта с символами в стиле MSVC.

Разрешение символов и привязка [ править ]

Каждая функция, экспортируемая DLL, идентифицируется числовым порядковым номером и, при необходимости, именем. Аналогично, функции можно импортировать из DLL либо по порядковому номеру, либо по имени. Порядковый номер представляет положение указателя адреса функции в таблице адресов экспорта DLL. Внутренние функции обычно экспортируются только по порядковому номеру. Для большинства функций Windows API в разных выпусках Windows сохраняются только имена; порядковые номера могут быть изменены. Таким образом, невозможно надежно импортировать функции Windows API по их порядковым номерам.

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

Также возможно привязать исполняемый файл к определенной версии DLL, то есть разрешить адреса импортируемых функций во время компиляции. Для связанного импорта компоновщик сохраняет метку времени и контрольную сумму библиотеки DLL, к которой привязан импорт. Во время выполнения Windows проверяет, используется ли та же версия библиотеки, и если да, то Windows обходит обработку импорта. В противном случае, если библиотека отличается от той, к которой была привязана, Windows обрабатывает импорт обычным способом.

Связанные исполняемые файлы загружаются несколько быстрее, если они запускаются в той же среде, для которой они были скомпилированы, и точно в то же время, если они запускаются в другой среде, поэтому привязка импорта не имеет недостатков. Например, все стандартные приложения Windows привязаны к системным библиотекам DLL соответствующей версии Windows. Хорошая возможность привязать импорт приложения к целевой среде во время установки приложения. Это сохраняет библиотеки «связанными» до следующего обновления ОС. Однако при этом изменяется контрольная сумма исполняемого файла, поэтому это невозможно сделать с подписанными программами или программами, управляемыми инструментом управления конфигурацией, который использует контрольные суммы (например, контрольные суммы MD5 ) для управления версиями файлов. Поскольку в более поздних версиях Windows отказались от фиксированных адресов для каждой загруженной библиотеки (по соображениям безопасности), возможность и ценность привязки исполняемого файла уменьшаются.

Явное связывание во время выполнения [ править ]

Файлы DLL могут быть явно загружены во время выполнения (процесс, называемый Microsoft просто динамическим связыванием во время выполнения) , с использованием LoadLibrary (или LoadLibraryEx) Функция API. GetProcAddress Функция API используется для поиска экспортированных символов по имени и FreeLibrary– выгрузить DLL. Эти функции аналогичны dlopen, dlsym, и dlclose в стандартном API POSIX .

Процедура явного связывания во время выполнения одинакова для любого языка, поддерживающего указатели на функции , поскольку она зависит от API Windows , а не от языковых конструкций.

Задержка загрузки [ править ]

Обычно приложение, связанное с библиотекой импорта DLL, не запускается, если DLL не может быть найдена, поскольку Windows не запустит приложение, пока не найдет все библиотеки DLL, которые могут понадобиться приложению. Однако приложение может быть связано с библиотекой импорта, чтобы обеспечить отложенную загрузку динамической библиотеки. [6] В этом случае операционная система не будет пытаться найти или загрузить DLL при запуске приложения; вместо этого компоновщик включает в приложение заглушку, которая попытается найти и загрузить DLL через LoadLibrary и GetProcAddressкогда вызывается одна из его функций. Если DLL не может быть найдена или загружена или вызываемая функция не существует, приложение сгенерирует исключение , которое можно перехватить и обработать соответствующим образом. Если приложение не обработает исключение, оно будет перехвачено операционной системой и завершит работу программы с сообщением об ошибке.

Механизм отложенной загрузки также предоставляет перехватчики уведомлений , позволяющие приложению выполнять дополнительную обработку или обработку ошибок при загрузке DLL и/или вызове любой функции DLL.

Вопросы компилятора и языка [ править ]

Делфи [ править ]

В исходном файле ключевое слово library используется вместо program. В конце файла функции, которые нужно экспортировать, перечислены в exports пункт.

Делфи не нужен LIBфайлы для импорта функций из DLL; для ссылки на DLL, external Ключевое слово используется в объявлении функции для обозначения имени DLL, за которым следует name назвать символ (если он отличается) или index для идентификации индекса.

Microsoft Visual Basic [ править ]

В Visual Basic (VB) поддерживается только связывание во время выполнения; но помимо использования LoadLibrary и GetProcAddress Функции API, объявления импортированных функций разрешены.

При импорте функций DLL через объявления VB генерирует ошибку времени выполнения, если DLLфайл не может быть найден. Разработчик может обнаружить ошибку и обработать ее соответствующим образом.

При создании библиотек DLL в VB среда IDE позволяет создавать только библиотеки DLL ActiveX, однако методы были созданы. [7] чтобы позволить пользователю явно указать компоновщику включить файл .DEF, который определяет порядковый номер и имя каждой экспортируемой функции. Это позволяет пользователю создать стандартную библиотеку Windows DLL с помощью Visual Basic (версии 6 или ниже), на которую можно ссылаться через оператор «Объявить».

C и C++ [ править ]

Microsoft Visual C++ (MSVC) предоставляет несколько расширений стандарта C++ , которые позволяют указывать функции как импортируемые или экспортируемые непосредственно в коде C++; они были приняты другими компиляторами C и C++ для Windows, включая версии GCC для Windows . Эти расширения используют атрибут __declspecперед объявлением функции. Обратите внимание: когда доступ к функциям C осуществляется из C++, их также необходимо объявить как extern "C" в коде C++, чтобы сообщить компилятору, что следует использовать связь C. [8]

Помимо указания импортируемых или экспортируемых функций с помощью __declspec атрибуты, они могут быть перечислены в разделе ИМПОРТ или ЭКСПОРТ на странице DEFфайл, используемый проектом. DEF файл обрабатывается компоновщиком, а не компилятором, и поэтому он не является специфичным для C++.

Компиляция DLL создаст оба DLL и LIBфайлы. LIBфайл (библиотека импорта) используется для связывания с DLL во время компиляции; в этом нет необходимости для связывания во время выполнения. Если DLL не является сервером модели компонентных объектов (COM), DLLФайл должен быть помещен в один из каталогов, перечисленных в переменной среды PATH, в системный каталог по умолчанию или в тот же каталог, где находится программа, использующая его. Библиотеки COM-сервера регистрируются с помощью regsvr32.exe, который помещает расположение библиотеки DLL и ее глобальный уникальный идентификатор ( GUID ) в реестр. Затем программы могут использовать DLL, просматривая ее GUID в реестре , чтобы определить ее местоположение, или создать экземпляр COM-объекта косвенно, используя его идентификатор класса и идентификатор интерфейса.

Примеры программирования [ править ]

Использование импорта DLL [ править ]

В следующих примерах показано, как использовать привязки для конкретного языка для импорта символов для связывания с DLL во время компиляции.

Дельфи

{$APPTYPE CONSOLE} 

 программы   Пример  ; 

  // функция импорта, которая складывает два числа 
 function   AddNumbers  (  a  ,   b   :   Double  )  :   Double  ;    СтдВызов  ;    внешний   «Example.dll»  ; 

  // основная программа 
 var 
    R  :   Double  ; 

  начало 
   R   :=   AddNumbers  (  1  ,   2  )  ; 
    Writeln  (  'Результат: '  ,   R  )  ; 
  конец  . 

С

Файл «Example.lib» должен быть включен (при условии, что файл example.dll создан) в проект перед статическим связыванием. Файл «Example.lib» автоматически создается компилятором при компиляции DLL. Невыполнение приведенного выше оператора приведет к ошибке компоновки, поскольку компоновщик не будет знать, где найти определение AddNumbers. Файл DLL «Example.dll» также может потребоваться скопировать в место, где будет создан файл .exe с помощью следующего кода:

#include   <windows.h> 
 #include   <stdio.h> 

 // Функция импорта, которая складывает два числа 
 extern   "C"   __declspec  (  dllimport  )   double   AddNumbers  (  double   a  ,   double   b  ); 

  int   main  (  int   argc  ,   char   *  argv  []) 
 { 
     двойной   результат   =   AddNumbers  (  1  ,   2  ); 
      printf  (  "Результат: %f  \n  "  ,   result  ); 
      вернуть   0  ; 
  } 

Использование явного связывания во время выполнения [ править ]

В следующих примерах показано, как использовать средства загрузки и связывания во время выполнения с использованием привязок Windows API для конкретного языка.

Обратите внимание, что все четыре примера уязвимы для атак с предварительной загрузкой DLL , поскольку файл example.dll может быть разрешен в непредусмотренном автором месте (если явно не исключено, что каталог приложения идет перед расположением системной библиотеки и без HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode[9] или HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CWDIllegalInDLLSearch[10] текущий рабочий каталог просматривается раньше, чем каталоги системной библиотеки), и, таким образом, обнаруживается вредоносная версия библиотеки. См. ссылку на руководство Microsoft по безопасной загрузке библиотек: следует использовать SetDefaultDllDirectories в kernel32 чтобы удалить каталог приложения и текущий рабочий каталог из пути поиска DLL, или используйте SetDllDirectoryW в kernel32 чтобы удалить текущий рабочий каталог из пути поиска DLL. [11]

Microsoft Visual Basic [ править ]

Option   Explicit 
 Declare   Function   AddNumbers   Lib   "Example.dll"   _ 
  (  ByVal   a   As   Double  ,   ByVal   b   As   Double  )   Как   Double 

 Sub   Main  ( ) 
	 Dim   Result   As   Double 
	 Result   =   AddNumbers  (  1  ,   2  ) 
	 Debug  .   Печать   «Результат: »   и   результат 
 End   Sub 

Делфи [ править ]

 программы  Пример  ; 
    {$APPTYPE CONSOLE} 
   использует   Windows  ; 
    var 
   AddNumbers  :  функция   (  a  ,   b  :   целое число  )  :   Double  ;    СтдВызов  ; 
    LibHandle  :  HMODULE  ; 
  начать 
   LibHandle   :=   LoadLibrary  (  'example.dll'  )  ; 
    если   LibHandle   <>   0   , то 
     AddNumbers   :=   GetProcAddress  (  LibHandle  ,   'AddNumbers'  )  ; 
    если   Assigned  (  AddNumbers  ),   то 
     Writeln  (   '1 + 2 ='  ,   AddNumbers  (   1  ,   2   )   )  ; 
    Читать  ; 
  конец  . 

С [ править ]

#include   <windows.h> 
 #include   <stdio.h> 

 // сигнатура функции DLL 
 typedef   double   (  *  importFunction  )(  double  ,   double  ); 

  int   main  (  int   argc  ,   char   **  argv  ) 
 { 
	 importFunction   addNumbers  ; 
	  двойной   результат  ; 
	  ХИНСТАНС   hinstLib  ; 

	  // Загружаем DLL-файл 
	 hinstLib   =   LoadLibrary  (  TEXT  (  "Example.dll"  )); 
	  if   (  hinstLib   ==   NULL  )   { 
		 printf  (  "ОШИБКА: невозможно загрузить DLL  \n  "  ); 
		  вернуть   1  ; 
	  } 

	 // Получаем указатель функции 
	 addNumbers   =   (  importFunction  )   GetProcAddress  (  hinstLib  ,   "AddNumbers"  ); 
	  if   (  addNumbers   ==   NULL  )   { 
		 printf  (  "ОШИБКА: невозможно найти функцию DLL  \n  "  ); 
		  Бесплатная библиотека  (  hinstLib  ); 
		  вернуть   1  ; 
	  } 

	 // Вызов функции. 
	  результат   =   addNumbers  (  1  ,   3  ); 

	  // Выгружаем DLL-файл 
	 FreeLibrary  (  hinstLib  ); 

	  // Отображение результата 
	 printf  (  "Результат: %f  \n  "  ,   result  ); 

	  вернуть   0  ; 
  } 

Питон [ править ]

Привязка Python ctypes будет использовать POSIX API в системах POSIX.

импортировать   ctypes 

 my_dll   =   ctypes  .   компакт-диск  .   LoadLibrary  (  "Example.dll"  ) 

 # Следующая спецификация метода "restype" необходима, чтобы 
 # Python понял, какой тип возвращается функцией. 
  моя_dll  .   ДобавитьНомера  .   ретип   =   ctypes  .   c_double 

 p   =   my_dll  .   AddNumbers  (  ctypes.c_double  1.0  print  (  )  ,   ctypes.c_double  (  2.0  (  )  ) 

 "  "  Результат был:  ,   p  ) 

Компонентная объектная модель [ править ]

Модель компонентных объектов (COM) определяет двоичный стандарт для размещения реализации объектов в файлах DLL и EXE. Он предоставляет механизмы для поиска и версии этих файлов, а также независимое от языка и машиночитаемое описание интерфейса. Размещение COM-объектов в DLL является более легким и позволяет им совместно использовать ресурсы с клиентским процессом. Это позволяет COM-объектам реализовывать мощные серверные части для простых интерфейсов с графическим интерфейсом, таких как Visual Basic и ASP. Их также можно запрограммировать на языках сценариев. [12]

Взлом DLL [ править ]

Из-за уязвимости , широко известной как перехват DLL, подмена DLL, предварительная загрузка DLL или установка двоичных файлов, многие программы загружают и выполняют вредоносную DLL, содержащуюся в той же папке, что и файл данных, открытый этими программами. [13] [14] [15] [16] Уязвимость была обнаружена Георгием Гунинским в 2000 году. [17] В августе 2010 года он получил всемирную известность после того, как компания ACROS Security вновь обнаружила его и многие сотни программ были признаны уязвимыми. [18] Программы, которые запускаются из небезопасных мест, т. е. из папок, доступных для записи пользователем, таких как «Загрузки» или каталог Temp , почти всегда подвержены этой уязвимости. [19] [20] [21] [22] [23] [24] [25]

См. также [ править ]

Ссылки [ править ]

  1. ^ Корпорация Майкрософт. «Создание DLL, предназначенной только для ресурсов» . Сетевая библиотека разработчиков Microsoft .
  2. ^ «Конец ада DLL» . Корпорация Майкрософт. Архивировано из оригинала 6 мая 2008 г. Проверено 11 июля 2009 г.
  3. ^ «Понимание таблицы адресов импорта» . Sandsprite.com . Архивировано из оригинала 7 ноября 2023 года . Проверено 7 ноября 2023 г.
  4. ^ «Создание и использование DLL» . Библиотека импорта представляет собой обычную UNIX-подобную библиотеку .a, но она содержит лишь малую часть информации, необходимой для того, чтобы сообщить ОС, как программа взаимодействует с («импортирует») dll. Эта информация связана с .exe.
  5. ^ «ld и WIN32» . лд документация .
  6. ^ «Поддержка компоновщика для библиотек DLL с отложенной загрузкой» . Корпорация Майкрософт . Проверено 11 июля 2009 г.
  7. ^ Петруша, Рон (26 апреля 2005 г.). «Создание библиотеки DLL Windows с помощью Visual Basic» . О'Рейли Медиа . Проверено 11 июля 2009 г.
  8. ^ MSDN , Использование extern для указания связи
  9. ^ «Порядок поиска в динамической библиотеке» . Сеть разработчиков Microsoft . Проверено 9 февраля 2023 г.
  10. ^ «Доступна новая запись реестра CWDillegalInDllSearch для управления алгоритмом поиска пути DLL» . Поддержка Майкрософт .
  11. ^ «Безопасная загрузка библиотек для предотвращения атак с предварительной загрузкой DLL» . Поддержка Майкрософт . Проверено 28 октября 2019 г.
  12. ^ Сатран, Майкл. «Объектная модель компонентов (COM)» . msdn.microsoft.com .
  13. ^ Бьёрклунд, Андреас; Клёвстедт, Йохан; Вестергрен, Свен. «Подмена DLL в Windows» (PDF) . Факультет информационных технологий Уппсальского университета . Архивировано (PDF) из оригинала 7 ноября 2023 г. Проверено 7 ноября 2023 г.
  14. ^ «Атаки с предварительной загрузкой DLL» . msdn.com . Проверено 25 марта 2018 г.
  15. ^ «Дополнительная информация о векторе удаленной атаки с предварительной загрузкой DLL» . technet.com . Проверено 25 марта 2018 г.
  16. ^ «Обновление вектора удаленной атаки с предварительной загрузкой DLL» . technet.com . Проверено 25 марта 2018 г.
  17. ^ «Двойной щелчок по документам MS Office из проводника Windows в некоторых случаях может запускать произвольные программы» . www.guninski.com . Проверено 25 марта 2018 г.
  18. ^ «Бинарная установка — официальный веб-сайт забытой уязвимости. Безопасность ACROS» . www.binaryplanting.com . Проверено 25 марта 2018 г.
  19. ^ Дорманн, Уилл (4 сентября 2008 г.). «Ковровая бомбардировка и отравление директорией» . Университет Карнеги-Меллона — Блог SEI . Архивировано из оригинала 7 ноября 2023 года . Проверено 7 ноября 2023 г.
  20. ^ «От разработчиков до Mozilla: пожалуйста, сбросьте старые процессы установки Windows» . theregister.co.uk . Проверено 25 марта 2018 г.
  21. ^ «Gpg4win — Рекомендации по безопасности Gpg4win 25 ноября 2015 г.» . www.gpg4win.org . Проверено 25 марта 2018 г.
  22. ^ «McAfee KB — Бюллетень по безопасности McAfee: исправление безопасности для нескольких программ установки и удаления McAfee (CVE-2015-8991, CVE-2015-8992 и CVE-2015-8993) (TS102462)» . service.mcafee.com . Проверено 25 марта 2018 г.
  23. ^ «fsc-2015-4 — F-Secure Labs» . www.f-secure.com . Архивировано из оригинала 31 июля 2017 года . Проверено 25 марта 2018 г.
  24. ^ «Уязвимость перехвата порядка поиска DLL ScanNow и устаревание» . Rapid7.com . 21 декабря 2015 года . Проверено 25 марта 2018 г.
  25. ^ Команда VeraCrypt. «oss-sec: CVE-2016-1281: Установщики Windows TrueCrypt и VeraCrypt допускают выполнение произвольного кода с повышением привилегий» . сайт seclists.org . Проверено 25 марта 2018 г.
  • Харт, Джонсон. Системное программирование Windows, третье издание . Аддисон-Уэсли, 2005 г. ISBN   0-321-25619-0 .
  • Ректор, Брент и др. Программирование Win32 . Addison-Wesley Developers Press, 1997. ISBN   0-201-63492-9 .

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 743116CA7C3AB1C2CE98B119364602FB__1715058600
URL1:https://en.wikipedia.org/wiki/Dynamic-link_library
Заголовок, (Title) документа по адресу, URL1:
Dynamic-link library - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)