2010-10-25 4 views
3

Y at-il une application qui me permet de voir ce qui est envoyé à une DLL à partir d'un processus?Surveillance de la DLL

J'ai un processus et j'ai une DLL et je voudrais surveiller les paramètres qui sont envoyés aux fonctions afin que je puisse utiliser la DLL moi-même.

L'EXPORTATION de la DLL est.

?? 0CCPCompressor @@ @ XZ
AAE ?? 0CCPExpandor @@ @ XZ
AAE ?? 1CCPCompressor @@ @ XZ
AAE ?? 1CCPExpandor @@ @ XZ
AAE ? Effacer @ CCPCompressor @@ QAEHXZ
? Effacer @ CCPExpandor @@ QAEHXZ
..Compress @ CCPCompressor ..
..Delete @ CCPCompressor ..
..Delete @ CCPExpandor ..
..Expand @ CCPExpandor .. ..
Gratuit @ CCPCompress ou ..
..Free @ CCPExpandor ..
..Init @ CCPCompressor ..
..Init @ CCPExpandor ..
..New @ CCPCompressor ..
..New @ CCPExpandor ..

+3

duplication possible de [Comment intercepter les appels de méthode dll?] (Http: // stackoverflow.com/questions/220515/comment-intercepter-dll-method-calls) –

+0

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). –

+0

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. –

Répondre

0

En général, c'est une mauvaise idée. Même si vous avez un ensemble de paramètres capturés, sans analyse approfondie du code DLL, vous ne savez pas quoi faire avec ces paramètres et quelles plages de paramètres sont acceptées par certaines méthodes. Exemple: si j'appelle une méthode DoMathOperation (Add, 1, 2), vous pouvez imiter cet appel, mais vous ne pourrez pas faire DoMathOperation (Multiply, 2, 2) car vous ne savez pas que c'est possible.

0

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.

+0

Comment trouver la même définition de classe que la DLL d'origine exportée? –

+0

Si vous ne l'avez pas, alors vous devez l'inventer: utilisez depends.exe pour mapper chaque prototype de fonction, et ajoutez-les tous à votre propre déclaration de classe. –

+0

J'ai rassemblé les éléments suivants, mais le :: New Je ne suis pas sûr. classe __decldpec (dllexport) CCPCompressor
{
privé:
CCPCompressor (void);
~ CCPCompressor (vide);
public:
int Effacer (vide);
unsigned short Compress (non signé char * const, non signé court, non signé char * const, non signé court, int);
void Supprimer (vide);
vide Libre (vide);
int Init (vide);
}
Classe statique CCPCompressor * __cdecl CCPCompressor :: New (void);

Avez-vous de très bonnes URL qui valent la peine d'être lues par rapport à cela? –

0

L'utilisation de detours est-elle compatible avec vos exigences?

Sur le site:

Aperçu

charnières recherche sur les systèmes innovants sur la capacité de l'instrument et facilement étendre le système d'exploitation existant et la fonctionnalité de l'application. Avec l'accès au code source approprié, il est souvent trivial d'insérer de nouvelles instrumentations ou extensions en reconstruisant le système d'exploitation ou l'application. Cependant, dans le monde d'aujourd'hui, les chercheurs en systèmes ont rarement accès à tout le code source pertinent. Detours est une bibliothèque permettant d'instrumentaliser des fonctions Win32 arbitraires sur des ordinateurs x86, x64 et IA64. Detours intercepte les fonctions Win32 en réécrivant le code en mémoire pour les fonctions cibles. Le paquet Detours contient également des utilitaires pour attacher des DLL arbitraires et des segments de données (appelés charges utiles) à n'importe quel binaire Win32. Les détours préservent la fonction cible non instrumentée (pouvant être appelée via un trampoline) en tant que sous-programme à utiliser par l'instrumentation. Notre conception de trampoline permet une large gamme d'extensions innovantes de logiciels binaires existants.

Nous avons utilisé Detours pour créer un système de partitionnement distribué automatique, pour instrumenter et analyser la pile de protocoles DCOM, et pour créer une couche thunking pour une API de système d'exploitation basée sur COM. Detours est largement utilisé au sein de Microsoft et dans l'industrie.

+0

Je pourrais essayer mais de l'autre poste fait sembler que je ne pourrais pas l'employer pour surveiller des DLL avec des classes. Si vous pouvez me dire que je peux, je vais essayer. Merci. –

+0

Aucune interface binaire d'application n'est définie pour les pointeurs de méthode de classe C++. Le résultat est que les pointeurs de méthode ne peuvent pas être marshalés via void * car ils peuvent varier considérablement en taille. Detours a besoin de l'adresse d'une fonction avec une convention d'appel correspondante à la fonction en cours d'accrochage et je ne vois pas comment la fournir. –

+0

Eh bien, les classes sont juste une collection de méthodes, de votre point de vue - si vous capturez des méthodes et consignez leurs appels avec des paramètres, vous gagnerez quelque chose. –

0

Le seul moyen fiable est de déboguer votre programme (en utilisant un débogueur comme OllyDBG) et de définir le point d'arrêt sur la fonction d'exportation requise. Ensuite, vous pouvez simplement suivre les paramètres de la pile envoyés à la fonction appelante. Ce n'est que le début, vous devez analyser complètement les instructions de fonction dans un débogueur ou un désassembleur pour voir ce que fait chaque paramètre et son type.