2009-10-01 55 views
3

我基本上想要做的是有另一個程序寫入數據到上如何在確定地址(gcc,linux)的可執行文件中創建「空」空間?

這個「空的空間」爲可執行文件「工作」我想追加一個簽名的應用程序,然後寫數據,尋找它後來,但這並不十分健全的權利...

現在,其他重要的事情......我知道它應該有可能通過使用類似的代碼創建一個代碼洞穴:

void function(void) { 
__asm { 
nop 
nop 
nop 
nop 
}; 
} 

然後,即使這實際上是相同的(除了它將在.data部分,因此不可執行) ):

const char data[3]; 

問題在於另一個應用程序將沒有確定的地址寫入。

回答

7

至少對於PE和ELF,您可以將數據附加到可執行文件的末尾而不會影響程序。

一種標準的方法是將數據追加到可執行文件,然後附加一個數字,指出已添加了多少個字節。然後可執行文件將自行打開以供讀取,查看指示數據長度的最後N個字節,然後將該值向後移動到所附數據的開頭。

This article詳細介紹瞭如何使用上述方法制作自解壓縮可執行文件。這與您想要的有點不同,但讀取可執行文件中包含的數據的原理仍然相同。

+0

謝謝......我從來沒有想過這樣做的事情...... – aviraldg

+0

這就是它在* most *非編譯程序中完成的,它根據您輸入的數據生成獨特的可執行文件 - 大多數自解壓縮程序,我想也是'py2exe'。 –

3

使用ld鏈接器腳本創建一個新節,並在文件映像中保留實際空間。您還需要將符號與新數據部分相關聯。也許這將創建一個簡短彙編文件代替,這樣會更容易:

.section .myresource 
.align 4 
.globl myres 
myres: 
.fill 1048576 

然後在你的C代碼,你會用符號來獲得數據,就像這樣:

extern const int* myres; 

檢查出binutils文檔在這裏: http://sourceware.org/binutils/docs-2.19/

+0

您如何建議其他應用程序能夠獲得偏移量? – aviraldg

+0

它可以通過使用中的結構來讀取自定義部分 – 2009-10-01 17:13:48

0

你可以做你所要求的使用linker scripts

基本上,function_name =地址在腳本中。

相關問題