我希望你們能幫我理解重新定位入口和ELF部分數據是如何相關的,以及它是如何處理和生成的。ELF重新定位逆向工程
我有一個古老的不受支持的工具,它需要一個ELF文件和一個相關的PLF文件(部分鏈接的文件,在生成過程中生成),並從中構建一個自定義的可重定位文件,用於平臺(PPC)嚴格的內存限制。這工作正常,只是它包含大約我們想要在啓動後卸載的初始化代碼。因此,我們將所有init代碼放在自定義部分中以卸載它,但不幸的是,該工具無法正確處理自定義部分,並且rel文件無效。所以我的任務是製作一個新的工具,它可以正確地生成這個可定位的文件,其中包含自定義部分。
我已經用這個工具獲得了相對較遠的距離並生成了rel文件,但我目前陷入困境,試圖弄清楚如何處理段數據和構建重定位條目等。我是一名高級程序員通過這項任務完成我的元素,所有這些逆向工程業務對我來說都是新的(謝謝互聯網!)。
我找到了Elf Sharp並以此作爲出發點。它允許我加載ELF和PLF文件並與其內容進行交互。從那裏開始,我已經大部分地反向設計了重定位文件的標題和內容,但這遠沒有準確。當我將舊工具的文件版本與我的文件進行比較時,發現部分數據已經修復,而我的文件直接從PLF文件中使用了部分數據,並且很簡單。我的意思是我複製的部分數據包含大量的「48 00 00 01」,但這些都是用舊工具以某種方式修復的。這些字節的意義是什麼,以及對它們做了什麼?我也必須生成重定位條目,但我不確定如何繼續。
我發現了一些在線處理小精靈重定位的例子,我在我的工具中有類似的東西在運行,但我仍然不清楚我究竟應該做什麼。我對所有的重新定位類型和公式都有很好的資源(章節4.12.5 here),但我仍然不太確定我應該使用的偏移量,部分信息等。
TL; DR
你能幫我想象究竟是這些搬遷項目發生,它是如何產生的所有和處理,以及它是如何使用的程序執行時?
對部分數據中的所有「48 00 00 01」字都做了什麼?我假設他們已經用適當的符號解決了,但是這是如何完成的?使用.rela信息?
此外,我不確定何時應該使用PLF內容,何時使用ELF內容。我想我只需要ELF來獲取加載地址和分段信息。
當我生成重定位修正(在PPC上)時,我如何評估重定位類型方程?我在網上提到的例子在這一點上並不直觀。我對這些偏移感到困惑 - 你從Elf32_Rela那裏得到一個,但是你修改了那個?用於記錄修正結果的偏移量是多少?加數是什麼?我沒有在網上找到任何有啓發性的東西。
- 搬遷的修正的
一些(實際上大多數)指向的幾個.debug_ *部分或.bss段之一。我應該跳過.debug fixup還是那些重要的? 。bss是NoBits部分,所以我該如何處理?當談到實際生成重定位條目時,我瞭解它們是如何構建的,但是實際上在作出這些條目後是誰/什麼?我的意思是,我準備好構建它,但我不知道從哪裏開始 - 我是否在某處或某處迭代了一些數據?
我應該問但還沒有意識到的任何其他問題? ;)
感謝您閱讀我冗長的問題!
因爲我沒有足夠的代表處發佈兩個以上的鏈路,這裏有兩個例子我提到: 例1:http://publib.boulder.ibm.com/infocenter/zos/ v1r12/index.jsp?topic =%2Fcom.ibm.zos.r12.cbcdu01%2Fexrelocateelffile.htm 示例2:http://people.freebsd.org/~grehan/elf_machdep.c – thehelix
可能的[Concept of (http://stackoverflow.com/questions/16385826/concept-of-relocation)最小的反向工程示例:http://stackoverflow.com/a/30507725/895245 https://github.com/cirosantilli/assembly-cheat/blob/9f1be213107922ac21681305440dc5d1799407e5/elf-hello-world.md –