Как узнать адрес dll

Обновлено: 03.07.2024

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

  • если DLL с тем же самым именем модуля уже загружена в память, система проверит только [следует ли выполнить] перенаправление [перенаправление включается наличием в папке с исполняемым файлом приложения пустого файла с таким же именем, как у приложения, и расширением .local и указывает системе начать поиск DLL с папки, в которой находится этот файл .local ] и манифест [на наличие указаний о местонахождении нужной DLL] и [при отсутствии перенаправления и манифеста] будет считать результатом поиска загруженную DLL, при этом не будет иметь значения, в каком каталоге эта загруженная DLL находится. Система не станет выполнять других действий по поиску DLL;
  • если DLL есть в списке библиотек DLL, известных той версии операционной системы Windows, в которой запущено приложение, система использует свою копию известной DLL (и свои копии библиотек DLL, от которых эта известная DLL зависит, если таковые имеются) вместо того, чтобы искать эту DLL. Увидеть список известных текущей системе DLL можно, обратившись к следующему ключу реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\KnownDLLs;
  • если DLL имеет зависимости [от других DLL] , система будет искать библиотеки DLL, от которых зависит исходная, так, как если бы эти библиотеки загружались с указанием только имен их модулей. Это правило остается верным, даже если исходная DLL загружалась с указанием полного пути к ней.

Когда приложение «Windows Store» загружает упакованный модуль [DLL] посредством вызова функции LoadPackagedLibrary, DLL должна находиться в графе зависимостей пакета для процесса. Подробнее об этом читайте в описании функции LoadPackagedLibrary. Когда приложение «Windows Store» загружает модуль [DLL] другими средствами и не указывает полный путь к нему, система ищет DLL и ее зависимости [модули, от которых эта DLL зависит] во время запуска программы так, как описано в этом разделе.

Замечание для пользователей предыдущих по отношению к свежим на дату написания статьи версиям операционных систем Windows (Windows 7 (вики: с 22.10.2009 г.), Windows Server 2008 R2 (вики: с 22.10.2009 г.), Windows Vista (вики: с 30.11.2006 г.), Windows Server 2008 (вики: с 12.12.2008 г.), Windows Server 2003 (вики: с 24.04.2003 г.) и Windows XP (вики: с 24.08.2001 г.)): приложения «Windows Store» поддерживаются, начиная с операционных систем «Windows 8» (вики: с 26.10.2012 г.) и «Windows Server 2012» (вики: с 04.09.2012 г.).

  • если DLL с таким же именем модуля уже загружена в память, система будет использовать загруженную DLL, при этом не будет иметь значения, в каком каталоге эта загруженная DLL находится. Система не станет выполнять других действий по поиску DLL;
  • если DLL есть в списке библиотек DLL, известных той версии операционной системы Windows, в которой запущено приложение, система использует свою копию известной DLL (и свои копии библиотек DLL, от которых эта известная DLL зависит, если таковые имеются) вместо того, чтобы искать эту DLL. Увидеть список известных текущей системе DLL можно, обратившись к следующему ключу реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\KnownDLLs.

Стандартный порядок поиска DLL для приложений «Windows Store»

  1. Граф зависимостей пакета для процесса. Местом поиска является пакет приложения плюс любые зависимости, отмеченные как <PackageDependency> в разделе <Dependencies> манифеста пакета приложения. Зависимости ищутся системой в том порядке, в котором они появляются в манифесте;
  2. Каталог, из которого был загружен вызывающий DLL процесс;
  3. Системный каталог ( %SystemRoot%\system32 ).

Альтернативный порядок поиска DLL для приложений «Windows Store»

  1. Граф зависимостей пакета для процесса. Местом поиска является пакет приложения плюс любые зависимости, отмеченные как <PackageDependency> в разделе <Dependencies> манифеста пакета приложения. Зависимости ищутся системой в том порядке, в котором они появляются в манифесте;
  2. Каталог, из которого указанный [в параметре функции LoadLibraryEx] модуль был загружен;
  3. Системный каталог ( %SystemRoot%\system32 ).

