2017-06-20 115 views
5

假設我在編譯過程中將一個二進制文件包含到了我的程序中,所以我將其保存在一個變量中,如 var myExec =[]byte{'s','o','m','e',' ','b','y','t','e','s'} 所以我的問題是是否有一種方法可以在我的程序中執行此二進制文件而無需將其寫回到光盤並調用exec或fork? 我在Golang寫我的應用程序,所以我正在尋找的方法是使用Go或C(使用CGO)。如何從內存執行可執行文件?

基本上,我正在尋找類似的管道bash腳本到bash的只是我不知道我在哪裏可以管一個本地可執行的字節來運行它,並寫回磁盤,然後讓OS讀一遍似乎有很多額外的工作要做

+2

你是怎麼進入一個沒有存儲在磁盤上的可執行二進制文件的情況?只是問,因爲我*認爲*可能有更好的辦法來解決原來的問題... –

+0

這只是一個假設的問題。我打算製作一個需要這種信息的應用程序,基本上我可以用我的應用程序打包一些工具,然後根據需要從我的應用程序的儀表板運行它們,而無需將它們寫入光盤,並且在完成後沒有臨時文件在光盤上的所有內存@FelixPalmen – nikoss

+0

我不認爲你應該這樣做。例如。在Linux系統上,您只需創建一個將這些工具安裝到'$(prefix)/ lib/$(package)/'或'$(prefix)/ libexec/$(package)/'的軟件包。在Windows上,他們會去你的程序目錄中的某個地方。 –

回答

1

在C和假設Linux中,您可以通過系統調用mprotect()系統調用來更改內存區域的保護,以便它可以執行(即:打開一個數據區域轉換成代碼區域)。之後,你可以通過跳入來執行該區域的內存。

+0

那只是簡單的部分。如何重新定位和加載諸如.so文件等外部組件? –

+0

添加一小段代碼可以讓我很好理解。 我從下面的手冊頁瞭解到https://ws1.sinaimg.cn/large/006tKfTcgy1fgrzfy90qtj31260qemyr.jpg 我需要傳遞地址長度和prot_exec,但仍然有問題以獲取我需要的內存地址使用不安全的指針和malloc它自己使用去afaik沒有辦法手動處理地址,讓我們假設我已經這樣做,我怎麼能夠實際執行的字節這就是挑戰如何跳轉,如你說@neroku – nikoss

+0

@MichaelWalz如果你的二進制文件是純粹編寫的,因爲它是靜態鏈接的,它所需要的只是它自己 – nikoss