Вопрос

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

Часть информации, которую я хочу прочитать, имеет адрес, относящийся к 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top