Bonjour,
Dans le cadre du debug d'une application particulièrement lourde et longue à charger, je souhaiterais pouvoir remplacer en "live" une DLL déjà chargée par l'appli par une autre DLL, histoire de voir le nouveau comportement sans avoir à killer l'ensemble.
J'ai déjà une partie de l'appli qui fonctionne ainsi, car l'appli fonctionne un peu sous forme de "plugin" et charge dynamiquement certaine DLL : j'ai donc modifié la partie load de DLL qui était du genre "assembly.LoadFile" par un bout de code qui d'abord charge en mémoire la DLL dans un tableau de byte puis je fais charger cette DLL virtuelle via "assembly.Load(bytes() raw)". De cette manière la vraie DLL n'est jamais lockée et je peux la remplacer autant que je veux, l'application change de comportement au runtime à chaque appel des fonctions c'est parfait.
MAIS le problème qu'il me reste, c'est quand l'appli charge elle-même une DLL, genre un plugin qui hérite d'un autre et bien le plugin source, celui qui est hérité, est chargé par le framework et l'assembly sur le disque est bien lockée, normal... mais j'aimerais faire la même chose qu'expliqué au dessus... pour faire des tests en live au runtime, ce serait génial !
J'ai peu d'espoir, mais je sais qu'il est possible d'injecter du code, de modifier l'IAT (Import Address Table) d'une assembly, peut-être même de déplacer le curseur qui va à l'entry point d'une DLL chargée en mémoire pour le déplacer sur l'entry point d'une autre ? A ce moment il "suffirait" de charger mes DLL dynamique comme je l'ai expliqué plus haut et de mettre le curseur de la vraie DLL dessus (sur son entry point).
Enfin bref, je n'y connais pas grand chose, sinon je ne viendrais pas demander, mais je pense qu'il y a de sérieuse piste, mais je ne sais pas par où commencer. J'ai trouver beaucoup de sujet sur codeproject concernant l'injection, le hook d'iat etc mais pour le moment je surnage.
Un peu d'aide pour ce projet intéressant serait la bienvenue.
Merci
Message édité par An0nymer le 28-08-2008 à 18:39:08