Pregunta

Me acabo de meter en la programación de bajo nivel (leer / escribir en la memoria ese tipo de cosas) y me he encontrado con un problema para el que no puedo encontrar una respuesta.

La información que quiero leer tiene una dirección que es relativa a una DLL cargada en la memoria e, g, está en mydll.dll + 0x01234567. El problema que tengo es que el dll se mueve en la memoria pero el desplazamiento permanece igual. ¿Hay alguna forma de averiguar la ubicación de este dll en la memoria?

Actualmente estoy tratando de hacer esto preferiblemente en C # pero agradecería ayuda en la mayoría de los lenguajes de alto nivel.

¿Fue útil?

Solución

probé el método que sugirió Rob Walker y no pude hacerlo funcionar (creo que no funcionó porque el dll se cargó como parte de otro ejecutable, por lo que no se pudo encontrar tan fácilmente).

Sin embargo, descubrí una solución que funcionó para mí, así que aquí está:

creé un objeto de tipo Proceso

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;
                }
        }

ahora tiene el módulo que puede hacer dllbaseAdressIWant.BaseAddress para obtener el valor.

Espero que esto ayude

Otros consejos

Desde la perspectiva de Win32, debe usar el GetModuleHandle y funciones GetModuleInformation . Estos le permiten buscar el identificador del módulo por nombre y luego recuperar información, incluida la dirección base sobre ese identificador.

Debería ser sencillo envolver estas API utilizando los envoltorios P ??/ Invoke estándar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top