问题标签 [interposing]
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.
c - 在 OSX 上插入,我的函数没有被调用
所以,我在 OSX (gcc 4.2.1) 上弄乱了一些插入代码,我试图让以下工作:
当我使用 DYLD_INSERT_LIBRARIES=my.dylib 调用 ./login 时,它应该覆盖默认登录实现并使用我的自定义实现。当然,这是一个人为的例子,但这只是为了帮助我理解这一点。
我的来源:
猫 libinterposers.c
猫登录.c
最后,login.h
现在,当我使用“cat /dev/null”之类的东西执行时,它工作正常......
但是,当我使用 ./login 示例运行时
如您所见,它只是打印登录失败,我的自定义“my_login”函数从未运行......有什么想法吗?提前致谢!
delphi - 我的插入器类没有被编译的原因是什么?
我有:
我用它作为
但是插入器类覆盖的方法不会被调用,并且它们的刹车点保持在“深绿色”非活动颜色而不是“淡蓝色”活动。
我错过了什么?
java - 插入 Java 类方法(无接口)
我想在类方法之间插入以动态扩展对象。
我已经知道 java.lang.reflect.Proxy 的东西,但它太有限了,无法进行真正的插入。
从Using java.lang.reflect.Proxy to Interpose on Java Class Methods,第一个限制是:
(...) 必须通过代理类的实例调用该方法。因此,例如,嵌套方法调用不会被拦截。
最糟糕的一个:
(...) 该方法必须已在由被代理的对象实现的接口中定义。不能通过没有实现接口的类的实例来调用它。
我想在运行时扩展的对象没有实现任何接口,最糟糕的是,我需要覆盖的方法是嵌套的和私有的。
我知道这在 Python 和 C 中相当容易,上面引用的文章说这是可能的:
本系列的下一篇文章将说明一些克服这些限制的技术。
不幸的是,我找不到这篇文章。
c - 是否可以覆盖对象模块(gcc、ld、x86、objcopy)中的静态函数?
有没有办法在对象模块中覆盖具有静态范围的函数?
如果我从这样的东西开始,具有全局符号“foo”的模块是一个调用局部符号“bar”的函数,它调用局部符号“baz”
它有一个全局变量“foo”和两个局部变量“bar”和“baz”。
假设我想写一些练习 bar 和 baz 的单元测试,我可以这样做:
现在 bar 和 baz 是全局符号,可以从模块外部访问。到目前为止,一切都很好。
但是如果我想在“baz”之上插入我自己的函数,并让“bar”调用我插入的“baz”怎么办?
有没有办法做到这一点?
--wrap 选项似乎没有这样做......
从 main() 调用的 baz 被包装了,但 bar 仍然调用本地 baz 而不是包装的 baz。
有没有办法让 bar 调用包装好的 baz?
即使它需要修改目标代码以修改函数调用的地址,如果可以以自动化方式完成,那可能就足够了,但在这种情况下,它至少需要在 i386 和 x86_64 上工作。
——史蒂夫
c - 库插入/注入不适用于打开命令
我编写了一个动态库,通过环境变量 DYLD_INSERT_LIBRARIES 加载到目标应用程序中,当应用程序通过以下命令从终端执行时,dylib 工作正常:
但是当通过 open 命令执行它时:
发生此错误:
两种执行方法有什么区别?谢谢。
c++ - Safari 和 getaddrinfo 设置
我编写了一个小型动态库,它插入对 getaddrinfo 和连接的调用。我在 Firefox 和 Safari 上使用 DYLD_INSERT_LIBRARIES 插入这个库,以劫持对 www.apple.com 的请求并将它们发送到 www.microsoft.com。该代码适用于 Firefox,但是当 Safari 调用我的插入函数时,它忽略了重定向。
我想知道是否有人了解为什么 Safari 会忽略重定向,以及是否有办法(可能通过 addrinfo 标志)让 Safari 像 Firefox 一样运行。我的代码清单如下。
java - Java Interposer 中的堆栈粉碎
我正在编写一个 Java 插入器来修改与网络通信相关的系统调用。基本上,我想修改预期收件人的 IP 和端口。
该代码在我的笔记本电脑上正常工作,但在大学电脑上,它给出了堆栈粉碎错误:
相关代码(connect系统调用的插入)如下:
在这里,sock是我在共享库的“构造函数”中初始化的一个套接字。
该程序正常工作并打印Done。在最后(返回)行,它给出了堆栈粉碎错误。我不知道是什么原因造成的。
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 之外的东西吗?
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!