簡體   English   中英

無法執行管道時如何在 linux 上創建自解壓可執行文件

[英]How to create self-decompressing executables on linux when you cannot execve a pipe

我一直在研究一個小技巧來減小可執行文件的文件大小。 我知道存在可以正確執行可執行壓縮的工具,但這更多是為了我自己的享受而不是任何嚴肅的事情。

我的想法是用 gzip 壓縮可執行文件,然后將其作為數組嵌入到另一個稱為啟動器的 c 程序中。 當啟動器運行時,它會設置一個管道系統,如下所示:

parent launcher -> fork 1 of launcher -> fork 2 of launcher

fork 1 將自己變成 gzip,因此它會解壓縮父級提供給它的任何內容,並將解壓后的版本吐出到 fork 2。

這就是 hack 開始的地方。 Fork 2 嘗試執行文件“/dev/fd/n”,其中 n 是從 fork 1 到 fork 2 的管道的文件號。本質上,這意味着 fork 2 將嘗試執行執行任何二進制 gzip 吐出的內容。

但是,這不起作用(驚喜)。我嘗試跟蹤我的示例實現,並且在“/dev/fd/n”上執行 execv 的行返回 -1 EACCES(權限被拒絕)。 但是,如果我打開一個終端並運行ls -l /dev/fd/我會得到類似的信息:

lrwx------ 1 blackle users 64 Nov 10 05:14 0 -> /dev/pts/0
lrwx------ 1 blackle users 64 Nov 10 05:14 1 -> /dev/pts/0
lrwx------ 1 blackle users 64 Nov 10 05:14 2 -> /dev/pts/0
lr-x------ 1 blackle users 64 Nov 10 05:14 3 -> /proc/17138/fd

他們所有人都擁有用戶(我)的權限 +x。這意味着它應該是可執行的,不是嗎? 或者是說,它已沒有得到許可,但實際上它不能執行,因為它不是一個真正的文件,這只是一個非常奇怪的內核邊緣情況。

近 7 年后更新

隨着 linux "memfd" 的出現,現在可以在 linux 上創建不接觸文件系統的自解壓可執行文件。 見: https : //gitlab.com/PoroCYon/vondehi

只有可以執行mmap文件才能執行。 不幸的是,管道由於其順序性質和有限的緩沖區大小而無法以這種方式進行 mmapable(它可能需要再次重新讀取之前的代碼,而這些代碼現在在讀取一次后就會消失)。

您將有更多的運氣,而不是使用管道在 ramfs 中創建文件,將其映射到父級內存空間的一個區域,將未壓縮的代碼復制到 mmap 中,然后最終讓子級在ramfs,最后在父級的 ramfs 中取消鏈接文件,以便在子級退出時自動釋放它。

希望這會有所幫助,如果有什么不清楚的請評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM