可以二進制的一個部分複製到一個文本文件,你會得到所需的部分爲進一步幫助檢查的數據:
$ objcopy -O binary --only-section=<section> <binary> <output>
所以你的情況:
$ objcopy -O binary --only-section=.proghead elf-binary-file output.proghead
之後,你可以簡單地編寫一個C++程序,讀取二進制文件。只要您需要做的只是讀取該部分而不修改二進制文件,這種方法就可以工作。
如果您需要修改程序,您需要開始閱讀那部分的偏移爲大小字節的部分。它可以使用readelf
知道抵消部分開始和它的大小:
$ readelf --wide -S /bin/ls
There are 28 section headers, starting at offset 0x1c760:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 0000000000400238 000238 00001c 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 000254 000020 00 A 0 0 4
[ 3] .note.gnu.build-id NOTE 0000000000400274 000274 000024 00 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000400298 000298 000068 00 A 5 0 8
[ 5] .dynsym DYNSYM 0000000000400300 000300 000c18 18 A 6 1 8
[ 6] .dynstr STRTAB 0000000000400f18 000f18 000593 00 A 0 0 1
但是,請記住,直接修改二進制是好的,只要有刪除添加任何新數據或數據。添加新數據會增加一個部分,導致其他部分的數據被覆蓋並破壞部分索引。縮小節並填充填充可能沒有問題,但例如在.text節中進行操作可能會影響程序的邏輯,如果跳轉到不存在的相對方向。
[如何從指令自身內部獲取程序的特定部分?(也許與自我)](http://stackoverflow.com/questions/12159595/how-to-get-a-pointer-to-an-specific-section-of-a-program-from-within-itselfma ) –
你想從程序存儲器中讀取它,還是想從ELF文件中讀取它? – ysdx