Приложения настольного компьютера [desktop applications] могут указывать место, из которого будет загружена DLL, посредством указания полного пути к DLL, могут использовать перенаправление поиска DLL, либо могут использовать манифест. Если ни один из этих методов не используется, система ищет DLL во время загрузки программы так, как описано в этом разделе.

  • если DLL с таким же именем модуля уже загружена в память, система будет использовать загруженную DLL, при этом не будет иметь значения, в каком каталоге эта загруженная DLL находится. Система не станет выполнять других действий по поиску DLL;
  • если DLL есть в списке библиотек DLL, известных той версии операционной системы Windows, в которой запущено приложение, система использует свою копию известной DLL (и свои копии библиотек DLL, от которых эта известная DLL зависит, если таковые имеются) вместо того, чтобы искать эту DLL. Увидеть список известных текущей системе DLL можно, обратившись к следующему ключу реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\KnownDLLs.

Важное замечание. Если злоумышленник получит доступ к одному из каталогов, в которых выполняется поиск DLL, он может поместить в этот каталог вредоносную копию искомой DLL. Чтобы узнать способы предотвращения таких атак, читайте статью «Безопасность DLL».


Стандартный порядок поиска DLL для приложений настольного компьютера

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

Безопасный режим поиска DLL по умолчанию включен. Чтобы его выключить, следует создать в реестре параметр HKEY_LOCAL_MACHINE\System\CurrentControl Set\Control\Session Manager\SafeDllSearchMode и установить его значение в 0 (ноль). Вызов функции SetDllDirectory при ее успешном завершении отключает параметр реестра SafeDllSearchMode, в то время как указанный [в параметре функции SetDllDirectory] каталог находится в поисковом списке каталогов и изменяет порядок поиска так, как описано [далее] в этой статье.

Замечание для пользователей операционной системы Windows XP (вики: с 24.08.2001 г.; поддержка этой системы прекращена корпорацией «Microsoft» c 08.04.2014 г.): безопасный режим поиска DLL по умолчанию выключен. Чтобы включить его, следует создать параметр реестра SafeDllSearchMode и установить его значение в 1. Безопасный режим поиска DLL включен по умолчанию, начиная с «Windows XP» с установленным пакетом обновления SP2.

  1. Каталог, из которого загружено приложение;
  2. Системный каталог [обычно это каталог ..\Windows\System32\ , но не всегда] . Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу;
  3. Системный каталог для 16-разрядных библиотек DLL [обычно это каталог ..\Windows\System\ , но не всегда] . Не существует функции [из набора Windows API] , которая получала бы путь к этому каталогу, но поиск в этом каталоге всё равно выполняется;
  4. Каталог операционной системы Windows [обычно это каталог ..\Windows\ , но не всегда] . Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу;
  5. Текущий каталог;
  6. Каталоги, перечисленные в переменной среды PATH. Заметим, что эта переменная не включает путь, определенный в разрезе каждого приложения ключом реестра App Paths [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W indows\CurrentVersion\App Paths] . Ключ реестра App Paths не используется при поиске DLL.
  1. Каталог, из которого загружено приложение;
  2. Текущий каталог;
  3. Системный каталог [обычно это каталог ..\Windows\System32\ , но не всегда] . Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу;
  4. Системный каталог для 16-разрядных библиотек DLL [обычно это каталог ..\Windows\System\ , но не всегда] . Не существует функции [из набора Windows API] , которая получала бы путь к этому каталогу, но поиск в этом каталоге всё равно выполняется;
  5. Каталог операционной системы Windows [обычно это каталог ..\Windows\ , но не всегда] . Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу;
  6. Каталоги, перечисленные в переменной среды PATH. Заметим, что эта переменная не включает путь, определенный в разрезе каждого приложения ключом реестра App Paths [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W indows\CurrentVersion\App Paths] . Ключ реестра App Paths не используется при поиске DLL.

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

Замечание: стандартный порядок поиска DLL для процесса попадет под влияние вызова функции SetDllDirectory в родительском процессе, если этот вызов был выполнен до запуска текущего процесса.

Замечание для пользователей операционной системы Windows XP (вики: с 24.08.2001 г.; поддержка этой системы прекращена корпорацией «Microsoft» c 08.04.2014 г.): изменение стандартного порядка поиска DLL с помощью вызова функции SetDllDirectory не поддерживалось до «Windows XP» с установленным пакетом обновления SP1.

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

Функция LoadLibraryEx поддерживает альтернативный порядок поиска DLL, если она вызывается с флагом LOAD_WITH_ALTERED_SEARCH_PATH и в ее параметре lpFileName указан абсолютный путь.

