gpt4 book ai didi

c++ - 通过 C 中的偏移量调用函数

转载 作者:太空狗 更新时间:2023-10-29 21:33:31 30 4
gpt4 key购买 nike

我正在尝试使用 dlopen 动态加载一个共享库,并通过它在库二进制文件中的偏移调用一个非导出函数。但是,我无法弄清楚究竟如何?不过我知道函数的签名。

void *lib_ref = dlopen("libany.so", RTLD_NOW | RTLD_GLOBAL);
if (lib_ref != NULL) {
const char *(*Ref_0000ABCC)(int *, const char *);
Ref_0000ABCC = dlsym(lib_ref, "0000ABCC");
if (Ref_0000ABCC != NULL) {
int ok;
Ref_0000ABCC(&ok, "Something");
} else {
// could not get reference
}
dlclose(lib_ref);
} else {
// could not load library
}

有人可以帮忙吗?

编辑:我汇编了下面的代码,它抛出Fatal signal 11 (SIGSEGV), code 1:

void *lib_ref = dlopen("libany.so", RTLD_NOW | RTLD_GLOBAL);
if (lib_ref != NULL) {
Dl_info lib_info;
dladdr(lib_ref, &lib_info);
size_t lib_addr = (size_t) lib_info.dli_fbase;
size_t func_addr = lib_addr + 0x0000ABCC;
const char *(*Ref_0000ABCC)(int *, const char *) = (const char *(*)(int *, const char *))(func_addr);
if (Ref_0000ABCC != NULL) {
int ok;
const char *result = Ref_0000ABCC(&ok, "Something");
} else {
// could not find reference
}
dlclose(lib_ref);
} else {
// could not load library
}

最佳答案

如果您正在处理的库 libany.so 具有导出的符号,这会很容易。如果库导出一个名为 int some_exported_func(const char *)函数,您可以在 IDA 中检查它的偏移量我们假设(例如)是 0x000075AC。根据 IDA,您要查找的函数位于 0x0000ABCC。所以,现在您可以计算这 2 个偏移量之间的差异,在运行时找到命名函数,然后将该差异添加到它的偏移量以获得所需的函数。

示例代码如下:

void *lib_ref = dlopen("libany.so", RTLD_NOW | RTLD_GLOBAL);
if (lib_ref != NULL) {
int (*func_named)(const char *) = dlsym(lib_ref, "some_exported_func");
if (func_named != NULL) {
Dl_info func_info;
dladdr(func_named, &func_info);
size_t addr_named = (size_t) func_info.dli_saddr;
int difference = 0x0000ABCC - 0x000075AC;
size_t addr_ABCC = addr_named + difference;
const char *(*func_ABCC)(int *, const char *) = (const char *(*)(int *, const char *))(addr_ABCC);
if (func_ABCC != NULL) {
int ok;
const char *result = func_ABCC(&ok, "Something");
} else {
// could not find reference
}
}
dlclose(lib_ref);
} else {
// could not load library
}

关于c++ - 通过 C 中的偏移量调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50877037/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com