Question

Je viens d'entrer dans la programmation de bas niveau (lire / écrire en mémoire ce genre de chose) et j'ai rencontré un problème auquel je ne trouve pas de réponse.

L’information que je veux lire a une adresse qui est relative à une DLL chargée dans la mémoire, c’est à mydll.dll + 0x01234567. Le problème, c'est que la DLL se déplace en mémoire, mais le décalage reste le même. Est-il possible de trouver l'emplacement de cette dll en mémoire?

J'essaie actuellement de le faire de préférence en c #, mais je serais reconnaissant de l'aide dans les langues les plus avancées.

Était-ce utile?

La solution

J’ai essayé la méthode suggérée par Rob Walker et n’a pas réussi à la faire fonctionner (je pense que cela n’a pas fonctionné car la dll a été chargée dans un autre exécutable, de sorte qu’elle ne peut pas être trouvée aussi facilement).

J'ai cependant découvert une solution qui fonctionnait pour moi alors la voici:

J'ai créé un objet de type Process

String appToHookTo = "applicationthatloadedthedll";
Process[] foundProcesses = Process.GetProcessesByName(appToHookTo)
ProcessModuleCollection modules = foundProcesses[0].Modules;
ProcessModule dllBaseAdressIWant = null;
foreach (ProcessModule i in modules) {
if (i.ModuleName == "nameofdlliwantbaseadressof") {
                    dllBaseAdressIWant = i;
                }
        }

Maintenant que vous avez le module, vous pouvez simplement faire dllbaseAdressIWant.BaseAddress pour obtenir la valeur.

J'espère que cela vous aidera

Autres conseils

Du point de vue de Win32, vous devez utiliser le GetModuleHandle. et aux GetModuleInformation . Celles-ci vous permettent de rechercher le nom du module par nom, puis de récupérer des informations, y compris l'adresse de base relative à ce descripteur.

Il devrait être simple d’envelopper ces API en utilisant les wrappers P / Invoke standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top