Dado que o programa se lembra de usar a biblioteca entre execuções, ele deve armazenar essas informações em um arquivo de configuração em algum lugar. Como sugerido por Faheem Mitha , sua melhor aposta é encontrar esse arquivo de configuração e criá-lo antes de executar o programa.
A execução do programa com strace
deve informar quais arquivos são carregados:
strace -o myprogram.strace -e open,access myprogram
Se você precisar alterar a maneira como o programa funciona, essa situação exigirá LD_PRELOAD
. Você precisará encontrar qual chamada de biblioteca (não chamada de sistema!) O programa faz para determinar se deve carregar o arquivo. O comando ltrace
pode ajudar. Por exemplo, se o programa chamar dlopen
, substitua a função dlopen
para retornar um erro se o programa tentar abrir essa biblioteca específica. Aviso: código não testado.
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int dlopen(const char *filename, int flags) {
int (*original_dlopen)(const char *, int) = dlsym(RTLD_NEXT, "dlopen");
if (!strcmp(filename, PATH_TO_HIDE)) {
return NULL;
}
return original_fopen(path, mode);
}
Compile com
gcc -DPATH_TO_HIDE='"libfoo.so"' -O -Wall -fPIC -shared -o hide_libfoo.so hide_library.c -dl
Execute o programa da seguinte forma:
LD_PRELOAD=./hide_libfoo.so ./myprogram