天道酬勤,学无止境

ld-preload

LD_PRELOAD 不能拦截系统调用,只能拦截libcalls?(LD_PRELOAD can not intercept syscalls, but only libcalls?)

问题 我的代码适用于malloc ,但不适用于mmap 。 代码如下: 主文件 #include <stdio.h> #include <stdlib.h> int main(){ int * p = (int*) malloc(sizeof(int)); printf("in main(): value p = %d\n", *p); free(p); } 预加载 #define _GNU_SOURCE #include <time.h> #include <dlfcn.h> #include <stdio.h> #include <sys/types.h> void *(*orig_malloc)(size_t size); void *malloc(size_t size){ printf(" Hooked(preload)! malloc:size:%lu\n", size); return orig_malloc(size); } void * (*orig_mmap)(void *start, size_t length, int prot, int flags, int fd, off_t offset); void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset

2021-09-22 08:07:04    分类:技术分享    c   system-calls   ld-preload   systrace

LD_PRELOAD 不能拦截系统调用,只能拦截libcalls?(LD_PRELOAD can not intercept syscalls, but only libcalls?)

问题 我的代码适用于malloc ,但不适用于mmap 。 代码如下: 主文件 #include <stdio.h> #include <stdlib.h> int main(){ int * p = (int*) malloc(sizeof(int)); printf("in main(): value p = %d\n", *p); free(p); } 预加载 #define _GNU_SOURCE #include <time.h> #include <dlfcn.h> #include <stdio.h> #include <sys/types.h> void *(*orig_malloc)(size_t size); void *malloc(size_t size){ printf(" Hooked(preload)! malloc:size:%lu\n", size); return orig_malloc(size); } void * (*orig_mmap)(void *start, size_t length, int prot, int flags, int fd, off_t offset); void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset

2021-09-22 08:05:06    分类:技术分享    c   system-calls   ld-preload   systrace

在运行时动态修改符号表(在 C 中)(Dynamically modify symbol table at runtime (in C))

问题 是否可以在运行时用 C 动态修改符号表(Linux 上的 elf 格式)? 我的最终目标如下: 在某些函数中说foo ,我想将malloc函数覆盖到我的自定义处理程序my_malloc 。 但是在foo之外,任何malloc仍然应该像在 glibc 中一样调用 malloc。 注意:这与LD_PRELOAD不同,后者会在整个程序执行期间覆盖malloc 。 回答1 是否可以在运行时用 C 动态修改符号表(Linux 上的 elf 格式)? 理论上这是可能的,但实际上很难做到。 在某些函数中说foo ,我想将malloc函数覆盖到我的自定义处理程序my_malloc 。 但是在foo之外,任何malloc仍然应该像在 glibc 中一样调用malloc 。 修改符号表(即使可能)不会让你达到你想要的目标。 所有来自 ELF 二进制文件中任何位置的调用(假设foo在主可执行文件中),解析为相同的PLT 导入槽malloc@plt 。 该插槽在第一次调用时解析为 glibc malloc (从程序中的任何位置,假设您没有使用LD_BIND_NOW=1或类似的)。 解析该插槽后,对符号表的任何进一步修改都将无效。 你没有说你对foo有多少控制权。 如果你可以重新编译它,问题就变得微不足道了: #define malloc my_malloc int foo() { // same

2021-09-20 21:32:43    分类:技术分享    symbols   elf   ld-preload

LD_PRELOAD and linkage

I have this small testcode atfork_demo.c: #include <stdio.h> #include <pthread.h> void hello_from_fork_prepare() { printf("Hello from atfork prepare.\n"); fflush(stdout); } void register_hello_from_fork_prepare() { pthread_atfork(&hello_from_fork_prepare, 0, 0); } Now, I compile it in two different ways: gcc -shared -fPIC atfork_demo.c -o atfork_demo1.so gcc -shared -fPIC atfork_demo.c -o atfork_demo2.so -lpthread My demo main atfork_demo_main.c is this: #include <dlfcn.h> #include <stdio.h> #include <unistd.h> int main(int argc, const char** argv) { if(argc <= 1) { printf("usage: ... lib.so\n

2021-09-07 20:44:30    分类:问答    c   ld   dlopen   ld-preload

LD_PRELOAD 不适用于我的程序(LD_PRELOAD not working with my program)

问题 为了测试 LD_PRELOAD,我编写了自己的getpid ,它会在使用 dlsym 调用原始getpid之前打印一些内容。 代码如下。 #define _GNU_SOURCE #include <unistd.h> #include <stdio.h> #include <dlfcn.h> typedef pid_t (*getpidType)(void); pid_t getpid(void) { printf("Hello, getpid!\n"); getpidType f = (getpidType)dlsym(RTLD_NEXT, "getpid"); return f(); } 但是,当我在我的程序中使用这样的getpid并使用 LD_PRELOAD 运行它时,通过键入LD_PRELOAD=./prelib.so ./prog ,我收到以下错误。 ./prog: symbol lookup error: ./prelib.so: undefined symbol: dlsym 但是如果我做LD_PRELOAD=./prelib.so bash -c 'echo $$' ,就没有这样的错误。 知道这里发生了什么。 回答1 通过在 makefile 中使用-ldl将其与libdl.so.2链接解决了该问题。

