如何确定用哪个线程实现二进制编译

逆向工程 linux 小精灵 图书馆
2021-06-23 12:56:36

是否可以确定二进制文件(静态或共享且未剥离)是使用 Linuxthreads 还是 NPTL 实现编译的?

1个回答

有很多方法,但我会举两个。通常,一个二进制文件,如果没有被剥离,就会包含符号(函数名、变量名等)。这些符号通常用于简化调试,并使用某种格式存储,例如 DWARF。

第一种方法是反汇编二进制文件,查找特定线程库相关的符号。例如 :

    objdump -D ./YOUR_PROGRAM | grep -i thread 

第二种是使用自己的库和LD_PRELOAD劫持线程库函数调用这个概念相当简单,您编写一个库 (.so),在其中实现要检查的函数,例如pthread_createpthread_join,并以这种方式重新实现它:

    int pthread_create(pthread_t *thread, 
                       const pthread_attr_t *attr,
                       void *(*start_routine) (void *), 
                       void *arg)
    {
          int ret;
          static void *(*ext_pthread_create)(pthread *, 
                                             const pthread_attr_t *,
                                             void *,
                                             void *);

          ext_pthread_create = dlsym("RTLD_NEXT", pthread_create);
          ret = ext_pthread_create(thread, attr, start_routine, arg);

          printf("pthread_create called !\n");

          return ret;
     }

在编译和测试您的库后,您所要做的就是以这种方式调用您的程序:

    LD_PRELOAD=hooklib.so ./YOUR_PROGRAM PARAMS

如果调用该函数,您将在标准输出中看到 printf 消息。