Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 确定哪些共享库调用我的共享库_C_Shared Libraries - Fatal编程技术网

C 确定哪些共享库调用我的共享库

C 确定哪些共享库调用我的共享库,c,shared-libraries,C,Shared Libraries,我试图找到一种方法来知道哪个共享库正在调用我的共享库函数。情况是这样的 我已经使用LD_PRELOAD来覆盖malloc。在我的malloc中,我直接将调用转发给真正的malloc,但是如果调用来自特定的共享库,我希望在转发调用之前进行一些处理 现在,我想处理其对malloc的调用的共享库被一种插件体系结构中的外部可执行文件加载和调用。我可以通过检查全局程序_invocation_short_name变量来判断哪个可执行文件调用了我的malloc,但我不想处理来自提供插件体系结构的可执行文件的m

我试图找到一种方法来知道哪个共享库正在调用我的共享库函数。情况是这样的

我已经使用LD_PRELOAD来覆盖malloc。在我的malloc中,我直接将调用转发给真正的malloc,但是如果调用来自特定的共享库,我希望在转发调用之前进行一些处理

现在,我想处理其对malloc的调用的共享库被一种插件体系结构中的外部可执行文件加载和调用。我可以通过检查全局程序_invocation_short_name变量来判断哪个可执行文件调用了我的malloc,但我不想处理来自提供插件体系结构的可执行文件的malloc调用,而只处理来自插件共享库的malloc调用

我尝试过使用backtrace()和backtrace_symbols()来查看是否可以从backtrace中获取插件库名称或其一部分,但没有成功。我在那里从来没有听说过这个名字

有人能建议怎么做吗

问候,

亚历克斯


编辑:我忘了提。这是在Linux上实现的。糟糕的是,我假设LD_PRELOAD泄露了这一点。

在Windows上,您可以使用特殊的API,如
CreateToolhelp32Snapshot()
Module32First()
来获取进程中加载的所有共享库的列表

每个这样的库将驻留在一个内存范围内,由结构
MODULEENTRY32
的成员
modBaseAddr
modBaseSize
指定


通过检查调用者的返回地址(可以通过一些简单的内联程序集完成),您可以将其与这些范围进行比较,从而准确地识别调用者。

没有简单的方法可以做到这一点,但这种方法可能适合您的需要

我已经编写了3个小应用程序,因此您可以按照我的说明进行操作。它们是:

  • 应用程序:将在您的系统上运行的二进制文件。从libmiddleman.com调用函数,以便尝试通过malloc()分配一些内存
源代码:
gcc-app.c-o-app-L-lmiddle_-man

//File: app.c
#include "libmiddle_man.h"    
#include <stdio.h>

int main()
{
    do_something();

    return 0;
}
而且:

//File: libmiddle_man.h
void do_something();
  • libfake\u malloc.so:实现并导出我们的malloc()版本,该版本在终端上打印某些内容
源代码:
gcc lbfake_malloc.c-o libfake_malloc.so-shared

//File: libmiddle_man.c
void do_something()
{
    int* tmp = malloc(sizeof(int));
}
//File: libfake_malloc.c
#include <stdio.h>
#include <unistd.h>

void* malloc(size_t size)
{
    printf("fake malloc()\n");

    printf("Process ID: %d\n", getpid());

    while(1)
    {
    }

    return NULL;
}
应用程序将挂在那里,因为我们非常需要它。我们将检查进程内存映射,并确保app同时加载了我们的两个库

所以现在就把它留在那里,打开另一个终端。当您在进程列表中搜索此PID时,它将显示哪个应用程序正在使用libfake_malloc.so。这不是我们的目标,但这是一个有趣的信息

ps -aux | grep 14230
产出:

karl     14230 97.3  0.0   1648   396 pts/9    R+   13:57  10:20 ./app
记住将14230更改为应用程序返回给您的任何号码。接下来,我们将检查进程内存并验证两个out库是否都已加载

cat /proc/14230/maps
显示:

00110000-00263000 r-xp 00000000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00263000-00264000 ---p 00153000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00264000-00266000 r--p 00153000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00266000-00267000 rw-p 00155000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00267000-0026a000 rw-p 00000000 00:00 0 
00584000-00585000 r-xp 00000000 08:07 2921104    /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00585000-00586000 r--p 00000000 08:07 2921104    /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00586000-00587000 rw-p 00001000 08:07 2921104    /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00605000-00606000 r-xp 00000000 08:07 2921103    /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
00606000-00607000 r--p 00000000 08:07 2921103    /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
00607000-00608000 rw-p 00001000 08:07 2921103    /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
007e6000-007e7000 r-xp 00000000 00:00 0          [vdso]
0096a000-00985000 r-xp 00000000 08:06 2142529    /lib/ld-2.11.1.so
00985000-00986000 r--p 0001a000 08:06 2142529    /lib/ld-2.11.1.so
00986000-00987000 rw-p 0001b000 08:06 2142529    /lib/ld-2.11.1.so
08048000-08049000 r-xp 00000000 08:07 2921106    /home/karl/workspace/shared_libs/who_called_my_shared/app
08049000-0804a000 r--p 00000000 08:07 2921106    /home/karl/workspace/shared_libs/who_called_my_shared/app
0804a000-0804b000 rw-p 00001000 08:07 2921106    /home/karl/workspace/shared_libs/who_called_my_shared/app
b77b0000-b77b2000 rw-p 00000000 00:00 0 
b77c9000-b77cc000 rw-p 00000000 00:00 0 
bfb69000-bfb7e000 rw-p 00000000 00:00 0          [stack]
您会注意到libfake_malloc.so的inode是2921103,而加载它的库(即libmiddle_man.so)的inode实际上是2921103+1,即2921104


我有机会在一些机器和一些同样运行Linux的嵌入式设备上测试这一点。总而言之,通过解析/proc/pid/maps上的可用信息,似乎可以发现哪个库加载了您的库。

我希望使用相同的方法,但在linux上,但到目前为止还没有找到等效的系统调用。有什么想法吗?
00110000-00263000 r-xp 00000000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00263000-00264000 ---p 00153000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00264000-00266000 r--p 00153000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00266000-00267000 rw-p 00155000 08:06 2158492    /lib/tls/i686/cmov/libc-2.11.1.so
00267000-0026a000 rw-p 00000000 00:00 0 
00584000-00585000 r-xp 00000000 08:07 2921104    /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00585000-00586000 r--p 00000000 08:07 2921104    /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00586000-00587000 rw-p 00001000 08:07 2921104    /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00605000-00606000 r-xp 00000000 08:07 2921103    /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
00606000-00607000 r--p 00000000 08:07 2921103    /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
00607000-00608000 rw-p 00001000 08:07 2921103    /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
007e6000-007e7000 r-xp 00000000 00:00 0          [vdso]
0096a000-00985000 r-xp 00000000 08:06 2142529    /lib/ld-2.11.1.so
00985000-00986000 r--p 0001a000 08:06 2142529    /lib/ld-2.11.1.so
00986000-00987000 rw-p 0001b000 08:06 2142529    /lib/ld-2.11.1.so
08048000-08049000 r-xp 00000000 08:07 2921106    /home/karl/workspace/shared_libs/who_called_my_shared/app
08049000-0804a000 r--p 00000000 08:07 2921106    /home/karl/workspace/shared_libs/who_called_my_shared/app
0804a000-0804b000 rw-p 00001000 08:07 2921106    /home/karl/workspace/shared_libs/who_called_my_shared/app
b77b0000-b77b2000 rw-p 00000000 00:00 0 
b77c9000-b77cc000 rw-p 00000000 00:00 0 
bfb69000-bfb7e000 rw-p 00000000 00:00 0          [stack]