1

У моего коллеги есть крутой лайфхак: вы связываете DLL-файлы с Dependency Walker, и теперь, когда вы пытаетесь "запустить" DLL-файл, он открывает Dependency Walker для анализа.

Проблема в том, что существует две версии Dependency Walker: одна 32-битная и другая 64-битная. И рекомендуется использовать версию той же разрядности для .dll:

Да. Dependency Walker будет работать с любым 32-битным или 64-битным модулем Windows. Существуют 32-битные и 64-битные версии Dependency Walker. Все версии способны или открывать 32-битные и 64-битные модули. Однако использование 32-разрядного Dependency Walker для обработки 32-разрядных модулей имеет большие преимущества и 64-разрядное Dependency Walker для обработки 64-разрядных модулей. Это особенно верно при работе в 64-разрядной версии Windows, которая позволяет выполнять как 32-разрядные, так и 64-разрядные программы. 32-битная подсистема в 64-битной Windows (известная как "WOW64") имеет собственный частный реестр, "AppPaths", "KnownDlls", системные папки и обработку манифеста. Только 32-разрядная версия Dependency Walker может получить доступ к этой 32-разрядной среде, которая необходима для точной обработки 32-разрядного модуля. Аналогично, только 64-разрядная версия Dependency Walker может полностью получить доступ к 64-разрядной среде, поэтому ее всегда следует использовать для обработки 64-разрядных модулей.

Есть ли способ связать 32-разрядные библиотеки DLL с 32-разрядной версией Dependency Walker и 64-разрядные библиотеки DLL с 64-разрядной версией Dependency Walker? Мне особенно интересен ответ для Windows 7 или 10.

1 ответ1

0

Для этой цели создан инструмент на основе Python: https://github.com/mmatrosov/DllDispatcher

Инструмент довольно прост. Как упомянуто в соответствующем файле readme, вы связываете .dll с файлом DllDispatcher.bat , который вызывает файл DllDispatcher.py , который анализирует содержимое .dll и определяет, является ли предоставленная dll 32-битной или 64-битной. На основании этого он затем вызывает одно из двух предоставленных приложений. Пути к приложениям просто жестко запрограммированы в начале файла DllDispatcher.py .

Я не нашел простой способ определить, является ли DLL 32-битной или 64-битной. GetBinaryType работает только для файлов .exe. Для dll нужно либо загрузить библиотеку, а затем передать дескриптор в IsWow64Process() , либо вручную проанализировать заголовок dll (он имеет формат PE-файла). Я выбрал последнее. Это менее надежно, но более быстро. Я думаю, что надежность не является большой проблемой, поскольку вряд ли формат PE изменится в ближайшем будущем, и это решение не должно быть полностью пуленепробиваемым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .