最近,我遇到了linux-inject,它是一個注入程式,可以注入一個.so檔案到一個運行中的應用程式進程中。類似於LD_PRELOAD環境變數所實現的功能,但它可以在程式運行過程中進行動態注入,而LD_PRELOAD是定義在程式運行前優先載入的動態連結程式庫。事實上,linux-inject並不取代任何功能。換句話說,可以看成是忽略了LP_PRELOAD.
它的文檔很匱乏,理由可能是開發人員認為大多數使用這個程式的使用者不會是這個領域的新手,他們應當知道該怎麼做。然而可能部分人並不是目標受眾,我當時花了很久才弄清楚需要做什麼,因此我希望這篇文章能夠協助別人。
我們首先需要複製並且構建它:
1 2 3 |
git clone https: //github .com /gaffe23/linux-inject .git cd linux-inject make |
完成後,我們就可以開始這個例子了。開啟另一個終端(這樣你有兩個可以自由使用),cd到你複製linux-inject的目錄,然後
1 |
cd ~ /workspace/linux-inject ,運行. /sample-target 。 |
回到第一個終端,運行
1 |
sudo . /inject -n sample-target sample-library.so。 |
這些都是什麼意思呢,注入sample-library.so到一個進程中,進程是通過-n name指定的sample-target。如果你需要注入到指定PID的進程,你可以使用-p PID的方式。
但這有可能無法工作,因為Linux3.4中有一個名為Yama的安全模組可以禁用 ptrace-based代碼注入(或者是在代碼注入期間有其他的攔截方式)。要想讓它在這種情況下正常工作,你需要運行這些命令之一(出於安全考慮,我更喜歡第二個):再次嘗試注入,你會在sample-target輸出的“sleeping...”中看到“I just got loaded”。
1 |
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope |