L'approche la plus simple a été de simplement déplacer la DLL d'origine, et de créer une nouvelle DLL que vous faites vous-même, avec les mêmes exportations. Cette DLL serait LoadLibrary l'ancienne DLL à partir de l'emplacement alternatif. Cela ne s'applique pas ici: la DLL exporte des membres de classe C++, ce qui a deux conséquences: les classes C++ doivent être chargées statiquement car il n'y a pas de mécanisme C++ pour "coller" les pointeurs de fonction C++ (obtenus via GetProcAddress) dans une instance de classe. Cela signifie que votre dll de shim serait dans l'endroit malheureux d'avoir à importer et à exporter, et l'ensemble identique de symboles.
La seule façon de contourner cela est d'écrire votre dll cale en deux parties:
Shim1:
Une partie obtiendrait le nom de la dll d'origine, et exporterait la même classe défintion la dll originale exportés:
class __decldpec(dllexport) CCPCompressor {
...
Depends peut se fissurer la décoration de nom, ou Undname.exe est distribué avec Visual studio.
Cette partie serait LoadLibrary() en utilisant un chemin explicite vers shimdll2.dll situé dans un autre dossier, avec la DLL d'origine. GetProcAddress() serait nécessaire pour importer les fonctions exportées par shimdll2.dll
Shim2:
L'autre dll shim serait situé dans un dossier avec le dll que vous essayez d'intercepter. Cette dll devrait importer la classe de la dll compresseur d'origine:
class __declspec(dllimport) CCPCompressor {
...
Vous pouvez utiliser la bibliothèque d'importation dll faite par le premier dll pour relier réellement les symboles. Ensuite, c'est un cas d'exportation des fonctions de shim2.dll que shim1.dll appellera à chaque fois qu'une méthode CCPCompressor est appelée.
NB. Autres choses: votre version de la classe CCPCompressor aura besoin, au moins, d'un grand tableau fictif, car vous ne pouvez pas savoir depuis les exportations de la DLL la taille de l'application attendue par la classe (sauf si vous avez un vrai fichier d'en-tête) décrivant la classe).
Pour décomposer les noms exportés pour construire une définition de classe: Ouvrez l'invite de commande Visual Studio 20XX de Démarrer> Programmes> Visual Studio 20XX -> menu Outils.
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>_
Est-ce que pour chaque fonction exportée de la dll d'origine (undname accepte une sorte de fichier texte pour accélérer ce processus) pour savoir comment déclarer une définition de classe correspondant.
duplication possible de [Comment intercepter les appels de méthode dll?] (Http: // stackoverflow.com/questions/220515/comment-intercepter-dll-method-calls) –
En regardant vos exportations DLL a soulevé un drapeau rouge sérieux - vous exportez le nom décoré C++ de votre DLL. Cela signifie que votre DLL n'interagira pas entre différents compilateurs C++ (ils ont tous leurs propres algorithmes de décoration de nom) et même entre différentes versions du compilateur C++ (les algorithmes de décoration de nom changent de version en version). –
Je crois que cette technique est utilisée par l'un des outils Sysinternaux, que ce soit ou que j'ai vu un article sur ce genre d'injection par un des sysinternels. Je ne me souviens pas. Quoi qu'il en soit, codage heureux. –