linux – 通过soname插入共享对象的一部分

linux – 通过soname插入共享对象的一部分,第1张

概述我编写了一个共享对象,它修改了FreeType的FT_Load_Glyph和FT_Render_Glyph函数的参数,目前通过插入它与LD_PRELOAD和dlsym. 这很好,但我很想知道是否有办法进行这些更改: >对于在给定主机上使用FreeType的所有程序(例如运行Debian); >没有破坏任何实际上没有链接到FreeType的程序; >不简单地将LD_PRELOAD应用于主机上的所有程 我编写了一个共享对象,它修改了FreeType的FT_Load_Glyph和FT_Render_Glyph函数的参数,目前通过插入它与LD_PRELOAD和dlsym.

这很好,但我很想知道是否有办法进行这些更改:@H_404_3@

>对于在给定主机上使用FreeType的所有程序(例如运行Debian);
>没有破坏任何实际上没有链接到FreeType的程序;
>不简单地将LD_PRELOAD应用于主机上的所有程序;
>除非更改FreeType的soname,否则无需任何维护;和
>不修改FreeType的任何文件,也不修改主机上任何程序的文件.@H_404_3@

我能够提出的唯一两个“解决方案”是丑陋的黑客:@H_404_3@

>到LD_PRELOAD所有的程序,所有的时间,似乎缓慢而脆弱;要么
>复制,例如libfreetype.so.6.12.3到libxxxxtype.so.6.12.3;然后@H_404_3@

>将libxxxxtype.so.6.12.3中的soname修补为libxxxxtype.so.6;
>将插入共享对象链接到libxxxxtype.so.6;和
>安装共享对象,例如libfreetype.so.6.999.@H_404_3@

我本质上希望透明地修补共享对象中的几个函数,同时让其余的函数通过,而不必访问共享对象的源或使用它的程序,但是如果我创建一个虚假的共享对象使用soname libfreetype.so.6,我看不到一个干净的方法将它链接到(或dlopen)真正的libfreetype.so.6.@H_404_3@

这是我对共享库的第一个真正的实验,所以如果这个问题做出一些不正确的假设,或者没有意义,请耐心等待.@H_404_3@解决方法 您是否可以尝试使用uprobes动态地从某些功能中窃取控制权?

检查http://www.brendangregg.com/blog/2015-06-28/linux-ftrace-uprobe.html@H_404_3@

uprobes: user-level dynamic tracing,which was added to linux 3.5 and improved in linux 3.14. It lets you trace user-level functions; for example,the return of the readline() function from all running bash shells,with the returned string:@H_404_3@

# ./uprobe 'r:bash:readline +0($retval):string'Tracing uprobe readline (r:readline /bin/bash:0x8db60 +0($retval):string). Ctrl-C to end. bash-11886 [003] d... 19601837.001935: readline: (0x41e876 <- 0x48db60) arg1="ls -l" bash-11886 [002] d... 19601851.008409: readline: (0x41e876 <- 0x48db60) arg1="echo "hello world"" bash-11886 [002] d... 19601854.099730: readline: (0x41e876 <- 0x48db60) arg1="df -h" bash-11886 [002] d... 19601858.805740: readline: (0x41e876 <- 0x48db60) arg1="cd .." bash-11886 [003] d... 19601898.378753: readline: (0x41e876 <- 0x48db60) arg1="foo bar"^CEnding tracing...

和http://www.brendangregg.com/blog/2015-07-03/hacking-linux-usdt-ftrace.html@H_404_3@

还有其他跟踪用户空间函数的解决方案,如ftrace,systemtap,dtrace,lttng.其中一些需要重新编译并在程序中静态定义跟踪点;和uprobes是“用户级动态跟踪”.@H_404_3@

一些关于衣服的链接:@H_404_3@

> https://events.linuxfoundation.org/slides/lfcs2010_keniston.pdf Uprobes:用户空间探测器(2010)
> https://www.kernel.org/doc/Documentation/trace/uprobetracer.txt
> https://lwn.net/Articles/499190/“3.5岁的探测器”,Jonathan Corbet(2012)@H_404_3@

有衣服的处理程序有pt_regs.正如在上一个链接中所说:“Uprobes因此实现了一种机制,通过该机制,只要进程执行特定的指令位置,就可以调用内核函数.”并且它表明,探测器可以取代一些基于ptrace / gdb的解决方案;所以有可能通过改变其eip / rip(PC)寄存器来改变任何击中主动uprobe的程序的执行.@H_404_3@

您可以尝试一些其他动态检测工具,如pin或dyninst;但它们是为每个进程使用而设计的.@H_404_3@ 总结

以上是内存溢出为你收集整理的linux – 通过soname插入共享对象的一部分全部内容,希望文章能够帮你解决linux – 通过soname插入共享对象的一部分所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1032947.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存