星期一, 8月 21, 2006

retty, Code injection..

在Jserv的這篇看到retty 這一個程式,可以重導其他program的 stdio (or stdout only ?) 到自己的這一個terminal。
因為前一陣子也有需要作重導program stdio,覺得很有趣。

看了一下retty的code,大概是用ptrace( )這個function,對他process的stack操作。
其中 inject_attach( )這一個function,利用ptrace,暫停 目標process,修改stack,將一段code放到目標process的stack中,讓target process執行這一段code。

要讓target process執行這段code,同時又要能返回原來被ptrace( )中斷的地方,所以整個stack frame也要做起來。

那一段被加入的code,是用assembly寫的,大約是用dup2這個function,複製(導向?) 原來的stdio 到準備好的pipe中。

這個動作(大概就叫做code_injection吧)做好後,就可以恢復target process的執行動作,因為stack frame 被改,ip也被改,所以會去執行injected code。把自己的stdout重導到retty準備好的pipe中。

然後... retty的mainloop就把pipe中的資料印出來到自己的stdout,

真有趣,這樣,被 retty 處理過的code,都不知道自己已經執行過dup2( )這樣的動作。

奇怪的是,這 injected code 是放在 target process的stack中,stack 的segment不是 read/write attribe ? 怎麼可以執行呢 ? 不必用上次 Jserv的這一篇,修改memory attrib嗎 ?

沒有留言:

網誌存檔