2

我正在尝试通过将其设置为在文件中写入随机字符串作为测试来修改 Linux 中 DNS 查找函数的行为。

Linux 使用一些 DNS 解析器功能,主要是gethostbyname。展望未来,我发现解析器函数在glibc6库中。所以,我下载了它,编译,生成了libresolv.solibnss_dns.so动态库。然后,我替换了系统上现有的/usr/lib/x86_64-linux-gnu/

注意:我发现这些库是通过修改gethostbyname代码并再次编译来解决查询的。然后,我看到了哪些动态库发生了变化。

通过创建一个直接使用res_query的程序(一个解析器函数)并使用-lresolv编译,它可以工作(我使用了ldd命令,它使用了我创建的解析器库)。但是,直接从代码中使用gethostbyname 、使用wget或浏览网页我无法正确使用。

我究竟做错了什么?

4

1 回答 1

2

我发现我应该做什么:

首先,调用的函数不是gethostbyname。它是_nss_dns_gethostbyname3_r,在resolv/nss_dns/dns-host.c中定义。查看源代码,我意识到这个函数调用了另一个函数来解析 DNS 名称__libc_res_nsearch,定义在resolv/res-query.c中。所以这就是功能!我在那里添加了一些文件写入命令,它就像一个魅力。我使用gethostbyname从 C 代码中调用它,使用wget和 Firefox,一切正常。当您编译代码时,您应该将系统的 libresolv.so 替换为新的。

注意:我的 glibc 版本是 2.19。

我希望这可以帮助别人。

于 2014-07-06T19:54:08.000 回答