簡體   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