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

zne*_*eak 6 macos stdin

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

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

Ale*_*lli 5

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

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

然后继续描述 FD 是如何发送的。

“诡计”部分需要你让你的一些代码在另一个进程中运行(在用户空间或作为内核的一部分)。

例如,您可以通过修补可执行文件的二进制文件在用户空间中执行此操作——在其启动路径的早期找到任何肯定会被执行的指令,并代替它跳转到您自己的代码,该代码将 FD 发送到您的监视守护进程,执行修补掉的指令,然后跳回到另一个进程的正常顺序流。

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

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


ext*_*eon 5

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

大概有点像

mkfifo MYPIPE
Prog < MYPIPE
echo "test" > MYPIPE
Run Code Online (Sandbox Code Playgroud)


Jas*_*sha 5

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

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

在 1 号航站楼:

$ tty
/dev/ttys000
$ cat
Run Code Online (Sandbox Code Playgroud)

在 2 号航站楼:

$ sudo ./writevt /dev/ttys000 'Hello!^M'
Run Code Online (Sandbox Code Playgroud)

^M上面是一个控制字符。在我的 Mac 上,您可以通过键入Ctrl-V后跟Ctrl-<enter>.

这是1号航站楼的结果:

$ tty
/dev/ttys000
$ cat
Hello!
Hello!
Run Code Online (Sandbox Code Playgroud)

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

$ gcc -o writevt writevt.c 
Run Code Online (Sandbox Code Playgroud)