问题标签 [library-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 投票
3 回答
5921 浏览

c - C中的内存映射文件

我正在玩 C 中的内存映射文件,想知道是否有办法用内存映射文件透明地替换 fopen 中的 FILE *。

例子:

但相反,是否有可能 FILE *fp = my_fopen(...)

我自己的函数会在磁盘上打开一个文件 mmap 它,可能会更改内容,然后传回 FILE *,除了新的 my_fopen() 和 my_fclose() 之外,程序没有看到任何不同。

这是否可以在不必重写程序中完成操作的方式的情况下完成?

0 投票
4 回答
1547 浏览

c - 使用 LD_PRELOAD 替换 Linux 系统调用时出现问题

我正在尝试编写一个允许运行二进制文件的程序,并在请求时用另一个文件替换某个文件。它是一个简单替换系统调用函数的库,与 LD_PRELOAD 一起使用。问题是它捕获打开读取(替代文件被读取),但写入总是回到实际的指定文件。还有其他我应该知道的“开放”系统调用吗?

0 投票
1 回答
1662 浏览

xlib - 插入库:XOpenDisplay

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

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

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

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

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

问候,安迪。

0 投票
2 回答
5663 浏览

c++ - LD_PRELOAD 用于 C++ 类方法

我需要插入 C++ 程序中的方法调用(该类驻留在单独的共享库中)。我以为我可以使用 LD_PRELOAD,但我不确定它是如何工作的(我只找到了 C 函数的示例):有没有办法为单个方法设置插入,而无需从插入的类实现中复制任何代码?

0 投票
4 回答
243 浏览

c++ - 查明接收到的指针是字符串、ushort 还是数组

我在 C 中插入 memcpy() 函数,因为目标应用程序使用它来连接字符串,我想找出正在创建的字符串。代码是:

该函数被成功调用,但第一个参数可以是任何参数,如果结果是字符串或数组,我只想跟踪它。我不得不问它是数组还是字符串。我知道这不能直截了当:有没有办法找出 RET 指向什么?

我在 MACOSX 下工作并与 DYLD 进行交互。

非常感谢你。

0 投票
2 回答
2389 浏览

python - 如何在 Linux 上从 Python 动态插入 C 函数(没有 LD_PRELOAD)?

我如何在运行时(否LD_PRELOAD)拦截/挂钩一个 C 函数,如fopen()Linux 上的一个 la Detours for Windows?我想从 Python 执行此操作(因此,我假设该程序已经在运行 CPython VM)并且还重新路由到 Python 代码。只需挂钩共享库函数就可以了。我也想这样做,而不必改变程序的运行方式。

一个想法是基于ptrace()或重写dlsym()在 PLT 中或在 PLT 中找到的代码,并以ctypes生成的 C 可调用函数为目标来推出我自己的工具,但我想我会先在这里问。谢谢。

0 投票
1 回答
456 浏览

c - 使用 dlsym 清理函数插入

作为 malloc 包装器,我使用这段经典的代码片段:

Valgrind 很不高兴,因为在程序结束时 dlsym 仍然分配了缓冲区。

我怎样才能释放这些资源?谢谢

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 之外的东西吗?

0 投票
1 回答
298 浏览

macos - 如何在执行之前获取新进程的 PID?

为了让我可以使用inject_and_interpose代码进行一些注入和插入,我需要在新启动的进程(典型的闭源用户应用程序)实际执行之前获取它的 PID。

To be clear, I need to do better than just "notice it quickly"--I can't be polling, or receiving some asynchronous notification that means that the process has already been executing for a few milliseconds by the time I take action.

I need to have a chance to do my injecting and interposing before a single statement executes.

I'm open to writing a background process that gets synchronously notified when a process by a particular name comes into existence. I'm also open to writing a launcher application that in turn fires up the target application.

Any solution needs to support 64-bit code, at a minimum, under 10.5 (Leopard) through 10.8 (Mountain Lion).

In case this proves to be painfully simple, I'll go ahead and admit that I'm new to OS X :) Thanks!

0 投票
1 回答
431 浏览

macos - 能否在系统范围内覆盖或插入 OS X 系统调用?

在 OS X Lion 下工作,我最近做了一些代码注入工作,以逐个进程插入系统调用。

在此过程中,我学到了很多东西,现在看来,至少出于研究目的,“简单地”插入对某些系统函数的所有调用,例如pwrite,如果这样的事情是可能的,它会更有意义。

对于每个进程对某些系统调用(例如)的每次调用,是否可以调用我的代码而不是操作系统?pwrite

如果是这样,我能知道是什么进程发出了调用吗?

编辑:以免有人认为我是恶意软件作者,因为我的问题的性质,我会解释为什么我现在在这里,问我在问什么:

我正在尝试让一个大型、复杂的闭源软件按其应有的方式工作。为什么不等待供应商修复它?两年前,他们开始指责另一个派对,而那个派对则指指点点。这种情况是荒谬的,值得在没有任何一方帮助的情况下尝试克服,因为该软件被电影和视频制作人员使用,他们每小时收取数百美元的费用,因为他们的创意和技术先进的工作,不应该浪费他们的时间与他们的工具搏斗。

到目前为止,我努力的问题是我需要使用代码注入和插入来找到问题的根源(这就是我上面所说的“研究”)。一旦我找到问题的根源,解决方案也可能是注入和插入,或者替换动态库,或者一些晦涩的低级系统调优,或者谁知道呢?我正在分析的软件非常庞大,它又利用了其他框架、库和后台任务,其中一些是 OS X 的一部分,还有一些是相关软件包的一部分。逐个组件的代码注入和插入变得有点疯狂,这就是为什么我想监视系统调用结束时发生的事情,所以我可以看到,例如,pwrite呼叫发起和呼叫的细节。

我希望这种澄清会有所帮助,并且有人可以为我指明正确的方向。谢谢!