2016-03-30 67 views
0

我知道你可以很容易地用相同大小的值修補ELF。 但是,如果我想改變它以獲得更大的價值呢?有沒有辦法解開和重新包裝ELF?是否可以在精靈的.rodata部分修改char *的值?

我不想修補內存中的二進制文件。

+1

所以你想調整一個字符串?原則上這當然是可能的,但由於編譯器/鏈接器優化,它可能與其他原始數據(例如,C風格的字符串「asdf」和「sdf」重疊)重疊,所以添加新值可能會帶來更多運氣.rodata節並將所有必需的舊的.rodata值引用更改爲新位置。無論哪種方式,這不是一件容易的事。 – jotik

回答

2

但是,如果我想改變它以獲得更大的價值呢?

你顯然想要一個更長字符串,不是一個更大的值。

有沒有辦法解開和重新包裝ELF?

取決於您詢問什麼樣的ELF。如果您有一個類型爲ET_REL(通常爲.o)的可重定位對象文件,那麼修改相當簡單:您只需在文件末尾附加一個新節(通常字符串內容位於.rodata節中,因此您可以創建一個它的副本,然後更新相應的節頭的.sh_offset.sh_size指向該文件在正確的地方。

在另一方面,對於連接的ELF二進制(ET_DYNET_EXEC),任務是如此複雜因爲很難(幾乎不可能),因爲需要更新多個指針,並且內存中的位置不是任意的。

相關問題