有没有办法在Mac OS下将数据发送到另一个进程的标准输入?

时间:2010-08-21 01:31:17

标签: macos stdin

我想知道是否有一个API,无论多么模糊,这将允许有人在Mac OS X下将数据发送到另一个进程的stdin流。在Linux下,如果我没记错,你可以使用/proc中的文件系统访问这些流(当然,具有正确的权限)。

我不知道。 Mach端口,有人吗?

5 个答案:

答案 0 :(得分:5)

只是一个想法,但你不能制作一个管道,并在启动该过程时将该(命名)管道重定向到该过程的标准输入?

粗略地想到

mkfifo MYPIPE
Prog < MYPIPE
echo "test" > MYPIPE

答案 1 :(得分:4)

如果您在终端上运行目标进程,则可以使用writevt,其源代码为here

假设您正在运行&#34; cat&#34;终端ttys000上的命令。

在1号航站楼:

$ tty
/dev/ttys000
$ cat

在2号航站楼:

$ sudo ./writevt /dev/ttys000 'Hello!^M'

上面的^M是一个控制角色。在我的Mac上,您可以输入Ctrl-V后跟Ctrl-<enter>来输入此字符。

以下是1号航站楼的结果:

$ tty
/dev/ttys000
$ cat
Hello!
Hello!

可以使用gcc:

从writevt.c源文件编译writevt程序
$ gcc -o writevt writevt.c 

答案 2 :(得分:3)

不幸的是,我不相信你能做到这一点--MacPorts都是用户空间,你需要的操作需要(很多技巧,见下文,或者)内核合作,我认为,这不是即将出台。例如,文件描述符传递部分中的Mac OSX Internals, a System Approach表示

  

描述符是进程的本地描述符   因为它只有在有意义   获得了这个过程   描述符,通过打开文件。在   特别是,进程A无法访问   在另一个进程中打开的文件   B只需使用的值   表示该文件的描述符   乙

然后继续描述FD的发送方式。

“欺骗”部分需要您在其他进程中获取您的一些代码(在用户空间或作为内核的一部分)。

例如,您可以通过修补其可执行文件的二进制文件在userland中执行此操作 - 在其启动路径的早期找到肯定要执行的任何指令,然后将其跳转到您自己的代码,该代码将发送FD到您的观察守护进程,执行修补指令,然后跳回到其他进程的正常顺序流。

在内核级别执行此操作需要内核代码本身或内核加载以完整,未经验证的信任运行的代码(因此他们可以劫持不相关的进程文件)的类似补丁描述符表条目) - 我当然希望Mac OS X中没有这样的代码路径(因为它们的主要用途无疑是病毒,特洛伊木马和其他各种恶意软件)但是,如果有,你可以找到它们,这可能是一个比修补每个感兴趣的二进制可执行文件更通用的解决方案。

回到userland,另一个相当通用的方法可能是修补所有感兴趣的进程加载的动态加载的库,而不是修补各个进程的几个可执行文件。

答案 3 :(得分:1)

假设它是用户权限(即你想从第三方应用程序捕获信息,重定向到另一个应用程序,如Rogue Amoeba的音频应用程序或一些视频流捕获应用程序)那么我会说你要么想要查看内核扩展或输入管理器。

(另请参阅fscript anywhere,SIMBL和Application Enhancer - 所有将功能注入第三方应用程序的软件示例)。

许多用于用户驱动的代码注入的旧技术在10.6中受到限制(例如,输入管理器更难安装)。

如果您对用户输入而不是stdin感兴趣,替换输入法工具包实际上可能“足够好” - 通常,输入管理器已被用于将各种代码注入应用程序。

另一方面,如果你想在没有用户许可的情况下(即密钥记录)这样做,那么你就是黑客攻击。可能存在一系列未修补的漏洞,这些漏洞可以组合起来做你想做的事情,但无论谁知道它都可能从中赚钱。

答案 4 :(得分:0)

嗯,从技术上讲,你可以将一个线程注入目标进程,然后让它向你发送一个stdin文件描述符的副本......但你可能不应该这样做。 : - )

你真的想做什么?