Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Proteger memoria en la cual se cargó una DLL! (https://www.clubdelphi.com/foros/showthread.php?t=28663)

fer21unmsm 27-12-2005 23:46:15

Proteger memoria en la cual se cargó una DLL!
 
Hola a todos los miembros de este foro, mi pregunta es la siguiente:

Al cargar una librería con LoadLibrary y todo lo demás, como le puedo hacer para proteger esa parte de la memoria en la cual está cargada la librería "X", quisiera saber como podría proteger esa parte para que algún programa externo y ajeno a mi applicación no la pueda sobreescribir.

Uso Delphi 7.0 sobre WindowsXP.

Gracias de antemano.

Saludos.

jachguate 28-12-2005 02:26:31

Windows ya hace esto por vos.

Si otro proceso intenta sobreescribir la memoria, obtendrá un Access Violation. Otra cosa es que el otro proceso cargue la dll, pues compartirá el acceso a esta (y su memoria), de manera que si no está bien programada, podría incurrir en un desbordamiento de memoria. Pero ya esto es cosa de quien ha programado la biblioteca.

Hasta luego.

;)

fer21unmsm 28-12-2005 16:12:37

Hola jachguate, antes que nada gracias por responder a mi pregunta, es correcto lo que dices, cuando por ejemplo otra aplicación trata de sobreescribir esa parte de la memoria donde esta cargada la DLL, manda un mensaje de Access Violation.....!, pero el problema es ese quisiera saber como puedo evitar que eso pase, es decir impedir que salga ese mensaje o impedir que la otra aplicación haga eso.

Porque se puede dar el caso de que otra aplicación trate de sobreescribir dicha parte de la memoria y salga el tal mensajito pero no creo que al usuario le vaya a gustar.

Otra cosa en el caso de que fuera mi propia aplicación aunque lo dudo, por algunas razones que tengo, pero puedo equivocarme, cuales pueden ser las posibles causas que hagan que esto suceda(por ejemplo puede ser los hilos?), quisiera saber un poco mas de eso.

Saludos.

OSKR 28-12-2005 22:56:19

Tal como lo dijo el amigo jachguate... eso lo hace el SO, otras aplicaciones puden "cargar la DLL" pero realmente esa carga la hace el SO y es descargada de memoria cuando ya ninguna aplicación la use despues de su respectiva descarga, asi se evitan las dúplicas. por otro lado...al ser cargada por una aplicación, esta ya pasa a ser abierta en modo compartido pero con denegación de escritura, es decir, no puede ser modificada, solo leida, creo q solo deberías preocuparte por lo q tu aplicación hace con la librería y/o lo q hace la librería cuando tu aplicación la llama

jachguate 29-12-2005 04:41:52

Cita:

Empezado por fer21unmsm
Hola jachguate, antes que nada gracias por responder a mi pregunta, es correcto lo que dices, cuando por ejemplo otra aplicación trata de sobreescribir esa parte de la memoria donde esta cargada la DLL, manda un mensaje de Access Violation.....!, pero el problema es ese quisiera saber como puedo evitar que eso pase, es decir impedir que salga ese mensaje o impedir que la otra aplicación haga eso.

Para impedir que otra aplicación intente escribir una dirección específica de la memoria, hablá directamente con su programador y pedile que no lo haga.. :D
Es evidente, para mi, que eso es imposible, sobre todo si se trata de una aplicación como Word o Excel. ;)

Cita:

Empezado por fer21unmsm
Porque se puede dar el caso de que otra aplicación trate de sobreescribir dicha parte de la memoria y salga el tal mensajito pero no creo que al usuario le vaya a gustar.

El impedir que salga el mensaje (o permitirlo) igualmente es responsabilidad del programador de la aplicación y no algo por lo que vos debas preocuparte.

Cita:

Empezado por fer21unmsm
Otra cosa en el caso de que fuera mi propia aplicación aunque lo dudo, por algunas razones que tengo, pero puedo equivocarme, cuales pueden ser las posibles causas que hagan que esto suceda(por ejemplo puede ser los hilos?), quisiera saber un poco mas de eso.

Una forma de que esto suceda, "a la fuerza", es hacer que un puntero te dirija a esa dirección de memoria y escribir algo en ella. Accidentalmente puede pasar si usas un puntero para un objeto que fue destruido antes de que la dll llegase a la memoria y que esta casualmente cayera en la dirección a donde se apuntaba... cosa poco probable. La solución: hacer un manejo limpio de los punteros, haciendo que estos apunten a nil cada vez que se destruyan los objetos a donde apuntan o se libere la memoria que fue reservada para ellos. En otras palabras, órden al programar.

Hasta luego.

;)

fer21unmsm 29-12-2005 15:27:44

Gracias a todos ustedes por la respuesta.

Saludos.

mamcx 29-12-2005 15:33:37

Estoy *casi* seguro que SI se puede.

1- .NET lo hace usando el CAS (code acces security)

2- Puedes usar archivos mapeados en memoria, los que se les pueden asignar permisos de seguridad

3- Si programas la DLL como un componente COM+, lo instalas en el COM+ Manager y SE LE PUEDE DECLARAR LA SEGURIDAD. Por ejemplo, puedes especificar como es el acceso de los metodos, el usuario que puede cargar la DLL, etc... Es completo, y de las tres, la mas facil de hacer.

fer21unmsm 29-12-2005 15:53:16

Cita:

Empezado por mamcx
Estoy *casi* seguro que SI se puede.

1- .NET lo hace usando el CAS (code acces security)

2- Puedes usar archivos mapeados en memoria, los que se les pueden asignar permisos de seguridad

3- Si programas la DLL como un componente COM+, lo instalas en el COM+ Manager y SE LE PUEDE DECLARAR LA SEGURIDAD. Por ejemplo, puedes especificar como es el acceso de los metodos, el usuario que puede cargar la DLL, etc... Es completo, y de las tres, la mas facil de hacer.

Hola mamcx, gracias por responder, he entendido tu respuesta, pero quisiera saber como puedo instalarlo en el COM+ Manager mediante un programa en delphi, como es que podría accesar e instalarlo, ¿tendría que usar una API?.

Uso delphi 7.0
WindowsXP

Gracias de antemano
Saludos.

mamcx 29-12-2005 23:57:37

Para eso debes crear un componente Activex (por la paleta de Nuevo proyecto de delphi)

Alli defines los metodos y propiedades de la DLL. Una vez que termines, compilas la DLL y abres el COM+ desde Panel de control, herramientas administrativas.

Luego creas un nuevo paquete desde alli y luego insertas tu componente COM+ (o sea la dll). Aunque algunos pasos de configuracion de seguridad varian entre las versiones de sistema operativo el proceso en si es intuitivo y existe buena documentacion al respecto...

fer21unmsm 30-12-2005 16:02:22

Cita:

Empezado por mamcx
Para eso debes crear un componente Activex (por la paleta de Nuevo proyecto de delphi)

Alli defines los metodos y propiedades de la DLL. Una vez que termines, compilas la DLL y abres el COM+ desde Panel de control, herramientas administrativas.

Luego creas un nuevo paquete desde alli y luego insertas tu componente COM+ (o sea la dll). Aunque algunos pasos de configuracion de seguridad varian entre las versiones de sistema operativo el proceso en si es intuitivo y existe buena documentacion al respecto...

Ok Mamcx ya tengo la dll y ya lo instalé, gracias por tu tiempo dedicado a responder esta pregunta.

Saludos.


La franja horaria es GMT +2. Ahora son las 06:17:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi