используя функцию из библиотеки .so без заголовочного файла, зная сигнатуру функции

0

Я хотел бы извиниться за терминологию и возможные глупые вопросы, я новичок в C++ и архитектуре ОС.

У меня есть файл library.so, скомпилированный для x86 32bit, из которого мне нужно использовать функцию. С помощью IDA я знаю символы и имя функции и ее параметров.

Я создал файл.cpp с вызовом dlopen() чтобы импортировать библиотеку, а затем получить указатель на функцию по ее имени и, наконец, вызвать функцию из библиотеки с двумя параметрами: "4d", "13a7330873d6e062"

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

int main(int argc, char **argv) {
    void *handle;
    char * (*cipher)(const char *,const char *);
    char *error;
    handle = dlopen ("/path/to/library.so", RTLD_LAZY);
    if (!handle) {
        fprintf (stderr, "%s\n", dlerror());
        exit(1);
    }
    dlerror();    /* Clear any existing error */
    cipher = (char * (*)(const char *,const char *)) dlsym(handle, "known_function_name");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s\n", error);
        exit(1);
    }
    printf ("%s\n", (*cipher)("4d","13a7330873d6e062"));
    dlclose(handle);
    return 0;
}

Затем я попытался скомпилировать его с g++ - 4.6 (потому что, как я вижу в содержимом lib, он был скомпилирован с использованием gcc 4.6) со следующими параметрами:

g++-4.6 -o test test.cpp -ldl

Он компилируется без каких-либо предупреждений/ошибок, но когда я запускаю. /test, я получаю:

/usr/lib/i386-linux-gnu/libc.so: invalid ELF header

Если я попытаюсь выполнить readelf -h/usr/lib/i386-linux-gnu/libc.so, я получаю что-то вроде "Невозможно прочитать в 0x2074 байтах заголовков разделов... Не файл ELF". Хорошо, если я делаю символическую ссылку на /lib/i386-linux-gnu/libc.so.6, тогда она отлично читается, но когда я снова запускаю файл:

/path/to/library.so: undefined symbol: __stack_chk_guard

Я получаю точно такие же сообщения, если я пытаюсь импортировать файл.so в код класса Java-теста.

Вопрос в том, как правильно импортировать.so lib в мою проразу, зная подпись функции. У меня нет файла заголовка для библиотеки.

благодаря

ОБНОВЛЕНИЕ: я попытался поставить

void *__stack_chk_guard;

в мой файл test.cpp (если я понял это правильно) и перекомпилировал его с -fstack-protector, но это не помогло, я все еще получаю

/path/to/library.so: undefined symbol: __stack_chk_guard

Также: он отлично компилируется с моим текущим /usr/lib/i386-linux-gnu/libc.so, НО, когда я его запускаю, он жалуется на это, как я сказал ранее:

/usr/lib/i386-linux-gnu/libc.so: invalid ELF header

Если я его создам и создаю symlink/usr/lib/i386-linux-gnu/libc.so ->/lib/i386-linux-gnu/libc.so.6, то он не будет компилироваться с помощью:

/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function '_start':
(.text+0xc): undefined reference to '__libc_csu_fini'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function '_start':
(.text+0x11): undefined reference to '__libc_csu_init'
collect2: ld returned 1 exit status 

но затем он работает с

/path/to/library.so: undefined symbol: __stack_chk_guard
  • 1
    Ваша версия 'glibc' была скомпилирована без 'поддержки стека glibc', но с 'library.so'. Вот почему «__stack_chk_guard» не определено.
  • 0
    хм, могу ли я как-то установить glibc из репозитория пакетов с помощью сторожевой охраны? Или мне нужно перекомпилировать только вручную? Я на Ubuntu дерзкий
Показать ещё 7 комментариев
Теги:
gcc

1 ответ

0

Убедитесь, что библиотека содержит все зависимости, загруженные правильно. Если вы используете разные библиотеки, в нем, вероятно, нет __stack_chk_guard. Проверьте с помощью ldd и других инструментов.

btw __stack_chk_guard не очень популярна в архитектуре x86...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню