chargement d'une librairie dynamique

Le
Olivier Ravard
Bonjour,

je souhaite charger un module python qui est sous forme
librairie dynamique (.so sous linux ou .pyd sous win).
Cette librairie est "reçue" sous forme de chaîne de caractère.
Je peux donc la charger dans l'interprêteur de la manière
suivante en utilisant le module "imp" :

import imp
f = open('my_module.so', 'wb')
f.write(la_chaine)
f.close()
mod = imp.load_dynamic('my_module','./my_module.so')

Mais je souhaite éviter d'écrire sur le disque (pour des raisons
de sécurité). On pourrait éventuellement passer par une cStringIO
de la manière suivante :

from cStringIO import StringIO
fid = StringIO(la_chaine)
mod = imp.load_dynamic('my_module',fid)

cette solution ne marche pas car load_dynamic ne prend qu'un nom
de fichier en argument et non un fid.

Connaissez-vous un autre moyen (autre que "imp") pour charger une
librairie dynamique (sans créer le fichier) ?

merci de vos suggestions

Olivier
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain BARTHE
Le #20158961
Olivier Ravard a écrit :
Bonjour,

je souhaite charger un module python qui est sous forme
librairie dynamique (.so sous linux ou .pyd sous win).
Cette librairie est "reçue" sous forme de chaîne de caractère.
Je peux donc la charger dans l'interprêteur de la manière
suivante en utilisant le module "imp" :

import imp
f = open('my_module.so', 'wb')
f.write(la_chaine)
f.close()
mod = imp.load_dynamic('my_module','./my_module.so')

Mais je souhaite éviter d'écrire sur le disque (pour des raisons
de sécurité). On pourrait éventuellement passer par une cStringIO
de la manière suivante :

from cStringIO import StringIO
fid = StringIO(la_chaine)
mod = imp.load_dynamic('my_module',fid)

cette solution ne marche pas car load_dynamic ne prend qu'un nom
de fichier en argument et non un fid.

Connaissez-vous un autre moyen (autre que "imp") pour charger une
librairie dynamique (sans créer le fichier) ?

merci de vos suggestions ...

Olivier



Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un
.so sans passer par un fichier.

Je pense que la méthode imp.load_dynamic doit utiliser par derrière la
fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un
fichier disque.

Tu peux regarder également le module python ctypes (à partir de python
2.6) qui permet de charger des librairies dynamiques, mais je pense que
tu auras le même problème.
Olivier Ravard
Le #20159101
Alain BARTHE a écrit :

Je pense que la méthode imp.load_dynamic doit utiliser par derrière la
fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un
fichier disque.


effectivement.

Tu peux regarder également le module python ctypes (à partir de python
2.6) qui permet de charger des librairies dynamiques, mais je pense que
tu auras le même problème.



J'ai regardé ce module, mais on retrouve effectivement la même contrainte.
Merci de ta réponse.

Olivier
Michel Claveau - MVP
Le #20161501
Bonsoir !

Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.

Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?

@-salutations
--
Michel Claveau
Olivier Ravard
Le #20162791
Michel Claveau - MVP a écrit :
Bonsoir !

Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.

Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?


oui, ça conviendrait. Y-a-t-il un moyen de faire et monter un ramdisk directement depuis
python sans intervention de l'utilsateur (au démarrage du soft par exemple) ?
merci.

@-salutations


debug this fifo
Le #20165901
Alain BARTHE wrote:

cette solution ne marche pas car load_dynamic ne prend qu'un nom
de fichier en argument et non un fid.




Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un
.so sans passer par un fichier.




Oui, parce que le dlopen, en fait, fait plutot un "mmap" du
fichier dans des pages memoires.
Amaury Forgeot d'Arc
Le #20170521
Michel Claveau - MVP a écrit :
Bonsoir !

Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.



C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des
.dll à partir d'un .zip, sans passer par le disque.
En fait, il émule la fonction LoadLibrary.

La méthode est là
http://www.joachim-bauch.de/tutorials/load_dll_memory.html
mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de
réimplémenter en utilisant ctypes.
Bon courage.

--
Amaury
Olivier Ravard
Le #20193361
Amaury Forgeot d'Arc a écrit :
Michel Claveau - MVP a écrit :
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le
seule méthode qui me vient à l'esprit, c'est de pratiquer de
l'injection de DLL. Malheureusement (ou heureusement ?) cela est
systématiquement identifié comme une atteinte de sécurité, avec
blocage aussi bien par l'OS que par les antivirus, ou autres éléments
(dits) protecteurs.



C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des
.dll à partir d'un .zip, sans passer par le disque.
En fait, il émule la fonction LoadLibrary.

La méthode est là
http://www.joachim-bauch.de/tutorials/load_dll_memory.html
mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de
réimplémenter en utilisant ctypes.
Bon courage.



Je vais regarder de ce côté là. Merci.

Olivier
Publicité
Poster une réponse
Anonyme