Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

chargement d'une librairie dynamique

7 réponses
Avatar
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

7 réponses

Avatar
Alain BARTHE
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.
Avatar
Olivier Ravard
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
Avatar
Michel Claveau - MVP
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
Avatar
Olivier Ravard
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


Avatar
debug this fifo
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.
Avatar
Amaury Forgeot d'Arc
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
Avatar
Olivier Ravard
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