Самый простой подход - просто перенести исходную dll и создать новую dll, которую вы делаете сами, с тем же экспортом. Эта dll будет LoadLibrary старой dll из альтернативного местоположения.
Это не совсем применимо здесь - dll экспортирует члены класса C++, который имеет два следствия: классы C++ должны быть статически загружены, так как нет механизма C++ для «склеивания» указателей функций C++ (полученных через GetProcAddress) в экземпляр класса.
Это означает, что dll вашей прокладки будет в неудачном месте, где вам нужно как импортировать, так и экспортировать и идентичный набор символов.
Единственный способ обойти это написать DLL прокладку из двух частей:
Shim1:
Одна часть будет получить имя исходного DLL, и будет экспортировать тот же класс Defintion оригинальный DLL экспортироваться:
class __decldpec(dllexport) CCPCompressor {
...
Depends может треснуть украшение имя или Undname.exe распространяется с Visual Studio.
Эта часть будет LoadLibrary(), используя явный путь к shimdll2.dll, расположенный в другой папке, вместе с исходной dll. GetProcAddress() потребуется для импорта функций, экспортируемых shimdll2.Dll
Shim2:
Другой длл прокладка будет находиться в папке с DLL, которую вы пытаетесь перехватить. Эта библиотека придется импортировать класс из исходного DLL компрессора:
class __declspec(dllimport) CCPCompressor {
...
Вы можете использовать библиотеку DLL импорта сделанные первой DLL на самом деле связать символы. Тогда его случай экспорта функций из shim2.dll, который shim1.dll будет вызывать всякий раз, когда вызывается метод CCPCompressor.
NB. Другие вещи: ваша версия класса CCPCompressor должна иметь, по крайней мере, большой массив фиктивных элементов, поскольку вы не можете знать, из DLL-экспорта, насколько большой ожидает приложение класс (если у вас нет фактического файла заголовка описывающий класс).
Для разложения экспортируемые имена, чтобы построить определение класса: Откройте строку Visual Студия 20XX команду из меню Пуск> Программы> Visual Studio 20xx - меню> Инструменты.
c:\...\VC>undname [email protected]@@QAEHXZ
Microsoft (R) C++ Name Undecorator
Undecoration of :- "[email protected]@@QAEHXZ"
is :- "public: int __thiscall CCPCompressor:Clear(void)"
c:\...\VC>_
ли, что для каждой функции, экспортируемой из исходной библиотеки DLL (undname принимает какое-то текстовый файл, чтобы ускорить этот процесс), чтобы узнать, как объявить соответствующий класс размораживание.
Возможный дубликат [Как перехватить вызовы методов DLL?] (Http: // stackoverflow.com/questions/220515/how-to-intercept-dll-method-calls) –
Глядя на ваш DLL-экспорт, вы подняли серьезный красный флаг - вы экспортируете C++-украшенное имя из своей DLL. Это означает, что ваша DLL не будет взаимодействовать между различными компиляторами C++ (все они имеют свои собственные алгоритмы декодирования имен) и даже между различными версиями компилятора C++ (алгоритмы декодирования имен изменяются с версии на версию). –
Я считаю, что эта техника используется одним из инструментов Sysinternal, либо это, либо я видел статью об этом типе инъекции одним из людей Sysinternal. Не помню. Во всяком случае, счастливая кодировка. – 2010-10-26 01:45:27