2021-09-01 23:25:25    分类:技术分享    c   linux   gcc   x86-64   ld-preload

LD_PRELOAD not working with my program

For testing LD_PRELOAD, I wrote my own getpid, which prints something before calling the original getpid using dlsym. The code is given below. #define _GNU_SOURCE #include <unistd.h> #include <stdio.h> #include <dlfcn.h> typedef pid_t (*getpidType)(void); pid_t getpid(void) { printf("Hello, getpid!\n"); getpidType f = (getpidType)dlsym(RTLD_NEXT, "getpid"); return f(); } However when I use such getpid in my program and run it using LD_PRELOAD, by typing LD_PRELOAD=./prelib.so ./prog, I get the following error. ./prog: symbol lookup error: ./prelib.so: undefined symbol: dlsym But If I do LD

2021-08-31 19:36:15    分类:问答    c   linux   gcc   x86-64   ld-preload

是否可以使任意程序忽略信号?(Is it possible to make an arbitrary program ignore signals?)

问题 特别是在 Mac OS X 上,是否可以通过 DYLD_INSERT_LIBRARIES 以适用于任何或大多数程序的方式使程序忽略 SIGTERM? 我尝试编译并插入这个: #include<stdio.h> #include<signal.h> #include<unistd.h> void sig_handler(int signo) { if (signo == SIGTERM) printf("received SIGTERM\n"); } int main(void) { signal(SIGTERM, sig_handler); return 0; } 然而, DYLD_INSERT_LIBRARIES=libignore.dylib sleep 60 能够毫无问题地杀死 -15'd。 回答1 您可以创建一个可执行文件,将SIGTERM的操作设置为SIG_IGN ,然后 execvp() 您想在忽略该信号的情况下运行的程序: 在调用进程映像中设置为默认操作(SIG_DFL)的信号应设置为新进程映像中的默认操作。 除了 SIGCHLD,调用进程映像设置为忽略的信号 (SIG_IGN) 应设置为新进程映像忽略。 设置为调用进程映像捕获的信号应设置为新进程映像中的默认操作 你甚至可以用 bash 做到这一点: #!/bin/bash # no-sigterm.sh

2021-08-29 21:47:31    分类:技术分享    macos   signals   dyld   ld-preload   function-interposition

Dynamically modify symbol table at runtime (in C)

Is it possible to dynamically modify symbol table at runtime in C (in elf format on Linux)? My eventual goal is the following: Inside certain function say foo, I want to override malloc function to my custom handler my_malloc. But outside foo, any malloc should still call to malloc as in glibc. Note: this is different from LD_PRELOAD which would override malloc during the entire program execution.

2021-07-12 17:46:27    分类:问答    symbols   elf   ld-preload

如何使用 LD_PRELOAD 拦截 dlsym 调用?(How can I intercept dlsym calls using LD_PRELOAD?)

问题 我想拦截应用程序对 dlsym 的调用。 我尝试在 .so 中声明,以便我预加载 dlsym ,并使用 dlsym 本身来获取它的真实地址,但是由于很明显的原因,这不起作用。 有没有比获取进程的内存映射并使用 libelf 在加载的 libdl.so 中找到 dlsym 的真实位置更容易的方法? 回答1 我在 hdante 的回答中偶然发现了与评论者相同的问题:调用__libc_dlsym()直接崩溃并出现段错误。 在阅读了一些 glibc 源代码后,我想出了以下 hack 作为解决方法: extern void *_dl_sym(void *, const char *, void *); extern void *dlsym(void *handle, const char *name) { /* my target binary is even asking for dlsym() via dlsym()... */ if (!strcmp(name,"dlsym")) return (void*)dlsym; return _dl_sym(handle, name, dlsym); } 请注意此“解决方案”的两件事: 此代码绕过由(__libc_)dlsym()内部完成的锁定,因此为了使此线程安全,您应该添加一些锁定。 _dl_sym()的第三个参数是调用者的地

2021-07-11 12:49:24    分类:技术分享    c++   c   intercept   ld-preload   dlsym

函数插入仅适用于 malloc 不是免费的(Function interposition only working for malloc not free)

问题 我在监视 malloc 和 free 通过使用函数插入时遇到了一个小问题。 当只为 malloc 执行函数插入时,它按预期工作。 但是,当尝试插入 free 时,它​​最终会陷入循环; 我似乎免费被递归调用,但我只是不知道为什么。 这是 malloc 和 free 函数的代码。 (mod_malloc_free.c) #define _GNU_SOURCE #include <stdio.h> #include <stdint.h> #include <dlfcn.h> void* malloc(size_t size) { static void* (*real_malloc)(size_t) = NULL; printf("%s\n", "inside shared malloc"); if(!real_malloc) real_malloc = dlsym(RTLD_NEXT, "malloc"); void * p = real_malloc(size); printf("malloc(%d) = %p\n",size, p ); printf("%s\n", "returning from shared malloc"); return p; } void free(void* ap ) { static void (*real_free)(void*) =

2021-07-11 07:53:53    分类:技术分享    c   malloc   free   dynamic-linking   ld-preload