加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

LD_PRELOAD不能拦截系统调用,而只能拦截libcalls?

发布时间:2020-12-16 10:11:41 所属栏目:百科 来源:网络整理
导读:我的代码适用于malloc,但不适用于mmap.代码如下: main.c中 #include stdio.h#include stdlib.hint main(){ int * p = (int*) malloc(sizeof(int)); printf("in main(): value p = %dn",*p); free(p);} preload.c #define _GNU_SOURCE#include time.h#inclu
我的代码适用于malloc,但不适用于mmap.代码如下:

main.c中

#include <stdio.h>
#include <stdlib.h>

int main(){
  int * p = (int*) malloc(sizeof(int));
  printf("in main(): value p = %dn",*p);
  free(p);
}

preload.c

#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:%lun",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,off_t offset){
  printf("  Hooked(preload)! mmap:start:%p,length:%lu,prot:%d,flags:%p,fd:%p,offset:%dn",start,length,prot,flags,fd,offset);
  return orig_mmap(start,offset);
}

void
_init(void)
{
  printf("Loading hack.n");
  orig_malloc = (void* (*)(size_t)) dlsym(RTLD_NEXT,"malloc");
  orig_mmap = (void* (*)(void*,size_t,int,off_t)) dlsym(RTLD_NEXT,"mmap");
}

编译它

gcc -Wall -fPIC -DPIC -c preload.c
ld -shared -o preload.so preload.o -ldl
gcc main.c

用LD_PRELOAD运行它

LD_PRELOAD=./preload.so ./a.out

用strace运行它

strace ./a.out 2>&1 | view -

LD_PRELOAD的打印输出不会挂接对mmap的调用,而只会调用malloc.同时,当使用strace运行时,打印输出会显示多次调用mmap.

这个结果令我感到困惑;假设mmap确实是由main.c调用的(我猜通过malloc),为什么preload.c不能拦截mmap?

PS:我的平台是带有Linux内核3.13的Ubuntu 14.04

PS2:通过系统调用,我的意思是libc中的系统调用包装器(不确定这是否会对问题产生影响)

解决方法

mmap是一个系统调用,malloc不是.

由于系统调用对于程序的运行至关重要,因此它们必须在ld.so实际运行之前工作,它们驻留在一个在其他所有内容之前加载的部分中;它可能是动态链接的,但该特定“虚拟”动态对象的映射是由内核本身完成的.在ld.so之前的Looong实际上开始工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读