6
votes

Chargement de fichiers .so de la mémoire

Dupliqué possible:
Dlopen de la mémoire?

J'ai vu cela pour les fichiers DLL de Windows, en étant chargé à partir d'un tampon de mémoire, mais je ne peux pas le trouver n'importe où pour Linux, et le code source "LD" est le code le plus complexe que j'ai jamais vu. Donc:

Y a-t-il un exemple de chargement de fichiers .so de la mémoire? Même un simple que je puisse finir? Je ne sais tout simplement pas où commencer, même si j'ai lu la plupart des spécifications des elfes, il me reste mystérieux.


4 commentaires

Le .so est envoyé sur une connexion de socket et je cherche un compagnon de solution, pas une alternative.


@killercode Vous recherchez une solution à un problème que vous avez défini de manière assez étroite. Vous manquez actuellement de connaissances pour coder un .so de la mémoire et je veux payer quelqu'un d'autre pour le faire. Les alternatives ont plus de sens, à moins que vous ne puissiez nous donner un contexte.


le .so est envoyé sur des sockets, je ne veux pas l'écrire sur le disque car mon application peut ne pas avoir le privilège d'écrire des fichiers sur le disque. Je veux donc l'exécuter de la mémoire pour éviter tout sur n'importe quelle plate-forme et non seulement Linux.


Tuerercode ... Pourriez-vous trouver votre réponse? Avez-vous du code à afficher?


3 Réponses :


8
votes

Vous envisagez le code source d'une mauvaise chose: ld ne fait pas de programme et de chargement de la bibliothèque. Au lieu de cela, vous devez regarder le code source de dlopen et dlsym des fonctions trouvées dans libc. En outre, vous devez regarder la source de la liant dynamique dynamique: ld-linux.so (le vrai nom varie en fonction de la plate-forme; exécuter ldd / bin / ls pour savoir où réside la liaison dynamique).

L'analyse ELF n'est pas difficile, mais cela nécessite une attention particulière aux détails et à la compréhension du code de l'assemblage pour la CPU en question; Vous avez également besoin de spécification abi pour votre plate-forme (et il est différent pour Linux 32 et 64 bits, et est également différent entre les processeurs.)

Si vous avez juste besoin de charger les fichiers d'objet de la mémoire à l'heure d'exécution (c'est-à-dire que cela ne doit pas nécessairement être un), vous pouvez consulter le projet X11: ils ont mis en place un module système qui, fondamentalement, charge le code d'objet à une adresse et le transforme.


0 commentaires

-1
votes

Vous avez besoin de dlopen () famille de fonctions (sur GNU / Linux, ils sont définis dans /usr/include/dlfcn.h).

Pour un exemple, jetez un coup d'œil à Comment PHP fait-elle des modules .


1 commentaires

Je sais comment utiliser .so du disque, je veux les utiliser de la mémoire, ils n'existe pas sur le disque



-1
votes

Que signifie "chargement .so des fichiers de mémoire" signifie à vous?

Si vous avez des *. Donc fichier , il est dans certains fichiers et a un chemin. Ensuite, utilisez simplement dlopen dessus.

Si ce n'est pas un fichier , qu'est-ce que c'est? Comment avez-vous eu la mémoire? Qu'est-ce que vous avez exactement en mémoire? (Avez-vous un en-tête elfe et une mise en page elfe en mémoire?)

Si vous avez suffisamment d'informations pour créer un elfe *. SO Fichier, Dump (Ecrire) ce fichier dans un système de fichiers (utilisez un système de fichiers temporaire comme TMPFS si Vous êtes concerné par les performances du disque). Alors dlopen que.

Si vous n'avez pas assez d'informations pour créer un fichier elf .so , vous avez probablement un code de construction dynamique en mémoire. Regardez l'infrastructure génératrice de code machine existante (comme LLVM , gccjit , libjit , GNU Lightning , Luajit ....) font.

Si vous avez un code fonctionnel complet en mémoire, assurez-vous que la mémoire est exécutable avec MMAP & MProtect et sautez-le (par exemple, utiliser des tours de pointeur de fonction).


5 commentaires

Je suis assez surpris par les commentaires négatifs. Qu'est-ce que j'ai dit faux? Pourquoi ma réponse n'est-elle pas pertinente?


Ne répondant pas exactement à ce qu'il semble essayer de (obstinément) réaliser la façon dont il veut, mais ces informations sont généralement utiles. +1


Je ne comprends pas exactement l'exactitude de l'affiche originale par "chargement d'un fichier .so de la mémoire" ... (ou même charger n'importe quel type de fichier de mémoire), puisqu'un fichier ne peut être lu que à partir d'un système de fichiers. Je suppose que Windows avait une telle fonction car (IIRC) sur Windows Plusieurs processus ne peuvent pas fonctionner dans un fichier à la fois (par exemple, vous ne pouvez pas supprimer un fichier ouvert par un autre processus sous Windows, mais vous pouvez le faire sous Linux) .


Il envisage de passer un fichier .so sur une prise, il a donc le contenu d'un fichier entier en mémoire et veut en vigueur dlopen () à partir de là, au lieu de sur disque.


L'affiche originale n'a pas mentionné de doute ou de tuyau. Mais s'il obtient le contenu d'un fichier .so fichier elf sur un descripteur de fichier tel (non désapproprié et non recherché, non- MMAP , la seule option sensible est de Ecrivez-le sur un fichier, puis dlopen ce fichier.