是否可以确定二进制文件(静态或共享且未剥离)是使用 Linuxthreads 还是 NPTL 实现编译的?
如何确定用哪个线程实现二进制编译
逆向工程
linux
小精灵
图书馆
2021-06-23 12:56:36
1个回答
有很多方法,但我会举两个。通常,一个二进制文件,如果没有被剥离,就会包含符号(函数名、变量名等)。这些符号通常用于简化调试,并使用某种格式存储,例如 DWARF。
第一种方法是反汇编二进制文件,查找特定线程库相关的符号。例如 :
objdump -D ./YOUR_PROGRAM | grep -i thread
第二种是使用自己的库和LD_PRELOAD劫持线程库函数调用。这个概念相当简单,您编写一个库 (.so),在其中实现要检查的函数,例如pthread_create或pthread_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 消息。
其它你可能感兴趣的问题