在修復節表過程中,我們需要準確定位到plt和got這樣,可以快速讓反編譯器快速識別節;
以下內容,都測試過android原生的libc、linker以及自己編譯的ndk程式,沒有測試obj;
在elf的非obj檔案中,plt位於.rel.plt的(檔案)屁股後面,緊挨著,定位.rel.plt的屁股用段表的dt_pltrelsz和dt_jmprel即可;
而got節需要遍歷.rel.dyn;
準確表達是.rel.dyn節的所有項的r_offset中(注意這個是記憶體偏移),大於.dynmanic節(記憶體)屁股的最小值(命名為got_addr);
這個got_addr就是got節的記憶體偏移;
至於上面提到的檔案和記憶體偏移,有個簡便方法就是頭個記憶體載入段中的所有位址,記憶體偏移=檔案偏移;
後面的記憶體載入段 記憶體偏移 = 檔案偏移 「加上」 上乙個載入段的段表中的 p_align
接著是關於長度問題;
got節的屁股通過段定位dt_pltgot,往後數3個int(都是0),然後遍歷到前後不一致的特徵那裡就是屁股;
plt節的屁股,通過拿oep定位.text節頭往低位址數到非零,那裡就是屁股,注意如果是用gcc編譯成可執行檔案,.text的定位要往低位址減0x0c個位元組,因為那裡是生成的入口函式的退出地;
ELF檔案中的特殊節彙總
以下內容摘抄自 elf檔案系列第三篇elf檔案靜態結構中的節 在 elf 檔案中有一些特定的節是預定義好的,其內容是指令 或者控制資訊,這些節專門為作業系統使用。在構建可執行程式時,聯結器 linker 可能需要把一些獨立的目標檔案和庫檔案連線在一起,在這個過程中,聯結器要解析各個檔案中的相互引用,...
可重定位的ELF檔案 續
可重定位的elf檔案 續 2011 04 28 10 31 d.重定位表 重定位表中的每個表項都包含了 如何修改某個目標項的資訊,一般,同乙個重定位表中的表項都是描述同乙個節區中符號的修改資訊.下面是重定位表項的資料結構 typedef struct elf32 rel elf32 rel type...
Android的ELF檔案重定位詳解,包括64位
elf檔案格式,主要基於兩種,一種是基於鏈結檢視,鏈結檢視即是基於節 section 來進行解析,一種是基於執行檢視,執行檢視即是基於段 segment 來進行解析。前一種是用於靜態分析的時候,譬如ida載入。後一種是在動態鏈結執行的時候,譬如linker載入。所以修改節資訊實際上是不影響elf正常...