J'ai un dépotoir de mémoire (processus non géré). Comment puis-je extraire (en utilisant WINDBG) l'une des DLL chargées dans le processus? Je veux dire en réalité enregistrer le fichier dll dans le disque p>
3 Réponses :
Vous pouvez utiliser le répertoire sos.dll à l'intérieur de Windbg.
Premièrement, chargez-le à Windbg: P> puis utilisez! Sam ou! Sam ou! SaveAllModule à Extraire les modules sur l'emplacement de disque spécifique: P> !sam c:\notepad
Pour extraire une DLL sans utiliser SOS, utilisez l'extension .writemem comme suit: P>
Découvrez les adresses de démarrage et de fin du module en utilisant Calculez la longueur = Démarrage de la fin: Enregistrer la DLL comme suit: Ceci est peu susceptible de vous donner la DLL exacte car elle a été chargée à partir de disque, la fixation de ce haut est non triviale. P>
(partiellement basé sur Cet article ) P> lmvm dllname code>
Exemple de sortie pour iEFrame:
Démarrer le nom du module d'extrémité code>
61370000 61FB8000 IEFRAME CODE> P> LI>
? 61fb8000 - 61370000 Code>
Sortie: Evaluez l'expression: 12877823 = 00c48000 code> p> li>
.writemem c: \ tmp \ mydll.dll 61370000 l? 00c48000 code> p> li>
ol>
J'ai essayé ça mais ça n'a pas fonctionné. J'ai attaché WINDBG à CALC.EXE et a écrit l'EXE et a obtenu un fichier plus gros. Étrange.
Je suppose que cela est dû aux divergences dans l'alignement - Les fichiers PE32 prennent plus d'espace dans la mémoire que sur le disque en raison des besoins en alignement de la mémoire plus importants. Vous devez reconstruire correctement l'exécutable après que cela soit largué pour répondre à ces règles. En outre, la section de débogage n'est pas larguée (car elle n'est pas cartographiée, je suppose). Les tables d'importation ont également besoin de reconstruction.
Oui, c'est vrai. CALC.EXE extraire également ses informations d'interface de langue d'utilisateur multi-utilisateurs et la joindre à la mémoire, de même que de nombreux programmes Windows tels que MSPaint, photoviewer, etc. p>