Как установить dll в gac

Обновлено: 30.06.2024

Остальная часть кода выглядит отлично. Просто используйте весь путь сборки, а не просто имя сборки.

Используйте метод GacInstall () в классе Publish для GAC сборки легко. Добавьте ссылку на System.EnterpriseServices . Убедитесь, что определенная dll Подписано , В GAC можно добавить только подписанную сборку.

DotNetRuChat

ExtremeCode

Общение на темы YouTube канала и программирования. Вакансии не размещаем. Коммерческие предложения на YouTube: @Mshvyag Курилка (флуд здесь): @extremecode_rest C/C++ чат: @fckcxx

Троелсен говорит, что для подключения своей библиотеки, размещенной в GAC, придется указать через вкладку "Browse" исходники оригинального проекта .
Это очень неудобно.

Однако, давно заметил, что все библиотеки того же StimulSoft.NET отображаются в диалоговом окне "Add references" на вкладке ".NET" и их можно легко выбрать, подключив к своему проекту.

Возможно мой вопрос не понят, перефразирую его: Вопреки утверждению Троелсена, вижу, что сторонние разработчики могут регистрировать свои библиотеки в GAC так, чтобы их сборки отображались через диалоговое окно "Add references" на вкладке ".NET, и при этом ее можно выбрать. Т.е. нет необходимости лезть через "Browse" в исходники оригинального проекта.

Да, похоже, что это именно то, что нужно:


Т.е. данный вопрос все же как-то решается. Как?Читаем файлы readme.txt в папках

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies

Т.е. данный вопрос все же как-то решается. Как?Читаем файлы readme.txt в папках

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies


Для чего вообще нужно внедрять свои DLL-ки в чужие процессы и устанавливать там хуки? Для того, чтобы понять какие функции будет вызывать это приложение, с какими параметрами и что эти функции вернут. Таким образом мы можем понять внутреннюю логику работы этого приложения, узнать к каким файлам оно пытается получить доступ, какие данные пересылает по сети, мы можем добавить в него логирование, профилирование, отладить баг, получить из приложения некоторые данные или наоборот — добавить в его интерфейс что-нибудь нужное нам. Хуки использует известная утилита Spy++ для работы с окнами приложений, DirectX-отладчики вроде RenderDoc, некоторые утилиты от SysInternals, программы типа ApiMonitor и т.д.

Некоторое время назад я писал вводные статьи об использовании хуков на примерах библиотек Microsoft Detours и madCodeHook (если вы совсем не знакомы с хуками — это то, с чего можно начать). Описанных там техник достаточно для работы с обычными приложениями, но время не стоит на месте и вот сегодня у нас уже есть Metro Modern-приложения, входящие в комплект Windows 8 и Windows 10, а также распространяющиеся через Microsoft Store программы сторонних производителей. К примеру, новый браузер Spartan — это Modern-приложение. Внедрение DLL в эти процессы имеет свои особенности и на первый взгляд может даже показаться невозможным, но это не так. В этой статье я расскажу, как мы можем залезть внутрь Modern-приложения и установить в нём хуки в своих коварных целях.

  • InjectedLibrary32.dll
  • InjectedLibrary64.dll
  • Injector32.exe
  • Injector64.exe

Доступ к внедряемой DLL
Как вы, возможно, знаете, Modern-приложения живут в своих песочницах, откуда они имеют доступ только к своей папке и некоторым другим доступным для них (ограниченным) ресурсам ОС. К примеру, Modern-приложение не может вот просто так взять и открыть любой файл с диска. Для нас это означает то, что попытавшись заставить чужое приложение подгрузить нашу библиотеку в своё адресное пространство — мы получим ошибку доступа. Это можно легко увидеть, воспользовавшись, к примеру, утилитой ProcMon.


Что же делать? Разрешить доступ к файлу внедряемой библиотеки для Modern-приложений. Для этого есть системная утилита icacls. Вот эта команда открывает доступ к файлу на диске для всех Modern-приложений:

Теперь ошибки доступа у нас не будет.

Линковка DLL-ки
Но не всё так просто. DLL-ка может иметь зависимости. И даже если вам кажется, что их нет — возможно, вы забываете о зависимости от VC++ Runtime Library. По умолчанию созданная в Visual Studio С++ библиотека предполагает динамическую линковку с рантайм-библиотекой С++. Это означает, что когда какое-то приложение захочет загрузить вашу библиотеку — функция LoadLibrary() первым делом увидит, что вам необходима, к примеру, библиотека msvcp90r.dll и попытается её найти, что вобщем-то, получится если речь идёт об обычном (не Modern) приложении и наличии соответствующего VC++ Redistribution Package. Что касается Modern-приложений, то порядок поиска DLL-ок совсем другой. Если коротко: будучи вызванной из Modern-приложения, LoadLibrary() не найдёт библиотеки VC++ Redistribution Package, даже если они до этого были успешно установлены.

  • Копировать VC++ Runtime Library в папку Modern-приложения
  • Копировать VC++ Runtime Library в %SystemRoot%\system32
  • Прописать библиотеки в специальный раздел в реестре (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs)
  • Использовать статическую линковку (когда код VC++ Runtime Library включается в тело нашей DLL-ки)

