问题标签 [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.

0 投票
4 回答
4576 浏览

c - Function interposition in Linux without dlsym

I'm currently working on a project where I need to track the usage of several system calls and low-level functions like mmap, brk, sbrk. So far, I've been doing this using function interposition: I write a wrapper function with the same name as the function I'm replacing (mmap for example), and I load it in a program by setting the LD_PRELOAD environment variable. I call the real function through a pointer that I load with dlsym.

Unfortunately, one of the functions I want to wrap, sbrk, is used internally by dlsym, so the program crashes when I try to load the symbol. sbrk is not a system call in Linux, so I can't simply use syscall to call it indirectly.

So my question is, how can I call a library function from a wrapper function of the same name without using dlsym? Is there any compiler trick (using gcc) that lets me refer to the original function?

0 投票
1 回答
1662 浏览

xlib - 插入库:XOpenDisplay

我正在开发一个项目,我需要更改 X11/Xlib.h 中定义的 XOpenDisplay 函数的行为。

我找到了一个示例,它应该完全符合我的要求,但是当我编译它时,我收到以下错误消息:

XOpenDisplay_interpose.c:14:错误:»XOpenDisplay« /usr/include/X11/Xlib.h:1507 的类型冲突:错误:»XOpenDisplay« 的先前声明在这里

谁能帮我解决这个问题?我错过了什么?

到目前为止我的程序代码 - 基于上面提到的示例:

问候,安迪。

0 投票
1 回答
324 浏览

c - 检查点和重新启动 X11 应用程序

我想检查点并重新启动 X11 应用程序。我正在使用 BLCR(伯克利实验室检查点/重启 (BLCR))工具。

BLCR 无法(未经修改)重新启动与 X-Server 的连接。我使用了一个插入库将所有 Xlib 函数调用及其参数记录到一个文本文件中。

现在我希望能够重新使用这个记录的函数调用。有没有比将它们保存到文本文件并在重启过程中解析/解释它们更好的方法?

被检查点的应用程序应该重做记录的调用,但这似乎不像最初听起来那么容易。

0 投票
1 回答
409 浏览

macos - [macosx] dlopen 调用 open 和 read 函数吗?

我已经在 MacOS X 和其他一些函数下截获(插入)dlopen 函数。我在日志中看到我的应用程序如何调用 dlopen,但在动态库被 dlopen 后没有找到任何与打开/读取函数相关的内容。系统如何访问和读取动态库文件?我查看了 dyld 的源代码,它确实在 dlopen 上调用了 open/read。谁能让我知道我错过了什么?拦截函数:dlopen、open、read、write、access、所有stat函数、close等。

谢谢,非常感谢任何帮助。

0 投票
6 回答
1174 浏览

c - 如何捕捉无意的函数插入?

阅读我的《Expert C Programming 》一书,我遇到了关于函数插入的章节,以及如果无意中这样做会导致一些严重的难以发现的错误。

书中给出的例子如下:

my_source.c

根据这本书,发生的事情main()mktemp()(一个标准的 C 库函数)被my_source.c中的实现插入。尽管main()调用我的实现mktemp()是预期行为,但getwd()(另一个 C 库函数)调用我的实现mktemp()不是。

显然,这个例子是存在于 SunOS 4.0.3 版本的lpr. 这本书继续解释解决方法是将关键字添加到my_source.cstatic的定义mktemp()中;尽管完全更改名称也应该可以解决此问题。

这一章给我留下了一些悬而未决的问题,希望你们能回答:

  1. GCC 有办法警告函数插入吗?我们当然不打算发生这种情况,如果发生这种情况,我想知道。
  2. 我们的软件组是否应该采取将关键字static放在我们不想暴露的所有功能前面的做法?
  3. 静态库引入的函数可以进行插入吗?

谢谢您的帮助。

编辑

我应该注意,我的问题不仅旨在插入标准 C 库函数,还包括其他库中包含的函数,也许是第 3 方,也许是内部创建的函数。本质上,我想捕获任何插入实例,而不管插入函数位于何处。

0 投票
3 回答
4799 浏览

python - 为什么 LD_PRELOAD 不能与 Python 一起使用?

在最初的几次调用之后,对 Python使用函数插入open()似乎不起作用。我怀疑 Python 正在进行某种初始化,或者某些东西暂时绕过了我的函数。

这里的open调用显然是被钩住了:

这里它在 Python 初始化期间发生一次:

在这里它根本不会发生,并且没有错误表明文件句柄已删除写权限:

代码这里。_ 用make -f Makefile.interpose_python.

这里给出了一个完整的解决方案。

0 投票
3 回答
264 浏览

java - 如何插入 Long/String compareTo()?

我有一个实现存储 Comparable 对象的数据结构的类。一些实例包含 Long 和其他字符串。

我想统计发生的比较次数,而无需过多地更改数据结构类或应用程序。

一个自然的想法是实现一个新类(比如 MyLong),它的 compareTo() 增加一些统计计数器,然后调用真正的 compareTo()。然后将应用程序更改为存储 MyLongs 而不是 Longs 等。这不起作用,因为我不能从 Long 或 String 继承。

可以使这种方法起作用吗?有没有其他方法可以实现这个目标?

0 投票
3 回答
1364 浏览

linux - 捕获显示/监视器图像,在 Linux 上发送键盘输入

我需要处理发送到笔记本电脑视频显示器的图像,并且需要使用 C++ 或 shell 程序将键盘输入发送到我的 Linux 系统。

我的目标是处理属于 FPS 游戏一部分的图像,然后根据这些图像在该游戏中采取行动(因此是键盘输入)。我没有试图理解(如果可能的话)如何使用一些 API 与游戏 X 或 Y 交互,而是认为这是与任何游戏交互的最快方式,以某种方式劫持 Linux 输入和输出。

有没有任何方法可以在没有任何内核或设备驱动程序黑客攻击的情况下做到这一点?我之前使用 recordmydesktop 将我的桌面录制为视频,我想我可以破解它的代码并尝试从中进行逆向工程。还有其他想法吗?我在 Ubuntu 11 上。

相关问题

0 投票
1 回答
845 浏览

windows - 钩子静态链接的“malloc”函数族

我正在使用Detours挂钩任何目标 .exe 的 malloc/free,而无需访问其源代码。

我已成功挂钩从.exe 动态链接的 malloc/free。

我想知道是否可以使用 Detours 来挂钩静态链接的 malloc/free。

我知道这可能更困难,因为 malloc/free 代码已经在 .exe 中,甚至很难找到它们。“malloc”可能会变成“0x804f400”之类的东西。但我想可能存在一些其他技术可以在 .exe 中定位 malloc/free 函数。

有人试过吗?还是根本不可行?

0 投票
1 回答
1195 浏览

macos - 插入 OS X 系统调用

我需要插入(调用我的函数而不是原始函数)一些 OS X 系统调用来克服一个闭源软件中的缺陷。

最好,得到的解决方案可以在 10.5(Leopard)和更新版本下工作,但如果论点足够强,我可能需要 10.6(Snow Leopard)。

最好是生成的解决方案是一个可执行文件,但我可能会选择一个脚本。

最好,即使在目标应用程序运行之后,所得到的解决方案也能够插入(“窃取向量”) ,但我可以接受一种必须在应用程序加载时注入自身的技术。

最好用 C 或 C++ 开发最终的解决方案,但我可以满足于 Objective-C 或其他东西。

到目前为止,我已经尝试过:

1) DTrace脚本,它教会了我很多东西,但是 D 语言的局限性(有限的流量控制等)使它成为我正在做的事情的主要痛苦,更不用说结果将是一个脚本,这不像我所追求的那样整洁和独立。

2) DYLD_INSERT_LIBRARIES插入,这在很多方面都很巧妙,但可能是由于命名空间扁平化(我不会假装深入理解这意味着什么),它可以很好地处理更简单的可执行文件,但是即使我构建了目标应用程序也会让我的目标应用程序窒息一个什么都不做的库,实际上不插入任何调用。

我最新的想法是尝试mach_star ( https://github.com/rentzsch/mach_star ),但我先在这里停下来,询问 Stack Overflow 社区,它总是比我知道的更多......

...接下来我应该看看除了 mach_star 之外的东西吗?