繁体   English   中英

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

[英]Is there a way to send data to another process's standard input under Mac OS?

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

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

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

大概有点像

mkfifo MYPIPE
Prog < MYPIPE
echo "test" > MYPIPE

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

例如,假设您在终端ttys000上运行“cat”命令。

在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!

writevt程序可以使用gcc从writevt.c源文件编译:

$ gcc -o writevt writevt.c 

不幸的是,我不相信你能做到这一点--MacPorts都是用户空间,你需要的操作需要(要么是很多诡计,见下文,或者)内核合作,我认为这种合作不会即将到来。 例如, Mac OSX Internals,一个关于文件描述符传递的部分中的系统方法 ,说

描述符对于进程是本地的,因为它仅在通过打开文件获取描述符的进程中有意义。 特别是,进程A不能通过简单地使用表示B中的文件的描述符的值来访问在另一个进程B中打开的文件。

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

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

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

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

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

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

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

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

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

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

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

你真的想做什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM