2015-10-15 82 views
1

我們有一個程序,其中添加了名爲.proghead的部分。訪問ELF中的特定部分

我可以通過使用下面的命令讀取小精靈.proghead部分數據,

$ readelf -x .proghead elf-binary-file 

Hex dump of section '.proghead': 
    0x0058b960 00112233 00000000 00010000 00000000 .."3............ 
    0x0058b970 15200704 00000000 00016904 00000000 . ........i..... 

現在我有訪問使用C/C++程序此部分。

有人可以幫我寫C/C++代碼來讀取精靈二進制文件中的特定部分嗎?

任何幫助,高度讚賞。

+0

[如何從指令自身內部獲取程序的特定部分?(也許與自我)](http://stackoverflow.com/questions/12159595/how-to-get-a-pointer-to-an-specific-section-of-a-program-from-within-itselfma ) –

+0

你想從程序存儲器中讀取它,還是想從ELF文件中讀取它? – ysdx

回答

0

一般情況下,修改鏈接器命令文件以給出.proghead節的第一個地址的名稱。

然後,在C文件中寫一個結構來覆蓋.proghead部分的內容。

然後,將上述結構類型的C指針變量設置爲指向.proghead節。

從那時起,該指針 - >字段名將訪問的每個字段在作爲.proghead部分的結構

1

你需要的是閱讀節頭(Elf64_Shdr)找到節名稱和它的偏移。相關信息位於和sh_offset字段中。因此,您需要將與您需要的部分進行比較。在查找所需部分時,您可以獲得其偏移量(sh_offset)及其大小sh_size。現在,通過從sh_offsetsh_offset+sh_offset+sh_size讀取的循環可以輕鬆獲取數據。這在理論上是正確的,希望後續的使用命令objcopy從包的binutils鏈接Get elf sections offsetsHow to get a pointer to an specific section of a program from within itself? (Maybe with libelf)

0

可以二進制的一個部分複製到一個文本文件,你會得到所需的部分爲進一步幫助檢查的數據:

$ 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節中進行操作可能會影響程序的邏輯,如果跳轉到不存在的相對方向。