Найти адрес DLL в памяти - PullRequest
3 голосов
/ 06 ноября 2008

Я только что начал заниматься программированием низкого уровня (чтение / запись в память такого рода вещей) и столкнулся с проблемой, на которую я не могу найти ответ.

Часть информации, с которой я хочу прочитать, имеет адрес, относящийся к DLL, загруженной в память e, g, он находится по адресу mydll.dll + 0x01234567. проблема, которую я имею, состоит в том, что dll перемещается в памяти, но смещение остается тем же самым. Есть ли в любом случае, чтобы узнать местоположение этой dll в памяти.

В настоящее время я пытаюсь сделать это предпочтительно на c #, но я был бы признателен за помощь в большинстве языков высокого уровня.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2008

Я попробовал метод, предложенный Робом Уокером, и не смог заставить его работать (я думаю, что он не работал, потому что dll был загружен как часть другого исполняемого файла, поэтому его нельзя было найти так легко).

Однако я нашел решение, которое сработало для меня, поэтому вот оно:

я создал объект типа 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;
                }
        }

теперь у вас есть модуль, который вы можете просто сделать dllbaseAdressIWant.BaseAddress, чтобы получить значение.

Надеюсь, это поможет

1 голос
/ 06 ноября 2008

С точки зрения Win32 вам необходимо использовать функции GetModuleHandle и GetModuleInformation . Они позволяют вам искать дескриптор модуля по имени, а затем получать информацию, включая базовый адрес этого дескриптора.

Должно быть просто обернуть эти API с помощью стандартных оболочек P / Invoke.

...