首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不使用LD_PRELOAD替换符号

不使用LD_PRELOAD替换符号
EN

Stack Overflow用户
提问于 2015-02-23 22:24:10
回答 1查看 1K关注 0票数 3

是否可以在运行时对系统调用设置钩子?在便携的方式,没有asm,也许是一些动态链接功能?我想拦截第三方图书馆的系统呼叫。不想使用LD_PRELOAD,它需要外部包装-启动程序脚本设置env。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 23:59:13

您可以通过重新定义函数来重写库调用:

代码语言:javascript
运行
复制
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

void abort(void)
{
  // If necessary, get a instance to the "real" function:
  void (*real_abort)(void) = dlsym(RTLD_NEXT, "abort");
  if (!real_abort) {
    fpritnf(stderr, "Could not find real abort\n");
    exit(1);
  }
  fprintf(stderr, "Calling abort\n");
  real_abort();
}

带主

代码语言:javascript
运行
复制
#include <stdlib.h>

int main(int argc, char** argv) {
  abort();
}

其结果是:

代码语言:javascript
运行
复制
$ ./a.out 
Calling abort
Aborted

如果您想在运行时对一个独立的函数执行此操作(而不编译您自己的函数版本),您可以尝试使用ELF对象(可执行对象和共享对象)的重新定位信息,并在运行时更新重新定位。

让我们编译一个简单的地狱世界,看看它的重新定位:

代码语言:javascript
运行
复制
$ LANG=C readelf -r ./a.out 

Relocation section '.rela.dyn' at offset 0x348 contains 1 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
0000006008d8  000300000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x360 contains 3 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
0000006008f8  000100000007 R_X86_64_JUMP_SLO 0000000000000000 puts + 0
000000600900  000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0
000000600908  000300000007 R_X86_64_JUMP_SLO 0000000000000000 __gmon_start__ + 0

这些是由动态链接器完成的重定位:.rela.plt的第一行告诉动态链接器它需要在0x0000006008f8puts符号设置一个puts条目。为了覆盖put函数,我们可能会发现所有共享对象中的所有puts符号,并将它们重新定位到合适的函数中。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28684681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档