4 Réponses :
Vous devez injecter à partir d'une DLL avec une bitnse correspondante - c'est-à-dire "" Toute processeur "devient 32 ou 64 bits au moment de l'exécution ... et votre DLL doit correspondre à l'ajustement de l'exécution! P>
Quelque chose d'utile dans votre situation est appelé "assemblage côte à côte" (deux versions du même assemblage, une 32 et l'autre 64 bits) ... Je pense que vous trouverez ces informations utiles: p>
Ici, vous pouvez trouver une belle promenade qui contient beaucoup d'informations utiles - il décrit . NET DLL Emballage C ++ / CLI DLL Référencer une DLL natale P>
Pour accrocher vraiment facile et robuste, voir Cette bibliothèque bien testée < / a> - entre autres choses, il fonctionne avec AnyCPU! P>
Une autre offre pour EasyHook de moi. Ayant fait des détours en C / C ++, EasyHook facilite la tâche.
Je suppose que votre problème principal est que vous essayez d'injecter un assemblage .NET au processus natif et que cela ne fonctionnera sûrement pas. Je ne suis même pas sûr que Setwindowshookex prend en charge l'injection d'assemblage .NET dans le processus CLR. La solution à votre problème est la suivante: p>
ou vous pouvez utiliser une meilleure bibliothèque d'injection / raccordement telle que Madcodehook ou Détours. De cette façon, vous surmonterez le problème n ° 3, de ne pas mentionner des dizaines de pros qu'ils fournissent. P>
Le code à partir de laquelle j'appelle SetwindowshookeX et que la DLL injectée est intégrée à l'aide de C ++ (X86 et X64). Et la demande sur laquelle je suis accrochant est une application .NET construite contre n'importe quel processeur. Et la machine que j'utilise est 64 bits.
Juste de votre description du problème, je suppose que c'est ... Votre programme CPU compilé est chargé d'un talon X86 qui tire votre crochet 32 bits, puis le stub x86 vérifie et voit que l'environnement dispose d'un support de 64 bits et lance la version CLR de 64 bits. p>
Dans ce scénario, votre dll de crochet 32 bits est d'obtenir le message WH_SHELL et tente d'injecter dans un processus (le talon X86) qui est déjà terminé ou à l'injection du crochet 32 bits dans le processus CLR de 64 bits. Ainsi, votre "très ambigu et doit être élaboré sur" Crash System. P>
Si vous souhaitez élaborer ce que votre code fait réellement, plus d'aide (et moins de généralisations et d'utiliser simplement un programme A ») sera donné. Êtes-vous en train d'injecter du code dans le processus ou appelez-vous à SetwindowshookeX avec le DWthreadId du processus? p>
Je ne fais pas d'injection de code, j'appelle SetwindowhookeX globalement. Le système d'exploitation est suspendu uniquement lorsque je clique sur l'application Helloworld .NET Construite contre tout CPU. Vérifiez la question que j'ai mise à jour.
@SRI - Merci d'avoir clarifié. Vous devriez avoir votre message EXES Hooklogger à tous les messages qu'ils reçoivent dans un fichier journal (fichier journal séparé pour 32 bits et 64 bits bien sûr). Ensuite, lorsque vous récupérez du gel du système, vous pouvez voir ce qui s'est passé juste avant. Assurez-vous qu'ils ouvrent / ajoute / fermez le fichier journal de chaque message. Je suppose que l'ensemble de la CPU déclenche votre X86 Hooklogger et votre Hooklogger X64.
sur un ordinateur 32 bits, il devrait être assez évident était l'anglo-utile une application de la CPU prend. P>
Un ordinateur 64 bits obtient deux installations distinctes de la framework .NET: une pour chaque bit. Une application .NET compilée comme avec n'importe quel processeur car la cible fonctionne normalement sur l'installation 64 bits, mais elle peut également être exécutée sur l'installation 32 bits si référencée par une autre application qui cible directement X86. Ainsi, vous ne pouvez être sûr que ce que vous obtenez si vous savez comment la demande est exécutée: comme un processus indépendant ou par référence. P>
Je ne ferais aucune hypothèse. Ne supposez pas que le processus est 64 bits sur un ordinateur 64 bits: il peut potentiellement être 32 bits. Vérifiez-le correctement pour voir quel mode il exécute. Ensuite, injectez de 32 bits ou 64 bits en conséquence. P>
La raison pour laquelle vous devez utiliser la même bitness que le processus cible est que, pour des raisons techniques dans lesquelles je ne l'auront pas, de tels crochets ne peuvent pas traverser ce qu'on appelle la barrière de Syswow. SYSWOW est ce qui permet aux applications 32 bits d'exécuter sur un ordinateur 64 bits, des applications 16 bits à exécuter sur un ordinateur 32 bits, etc. Vous "traversez la barrière" lorsque vous communiquez entre les applications fonctionnant de différents côtés de Syswow - Est-ce que l'on est exécuté au sein de SysWow (32 bits) et l'autre n'est pas (64 bits). Mettez simplement, un processus doit être entièrement dans ou hors de SYSWOW. Ainsi, vous ne pouvez pas ajouter de code 32 bits à un processus 64 bits et inversement. P>
Est-ce que cela fonctionne correctement lorsqu'il est construit pour 32/64 ou un crash là aussi?
@pst: sa fonctionne correctement lorsqu'elle est construite pour 32/64. C'est une application Hello World WPF.
On dirait que cela pourrait être associé: Stackoverflow.com/questions/1507268/...
Vous avez laissé de côté les "DLL 32 bits et 64 bits DOIRE DOIT avoir des noms différents". bit. Si la DLL est construite comme n'importe quel processeur, cela peut ne pas comporter .NET - le temps d'exécution peut charger le même binaire, quelle que soit l'architecture de la cible de processus hôte - mais peut-être que l'implémentation d'accrochage à l'intérieur de Windows dépend des noms de fichiers différents. Il suffit donc de faire deux copies de la DLL ciblée par le processeur et d'essayer de charger le "32 bits" à partir d'un processus 32 bits et le "64 bits" d'un processus 64 bits.
@cynic: j'ai des dlls avec des noms différents. Et les DLL sont construites en C ++ contre X86 et X64 (je ne peux pas construire contre aucun CPU en utilisant c ++)