2017-07-20 37 views
0

我想在Linux的進程的可執行對象文件(Elf)內嵌入信息(一個簡單的整數)。如何讀取裝載程序中的自定義部分?

我已經通過在文件中將二進制文件內容編寫爲二進制文件來完成該操作,然後通過使用objcopy命令複製二進制文件內容。

objcopy --add-section .customsection=binaryfile processElfFile newProcessElfFile 

這樣,裏面newProcessElfFile我有過程的完美的工作副本與包含整數值的新的部分,我可以用

readelf -e newProcessElfFile 

我也已經驗證請參見通過在Libelf庫頂部使用一些C代碼,節的值是正確的。一切正常。

現在,我想讀取包含在新節中的整數值,並在加載elf文件時執行printk。

爲了實現這一點,我需要修改加載程序代碼,這是內核方面。

現在的問題是:

  • 我不能寫它使用了libelf庫在內核中的代碼,這樣我和我的用戶端程序做我不能直接訪問的區間值。
  • 在函數load_elf_binary()中,包含在linux-VERSION/fs/binfmt_elf.c中的elf內核加載器不讀取elf段,而是訪問指向elf段的elf程序頭,而不是單個部分。

爲了解決這個問題,我想我需要鏈接我的自定義部分,以便我可以訪問它。

所以我有2個相關的問題:

  • 我可以以某種方式讀取加載程序中直接我自定義欄目?
  • 如果不是,我如何創建段鏈接到自定義部分,以便我可以使用elf文件程序頭來訪問它?

另一種可能性是將整數值作爲已存在的.rodata節的一個元素添加,但不幸的是,我不知道如何執行它並再次如何訪問內核中的該節。

回答

2

ELF標頭(Elf32_EhdrElf64_Ehdr)包含指向部分標題表(成員e_shoff,e_shentsize)的信息。結合部分字符串表索引(e_shstrndx),可以使用此信息讀取部分標題並最終找到您感興趣的數據。

+0

但請注意(與段不同)部分標題在執行時不*必須時間,並且會從完全剝離的二進制文件中丟失(這就是內核只使用段的原因)。 –

+0

謝謝,我已經使用這些信息,併成功地通過修改load_elf_binary()內核函數來讀取elf二進制文件 – AndreaB

相關問題