gpt4 book ai didi

linux - 如何在 linux 中不使用 dlsym 进行 Hook

转载 作者:太空狗 更新时间:2023-10-29 12:20:30 32 4
gpt4 key购买 nike

我正在尝试 Hook glibc 的一些函数,如 fopen、fread 等。但是在 Hook 函数中,我必须使用与 glibc 中相同的函数。像这样:

// this is my fopen
FILE *fopen(.....)
{
fopen(....);// this is glibc fopen
}

我找到了一种使用 dlsym 来执行此操作的方法,但通过这种方式,我必须将所有 glibc 函数调用替换为包装器,其中使用 dlsym 调用 glibc 函数。我很好奇是否有另一种方法可以在不编写包装函数的情况下完成同样的工作。我试过这个:

fopen.c

....fopen(..)
{
myfopen(..);
}

myfopen.c

myfopen(..)
{
fopen(...);// glibc version
}

主.c

int main()
{
fopen(...);
}

$ gcc -c *.c
$ gcc -shared -o libmyopen.so myopen.o
$ gcc -o test main.o fopen.o libmyopen.so

在我的理解中,gcc 将按照命令行中指定的从左到右链接,因此 main.o 将在 fopen.o 中使用 fopen,fopen.o 将在 libmyfopen.so 中使用 myfopen,libmyfopen.so 将使用 fopen在 glibc 中。但是在运行时,我遇到了一个段错误,gdb 显示有一个 fopen 和 myfopen 的递归调用。我有点困惑。谁能解释为什么?

最佳答案

my understanding, gcc will link from left to right as specified in the command line, so main.o will use fopen in fopen.o, fopen.o will use myfopen in libmyfopen.so, libmyfopen.so will use fopen in glibc

您的理解不正确libmyfopen.so 中的 myfopen 将使用可用的 fopenfirst 定义。在您的设置中,该定义将来自链接到 test 程序的 fopen.o,您最终会遇到无限递归,并因堆栈耗尽而崩溃。

您可以通过运行 gdb ./test、运行直到崩溃并使用 backtrace 来观察这一点。您将看到一个无休止的 fopenmyfopen 调用序列。

the symbol fopen is not bond to that in libc when compiling

这是正确的:在 ELF 格式中,库记录它需要定义符号(在本例中为 fopen),但它不“记住"或关心哪个其他模块定义了该符号。

您可以通过运行 readelf -Wr libmyfopen.so 来查看它 | grep fopen.

That's different from windows DLL.

是的。

关于linux - 如何在 linux 中不使用 dlsym 进行 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10584757/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com