Visual C ++ - переопределение функции, импортированной из DLL? - PullRequest
2 голосов
/ 05 марта 2012

Я пытаюсь переопределить определенную функцию в kernel32.dll. Можно ли как-то переопределить эту функцию в статической библиотеке и заставить исполняемый файл использовать функцию в статической библиотеке? Я думаю, что другая связь может стать проблемой.

Можно было бы переопределить его с моей собственной пользовательской DLL. Однако проблема в том, что сама DLL должна быть связана с kernel32.dll, поэтому она игнорирует мое определение этой функции.

РЕДАКТИРОВАТЬ: я получил работать с моей собственной DLL. При его создании генерация временного кода ссылки должна быть отключена. А как насчет статической привязки переопределенной функции?

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Если я вас правильно понимаю, вам нужно пользовательское поведение для функции Windows API в kernel32.dll.Если это так, вам нужно подключиться к Windows API.Один из способов сделать это - использовать Detours .Сам не пробовал, но вот ссылка на статью CodeProject - http://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours.

2 голосов
/ 05 марта 2012

Да, это не большая проблема.Функции определены как __dllimport, но это не определяет , из которой DLL они импортированы.Компоновщик просто выбирает первую библиотеку импорта, которая их предоставляет.Следовательно,.просто передайте свою библиотеку первым.В MSVC вам необходимо отключить «включать стандартные библиотеки», так как они предшествуют пользовательским библиотекам.

0 голосов
/ 05 марта 2012

Если ваше приложение уже существует и не может быть изменено , тогда

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

Поскольку LoadLibrary предоставляется kernel32, и вы используете прокси-сервер kernel32, скорее всего, выПридется назвать ваш прокси dll kernel33.dll и исправить оригинальный exe и заставить его загружать kernel33 вместо kernel32.

Все дело в боли, и чтобы сделать это успешно, вы должны быть хотя бы знакомы с cli(интерфейс командной строки - cmd.exe на windows) и утилита dumpbin. Это устаревшее руководство может помочь вам начать работу.

В качестве альтернативы вы можете попытаться использовать инъекцию DLL или аналогичные методы.Есть также "Detours" библиотека, которую я не использовал (не знаю, зачем мне это беспокоить, если я могу создать dll-прокси).

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

Затем просто создайте собственную подпрограмму с любым именем, которое вы хотите (скажем, myLoadLibrary).Затем создайте заголовок, который использует #define для переопределения вашей рутины.Т.е. что-то вроде #define LoadLibrary myLoadLibrary.Включите этот заголовок в каждый файл, где вам нужно переопределить, и убедитесь, что он включен после <windows.h>.

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