Первые два способа крайне некрасивы (а без аккаунта администратора и невозможны), третий — сработает, но влияет на глобальную конфигурацию ОС, что тоже может быть чревато последствиями. Так что самый простой вариант — статическая линковка (ключи /MTd и /MT на вкладке Code Generation).


Цифровая подпись
Решив все вопросы с доступом к файлу DLL-ки может показаться, что у нас всё получилось — ProcMon не показывает никаких ошибок доступа. Но инъекция всё равно не работает — DLL-ка не появляется в списке загруженных модулей процесса. Что же пошло не так? На этот вопрос нам даёт ответ просмотр Windows Event Viewer.


Операционная система не хочет загружать нашу DLL-ку, поскольку она не подписана. В этом месте мне стало тревожно, поскольку я уж было подумал, что все модули, загружаемые в Modern-приложение, должны быть подписаны цифровой подписью одного издателя (разработчика). Но, к счастью, это не так. Windows требует от DLL-ки просто наличия валидной цифровой подписи, но не требует её соответствия подписи автора приложения. Т.е. мы можем взять подписанную DLL-ку от Хрома и забросить её в Spartan. Что же делать нам? Получить сертификат и подписывать нашу DLL-ку.

Да, это серьёзно усложняет работу. Но ведь в принципе, если мы разрабатываем нормальный продукт, а не какие-нибудь вирусы\трояны\малвари\кейлоггеры\локеры — у нас не будет проблем с получением сертификата и его использованием для подписи DLL-ки. Вообще, я считаю эту защиту одной из самых серьёзных шагов Microsoft по защите пользовательских данных и изоляции Modern-приложений в песочнице. Фактически от желающего пробросить мостик к приложению требуют предъявить документы и идентифицироваться, а это остановит 99% скрипт-киддисов.

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

Воспользуемся инструментом Regsvr32 командной строки, который регистрирует и отменяет регистрацию DLL библиотек и ActiveX (OCX) в Windows 10/8.1/7.

Отмена и повторная регистрация DLL библиотеки

Путь к DLL библиотеке можно скопировать, чтобы не писать его вручную в командой строке. Для этого, зажмите левый Shift и нажмите правой кнопкой мыши по DLL фалу, после чего "Копировать как путь".

найти и скопировать путь к библиотке DLL

Наберите в поиске "Командная строка" и нажмите по ней правой кнопкой мыши, после чего выберите "Запустить от имени администратора" и вводите ниже команды, которые вам необходимы.

командная строка запуск от имени администратора

В командную строку введите следующую команду, чтобы зарегистрировать DLL библиотеку в системе Windows.

регистрация DLL

Отменить регистрацию файла DLL

Чтобы отменить текущую регистрацию DLL файла, введите ниже команду и нажмите Enter:

Отменить регистрацию DLL файла

Перерегистрировать все файлы dll

Чтобы зарегистрировать все файлы dll в системе Windows, то:

Перерегистрировать все файлы dll

  1. Если 32-разрядная DLL находится в папке System32, то переместите ее в папку SysWoW64 и введите ниже команду.

или

Что нужно учесть?

1. В 64-разрядной версии операционной системы Windows существует две версии файла Regsv32.exe:

  • 64-разрядная версия - это %systemroot%\System32\regsvr32.exe
  • 32-разрядная версия - это % systemroot%\ SysWoW64\regsvr32.exe.

2. В 64-разрядной версии Windows, 32-разрядные файлы DLL всегда находятся в папке Windows\SysWOW64. В то время как 64-битные библиотеки DLL находятся в папке Windows\System32. В 32-битной версии Windows, файлы DLL находятся только в папке Windows\System32. Здесь не будет папки SysWOW64.

3. Если вы получаете ошибки, такие как DllRegisterServer, модуль несовместим с версией Windows или точка входа не найдена, то знайте:

  • Много DLL библиотек, таких как d3dx9_43.dll, MSVCR71.dll, VCRUNTIME140.dll, находятся в сторонних компонентах как DirectX, NET Framework и Visual C++, которые нужно скачать на сайте Microsoft и установить. Вы можете в интернете почитать о самом файле, к чему он относится. Также, можете воспользоваться поиском на этом сайте, так как я много описывал решений о проблемах с DLL файлами.
  • Отмените регистрацию и зарегистрируйте DLL файл повторно.

4. Отключите на время контроль учетных записей ( UAC ) во время регистрации DLL, так как он может мешать процессу.

Смотрите еще:

telegram

Загрузка комментариев Канал Чат

Читайте также: