Вопрос
Я только что начал заниматься программированием низкого уровня (чтение / запись в память такого рода вещей) и столкнулся с проблемой, на которую я не могу найти ответ.
Часть информации, которую я хочу прочитать, имеет адрес, относящийся к DLL, загруженной в память e, g, он находится по адресу mydll.dll + 0x01234567. проблема, которую я имею, состоит в том, что dll перемещается в памяти, но смещение остается тем же самым. Есть ли в любом случае, чтобы узнать расположение этой DLL в памяти.
В настоящее время я пытаюсь сделать это предпочтительно на c #, но я был бы признателен за помощь в большинстве языков высокого уровня.
Решение
Я попробовал метод, предложенный Робом Уокером, и не смог заставить его работать (я думаю, что он не работал, потому что 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, чтобы получить значение.
Надеюсь, это поможет
Другие советы
С точки зрения Win32 вам нужно использовать GetModuleHandle и GetModuleInformation . Они позволяют вам искать дескриптор модуля по имени, а затем получать информацию, включая базовый адрес этого дескриптора.
Должно быть легко обернуть эти API с помощью стандартных оболочек P / Invoke.