Question

Supposons que j'ai un binaire ELF que dynamique de lien, et je veux override / rediriger certains appels de bibliothèque. Je sais que je peux le faire avec LD_PRELOAD, mais je veux une solution qui est permanente dans le binaire, indépendamment de l'environnement, et que les travaux pour les binaires setuid / setgid, dont aucun LD_PRELOAD peut atteindre.

Ce que je voudrais faire est le code d'ajout de fichiers d'objets supplémentaires (éventuellement dans de nouvelles sections, le cas échéant) et ajouter les symboles de ces fichiers objet à la table des symboles du binaire de sorte que la nouvelle version ajoutée du code est utilisé en place du code bibliothèque partagée. Je crois que cela devrait être possible sans réellement effectuer toute réinstallation dans le code existant; même si elles sont dans le même dossier, ceux-ci devraient pouvoir être résolus lors de l'exécution de la manière habituelle de PLT (pour ce que ça vaut, je ne se soucient que de fonctions, pas de données).

S'il vous plaît ne me donne pas de réponses le long de la ligne de « Tu ne veux pas faire ça! » ou « Ce n'est pas portable! » Qu'est-ce que je travaille sur un moyen de binaires avec interface alternative légèrement ABI incompatible avec les mises en œuvre aux bibliothèques partagées. La plate-forme en question est i386-linux (à savoir 32 bits) si elle compte. À moins que je ne me trompe pas sur ce qui est possible, je pourrais écrire des outils pour analyser les fichiers ELF et exécuter mes hacks, mais je pense qu'il ya un moyen de fantaisie d'utiliser l'éditeur de liens GNU et d'autres outils pour y parvenir sans avoir à écrire un nouveau code.

Était-ce utile?

La solution

Je suggère que le elfsh et al. outils de la eresi projet, si vous voulez l'instrument ELF fichiers eux-mêmes. Compatibilité avec i386-linux est pas un problème, comme je l'ai utilisé moi-même dans le même but.

Les tutoriaux sont pertinents .

Autres conseils

ld a --wrap option qui vous permet de remplacer un symbole donné comme malloc par un symbole que vous appelleriez __wrap_malloc. Avec cela, vous pouvez écrire des talons pour les fonctions qui vous intéressent et que lien à la bibliothèque en question.

Je ne semble pas être en mesure de simplement ajouter un commentaire à cette question, il détachement en une « réponse ». Désolé à ce sujet, le faire juste pour aider, espérons d'autres personnes qui cherchent une réponse.

Alors, je semble avoir usecase similaire, mais je trouve explicitement toute modification de binaires existants inacceptables (pour moi), donc je suis à la recherche d'approche proxy autonome: bibliothèque proxy partagée (sharedlib, shlib, donc) pour ELF?

Vous pourriez gérer une partie de la dynamique liant dans votre programme lui-même. Lisez la page de manuel pour dlsym (3) en particulier, et dlopen (3), dlerror (3), et dlclose (3) pour le reste de la dynamique reliant l'interface.

Un exemple simple - dire que je veux override dup2 (2) de la libc. Je pourrais utiliser le code suivant (Appelons-le « dltest.c »):

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dlfcn.h>

int (*prev_dup2)(int oldfd, int newfd);

int dup2(int oldfd, int newfd) {
    printf("DUP2: %d --> %d\n", oldfd, newfd);
    return prev_dup2(oldfd, newfd);
}

int main(void) {
    int i;

    prev_dup2 = dlsym(RTLD_NEXT, "dup2");
    if (!prev_dup2) {
        printf("dlsym failed to find 'dup2' function!\n");
        return 1;
    }
    if (prev_dup2 == dup2) {
        printf("dlsym found our own 'dup2' function!\n");
        return 1;
    }

    i = dup2(1,3);
    if (i == -1) {
        perror("dup2() failed");
    }

    return 0;
}

Compile avec:

gcc -o dltest dltest.c -ldl

La fonction dup2 lié statiquement () remplace le dup2 () à partir de la bibliothèque. Cela fonctionne même si la fonction est dans un autre fichier .c (et est compilé comme .o séparée).

Si vos fonctions prépondérants sont eux-mêmes liés de façon dynamique, vous voudrez peut-être utiliser dlopen () plutôt que de faire confiance à l'éditeur de liens pour obtenir les bibliothèques dans l'ordre correct.

EDIT : Je pense que si une autre fonction au sein de la bibliothèque surchargée appelle une fonction surchargée, la fonction d'origine est appelée plutôt que le remplacement. Je ne sais pas ce qui se passera si une bibliothèque dynamique appelle un autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top