Заметим, что стратегия стандартного порядка поиска DLL и стратегия альтернативного порядка поиска DLL, установленная функцией LoadLibraryEx с флагом LOAD_WITH_ALTERED_SEARCH_PATH, различаются только в одном: стандартный порядок поиска DLL начинается с каталога вызывающего приложения, а альтернативный порядок поиска DLL начинается с каталога исполняемого модуля, загружаемого функцией LoadLibraryEx.

  1. Каталог, определенный параметром lpFileName функции LoadLibraryEx;
  2. Системный каталог [обычно это каталог ..\Windows\System32\ , но не всегда] . Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу;
  3. Системный каталог для 16-разрядных библиотек DLL [обычно это каталог ..\Windows\System\ , но не всегда] . Не существует функции [из набора Windows API] , которая получала бы путь к этому каталогу, но поиск в этом каталоге всё равно выполняется;
  4. Каталог операционной системы Windows [обычно это каталог ..\Windows\ , но не всегда] . Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу;
  5. Текущий каталог;
  6. Каталоги, перечисленные в переменной среды PATH. Заметим, что эта переменная не включает путь, определенный в разрезе каждого приложения ключом реестра App Paths [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W indows\CurrentVersion\App Paths] . Ключ реестра App Paths не используется при поиске DLL.
  1. Каталог, определенный параметром lpFileName функции LoadLibraryEx;
  2. Текущий каталог;
  3. Системный каталог [обычно это каталог ..\Windows\System32\ , но не всегда] . Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу;
  4. Системный каталог для 16-разрядных библиотек DLL [обычно это каталог ..\Windows\System\ , но не всегда] . Не существует функции [из набора Windows API] , которая получала бы путь к этому каталогу, но поиск в этом каталоге всё равно выполняется;
  5. Каталог операционной системы Windows [обычно это каталог ..\Windows\ , но не всегда] . Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу;
  6. Каталоги, перечисленные в переменной среды PATH. Заметим, что эта переменная не включает путь, определенный в разрезе каждого приложения ключом реестра App Paths [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W indows\CurrentVersion\App Paths] . Ключ реестра App Paths не используется при поиске DLL.
  1. Каталог, из которого загружено приложение;
  2. Каталог, указанный в параметре lpPathName функции SetDllDirectory;
  3. Системный каталог [обычно это каталог ..\Windows\System32\ , но не всегда] . Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу;
  4. Системный каталог для 16-разрядных библиотек DLL [обычно это каталог ..\Windows\System\ , но не всегда] . Не существует функции [из набора Windows API] , которая получала бы путь к этому каталогу, но поиск в этом каталоге всё равно выполняется;
  5. Каталог операционной системы Windows [обычно это каталог ..\Windows\ , но не всегда] . Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу;
  6. Каталоги, перечисленные в переменной среды PATH. Заметим, что эта переменная не включает путь, определенный в разрезе каждого приложения ключом реестра App Paths [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W indows\CurrentVersion\App Paths] . Ключ реестра App Paths не используется при поиске DLL.

Функция SetDllDirectory в случае своей успешной отработки выключает безопасный режим поиска DLL, а указанный в ее параметре каталог включается в поисковый список каталогов. Чтобы восстановить безопасный режим поиска DLL, основанный на параметре реестра SafeDllSearchMode, и вернуть текущий каталог в поисковый список каталогов, следует вызвать функцию SetDllDirectory с ее параметром lpPathName, установленным в значение NULL.

Порядок поиска DLL с использованием флагов LOAD_LIBRARY_SEARCH

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

Замечание для пользователей предыдущих по отношению к свежим на дату написания статьи версиям операционных систем Windows (Windows 7 (вики: с 22.10.2009 г.), Windows Server 2008 R2 (вики: с 22.10.2009 г.), Windows Vista (вики: с 30.11.2006 г.), Windows Server 2008 (вики: с 12.12.2008 г.)): флаги LOAD_LIBRARY_SEARCH доступны на этих системах, если установлено обновление KB2533623.

Замечание для пользователей операционных систем Windows Server 2003 (вики: с 24.04.2003 г.) и Windows XP (вики: с 24.08.2001 г.): флаги LOAD_LIBRARY_SEARCH в этих системах не поддерживаются.

Почитать про устройство PE-файла и про то, как он грузится в память.

В какой это ОС адрес каждый раз другой? Неужто ASLR работает? Для целей отладки можно временно ASLR отключить для программы, если он вообще отключается, но чтения теории это всё равно не отменяет.

