1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #define _GNU_SOURCE /* pour RTLD_NEXT */
#include <stdio.h>
#include <dlfcn.h>
#include <string.h>
#include "libhijack2.h"
typedef int (*PFCTB)( int );
typedef void * (*PDLOPEN)( const char *, int );
typedef void * (*PDLSYM)(void *, const char *);
/* Handle de la vraie libtest.so */
static void *vraieLibtest = NULL;
void *dlopen( const char *filename, int flag ) {
void *handle; /* le handle à retourner */
PDLOPEN vraieDlopen;
fprintf( stderr, "-- Dans la fausse dlopen(): filename='%s', flag=%X\n", filename, flag );
vraieDlopen = dlsym( RTLD_NEXT, "dlopen" );
/* **** INSERER GESTION D'ERREURS ICI **** */
/*
* On charge la bibliothèque et on récupère son handle
* (qu'on retournera).
*/
handle = vraieDlopen( filename, flag );
/*
* Pas besoin de gérer les erreurs ici : on agit de façon
* transparente pour le programme appelant donc c'est à lui
* de les gérer :)
* (i.e. : est-ce que dlopen() gère les erreurs retournées
* par dlopen() ???)
*/
/*
* Si la bibliothèque demandée est libtest.so,
* on garde une copie de son handle.
*/
/*
* TODO: modifier le test pour supporter libtest.so.1,
* libtest.so.1.0 et les cas où un chemin est donné.
*/
if ( 0 == strcmp( "libtest.so", filename ) ) {
if ( NULL == vraieLibtest ) {
vraieLibtest = handle;
}
}
return handle;
}
void *dlsym( void *handle, const char *symbol ) {
void *retPtr; /* pointeur qui sera retourné */
PDLSYM vraieDlsym;
/* Si l'appelant veut l'adresse de fonctionB dans libtest.so ... */
if ( \
( NULL != handle ) \
&& \
( handle == vraieLibtest ) \
&& \
( 0 == strcmp( "fonctionB", symbol ) ) \
) {
/* ...on lui donne l'adresse de notre fonctionB */
retPtr = fonctionB;
} else {
/* Sinon, on a besoin de récupérer son adresse */
/*
* On commence par récupérer l'adresse de la vraie dlsym()
* en utilisant dlvsym() (avec un "v") car notre fonction
* s'appelle dlsym() (vu ?)
*/
vraieDlsym = dlvsym( RTLD_NEXT, "dlsym", LHJ2_GLIBC_VERSION );
/* INSERER GESTION D'ERREURS ICI */
retPtr = vraieDlsym( handle, symbol );
}
return retPtr;
}
int fonctionB( int argB1 ) {
fprintf( stderr, "-- Dans la fausse fonctionB(): argB1=%i\n", argB1 );
return (argB1==0?0:argB1*2);
} |
Partager