问题标签 [function-interposition]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
code-injection - Mach 注入:在 Excel 中注入时未插入系统调用打开
我使用 osxinj 项目连接了系统调用 open、read、write、lstat 等。将其注入苹果提供的 TextEdit 应用程序中,一切正常。当我使用 textedit 打开新文件时,会调用 opencallback 并将消息记录在 system.log 文件中。
注入 Excel 并尝试使用以下代码覆盖打开的系统调用:
注入到 TextEdit 时会调用 opencallback,但注入 Microsoft Excel 时不会调用它。但是,当注入 Excel 时,为其他系统调用 read、write、lstat 在同一行上编写的代码会被插入。
关于为什么 open 在注入 Excel 时没有被插入的任何想法。
linux - 通过 soname 插入共享对象的一部分
我编写了一个共享对象,它修改了 FreeTypeFT_Load_Glyph
和FT_Render_Glyph
函数的参数,目前通过将其插入LD_PRELOAD
和dlsym
。
这很好,但我很想知道是否有办法进行这些更改:
- 给所有在给定主机上使用 FreeType 的程序(例如运行 Debian);
- 不会破坏任何实际上未链接到 FreeType 的程序;
- 无需简单地将 a
LD_PRELOAD
应用于主机上的所有程序; - 除非 FreeType 的 soname 改变,否则不需要任何维护;和
- 无需修改任何 FreeType 的文件,也无需修改主机上任何程序的文件。
我能想出的唯一两个“解决方案”是丑陋的黑客:
- 所有的
LD_PRELOAD
程序,所有的时间,似乎缓慢而脆弱;或者 - 复制例如
libfreetype.so.6.12.3
到libxxxxtype.so.6.12.3
;然后- 将 soname 修补
libxxxxtype.so.6.12.3
到libxxxxtype.so.6
; - 将插入的共享对象链接到
libxxxxtype.so.6
; 和 - 将共享对象安装为例如
libfreetype.so.6.999
。
- 将 soname 修补
我本质上想透明地修补共享对象中的几个函数,同时让其余函数通过,而不必访问共享对象的源或使用它的程序,但是如果我制作了一个假的共享对象使用 soname libfreetype.so.6
,我看不到将其链接到(或dlopen
)真实的干净方法libfreetype.so.6
。
这是我第一次对共享库进行真正的实验,所以如果这个问题做出了一些不正确的假设,或者只是没有意义,请多多包涵。
cubic-spline - 使用点创建参数方程
我有点x, y
, 和t
, 其中t=1,...,Length[x]
。我希望使用 的思想制作两个参数方程interpolation
,但不使用 Mathematica 中的方法。有什么建议吗?
android - 将代码插入现有的 apk
给定现有的 apk,是否可以插入方法调用?任意行代码呢?
理想情况下,我希望能够拦截方法调用/代码行并调用我自己的方法进行一些检查或记录,然后让原始执行继续而不改变原始行为。
如果这是可能的,有人可以为我指出一些阅读材料的正确方向吗?
谢谢
c - 共享库中的符号查找
我在下面测试过这样一个简单的程序
我的主程序是这样的:
该程序的结果是“覆盖”。
为了弄清楚为什么会发生这种情况,我使用了 gdb。调用链是这样的:
_dl_runtime_resolve -> _dl_fixup ->_dl_lookup_symbol_x
我发现_dl_lookup_symbol_x
glibc中的定义是
在加载对象的符号表中搜索符号 UNDEF_NAME 的定义,可能带有符号的请求版本
所以我认为在尝试查找符号时dispatch_write_hello
,它首先在主目标文件中查找,然后在共享库中查找。这就是这个问题的原因。我的理解对吗?非常感谢您的时间。
c++ - 使用 LD_PRELOAD 预加载读取系统调用时,Chrome 无法启动
我正在开发一个项目,该项目需要包装 libc 系统调用,特别是文件 i/o 调用,如打开、读取、写入、关闭等。我打算将其用作文件操作的监视服务。
我已经成功地包装了所有的调用,当我尝试用 gedit 打开一个文本文件时,包装器工作得很好。但是,问题是当包装器被预加载时,我无法启动谷歌浏览器和其他一些应用程序。特别是谷歌浏览器进入了一个无限的 nanosleep 循环。您可以在下面看到 strace。
调试后我发现是导致问题的读取和关闭系统调用。当我删除用于读取和关闭的包装函数时,一切正常。我可以做的一件事是禁用谷歌浏览器的包装器,但我很想知道是否有人遇到过同样的问题并找到任何解决方法或解决方案。我已经看到了其他包装器实现并尝试了它们,它遇到了同样的问题。我在这里错过了一些非常微不足道的东西吗?
这是我的 read() 包装函数:
ios - 将 DYLD_INTERPOSE 用于一个 iOS 静态库中的 C 函数是否会为捆绑包中的所有其他库插入它?
我有一个静态库目标 c,其中包含一些 C 函数,我需要根据调用者修改其行为。我查看了https://opensource.apple.com/source/dyld/dyld-210.2.3/include/mach-o/dyld-interposing.h并看到它可以用于基本上“混合”C 函数。
我的问题是 - dyld_interpose 是否还会在包含我的插入代码的所有库/框架中插入 C 函数?
例如。
Library1 - 有 C 函数
Library2 - 有插入代码。取决于图书馆1
依赖于 Library1 和 Library2 的 Library3 是否也会被插入?如果它附加到应用程序怎么办?我已经取得了一些成功,让它在一个框架上工作。
c - macOS 上的符号插入
我有一个链接到共享库的程序libfoo
。我想从我的程序内部覆盖其中一个函数,以便从libfoo
内部对该函数的内部调用libfoo
解析为我的程序中的定义。(对于上下文,我的意图是模拟库函数进行测试。)
这个问题与这个问题有点相关:共享库中的符号查找。这是该问题的示例:
这是它在 linux 上的作用:
这是我想要的行为,但在 macOS 上我得到了这个:
如何在 macOS 上实现 linux 示例的行为?最好我想要一种适用于 linux 和 macOS 的方法,但我想如果我需要使用 macOS 特定的构建标志和/或环境变量也没关系。
c - 覆盖像 fopen/ofstream 这样的全局函数
我想知道打开了什么文件以及以什么模式打开,为此我想覆盖全局函数,如 fopen/ofstream 和其他文件处理函数
必需的:
输出应该是:name.txt -w
一种解决方案是为 fopen 创建一个具有其他名称的包装器,但由于 fopen 是从各个地方调用的,所以我不想使用不同的名称
有没有办法实现上述场景?