Ну вот ты какой то же прогой находишь адрес, сделай себе такую же, она же наверно показывает таблицу импорта. Найдите ImageBase этой DLL, это и есть адрес загрузки DLL(читайте PE Header уже загруженной библиотеки). Загрузчик Windows грузит DLL по другому адресу если указанный ImageBase уже занят, добавляете свои статические байты и попадаете куда нужно. Но вообще очень сомневаюсь, что смещение статическое.
Вы точно-точно уверены, что там не указатель? Ну вот ты какой то же прогой находишь адрес, сделай себе такую же, она же наверно показывает таблицу импорта.

Спасибо за идею проблему решил этой функцией
Функция GetModuleFileNameEx
Синтаксис на С++

DWORD WINAPI GetModuleFileNameEx (
_In_ HANDLE hProcess,
_In_opt_ HMODULE HMODULE,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);

Ручка с процессом, который содержит модуль.
Ручка должна иметь PROCESS_QUERY_INFORMATION и PROCESS_VM_READ права доступа. Для получения дополнительной информации см процесса обеспечения безопасности и права доступа .
GetModuleFileNameEx функция не возвращает путь для модулей, которые были загружены с помощью LOAD_LIBRARY_AS_DATAFILE флаг. Для получения дополнительной информации см LoadLibraryEx .
HMODULE [в, по выбору]
Ручка к модулю. Если этот параметр NULL, GetModuleFileNameEx возвращает путь к исполняемому файлу процесса, указанного в hProcess .
Указатель на буфер, который получает полный путь к модулю. Если размер имени файла больше, чем значение nSize параметра, функция завершается успешно, но имя файла усекается и нулем.

Размер lpFilename буфера, в символах.
т.к ее используют для получения списка модулей процесса.Как в той программе через которую я находил базовые адреса.

Почитать про устройство PE-файла и про то, как он грузится в память.

В какой это ОС адрес каждый раз другой? Неужто ASLR работает? Для целей отладки можно временно ASLR отключить для программы, если он вообще отключается, но чтения теории это всё равно не отменяет.

Так же почитал про ''Portable Executable'' узнал много нового

Найдите ImageBase этой DLL, это и есть адрес загрузки DLL(читайте PE Header уже загруженной библиотеки). Загрузчик Windows грузит DLL по другому адресу если указанный ImageBase уже занят, добавляете свои статические байты и попадаете куда нужно. Но вообще очень сомневаюсь, что смещение статическое.
Вы точно-точно уверены, что там не указатель?

Да ,к счастью смешение не меняется при перезапуске игры)

Вот рабочий код


номер элемента массива, это номер уровня dll

Осталась сделать кое-что доделать что бы переменные не занимали много памяти и все
Всем спасибо, вопрос решен )

Приветствую программистов.
Вопрос в следующем
как найти базовый адрес dll игры.
Заранее спасибо за ответ.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Как получить базовый адрес процесса?
Доброе время суток, необходимо прочитать из памяти данные в виде строки, Нашел 2 класса, 1й умеет.

Как получить базовый адрес процесса?
Как можно получить базовый адрес процесса ?Никаких работающих примеров так и не нашел. Вот мой код .

Как получить базовый адрес процесса?
Как получить базовый адрес процесса?


Присвоить указателю адрес 6-го элемента массива, напечатать его значение, используя текущий базовый адрес сегмента
Заполнить массив А(10) случайными значениями. Организовать вывод на экран. Присвоить указателю.

какой DLL? какой игры? о чём вообще речь? перефразируй вопрос: что конкретно нужно, для чего, и что уже имеется. какой DLL? какой игры? о чём вообще речь? перефразируй вопрос: что конкретно нужно, для чего, и что уже имеется.

игра Айон
речь идет о том какими командами вычислить базовый адрес dll игры.
в автоитие это реализовано следующим кодом

Свойства проэкта -> построение -> дополнительно
и там поле "Базовый адрес ДДЛ" - 0x400000
Вообще базовый адрес любой ДЛЛки (насколько я понимаю) - 0x400000


Как получить указатель или прочитать значение, зная базовый адрес и оффсеты?
Сижу долго и нудно в гугле и не могу найти. Как в делфи, зная базовый адресс и оффсеты получить.

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

Базовый адрес потока
Добрый день! Подскажите есть ли возможность получить базовый адрес потока по thread ID. Необходимо.


Как подгрузить dll в определенный адрес?
ну как все мы знаем при инжекте dll она погружается в адресное пространство которое выделяется.

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