使用.so库中没有头文件的函数,知道函数签名

时间:2014-05-29 09:59:58

标签: c++ c linux gcc

我想为术语和可能的愚蠢问题道歉,我是C ++和OS架构的新手。

我有一个为x86 32bit编译的library.so文件,我需要使用一个函数。在IDA的帮助下,我知道函数的符号和名称及其参数。

我创建了一个带有dlopen()调用的.cpp文件来导入库,然后通过名称获取指向函数的指针,最后,使用两个参数调用lib中的函数:"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,我会得到类似&#34;无法读取0x2074字节的节标题...不是ELF文件&#34;。好的,如果我对/lib/i386-linux-gnu/libc.so.6做一个符号链接,那么它读起来很好,但是当我再次启动文件时:

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

如果我尝试将.so文件导入Java测试类代码,我会得到完全相同的消息。

问题是:如何在知道函数签名的情况下将.so库正确导入到我的程序中。我没有图书馆的头文件。

由于

更新:我试图放

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

如果我备份并制作符号链接/usr/lib/i386-linux-gnu/libc.so - &gt; /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 个答案:

答案 0 :(得分:0)

验证,该library.so已正确加载所有依赖项。如果您使用的是不同的库,则可能没有__stack_chk_guard。检查ldd和其他工具。

btw __stack_chk_guard在x86架构上不是很受欢迎......