2016-03-30 21 views
0

ELF'yi kolayca aynı boyutta bir değere yayabildiğini biliyorum. Ama, daha büyük bir değer için değiştirmek istersek? ELF'yi paketlemenin ve yeniden paketlemenin bir yolu var mı?Bir elf'in .rodata bölümündeki char * değerinin değiştirilmesi mümkün mü?

İkilinin belleğe eklenmesiyle ilgilenmiyorum.

+1

Yani bir dizeyi yeniden boyutlandırmak istiyor musunuz? Bu prensipte kesinlikle mümkündür, ancak derleyici/linker optimizasyonları nedeniyle diğer ham verilerle (örn. C-stili dizgiler "asdf" ve "sdf" çakışmaları) çakışabileceğinden, yeni bir değer eklemekten daha fazla şansınız olabilir. .rodata bölümüne ve eski .rodata değerine gereken tüm referansları yeni konuma değiştirme. Her iki durumda da bu kolay bir iş değildir. – jotik

cevap

2

Ancak, daha büyük bir değer için değiştirmek istersem ne olur?

Sen görünüşte bir uzun dize değil, daha büyük bir değer istiyorum.

ELF'nin paketini kaldırıp yeniden paketlemenin bir yolu var mı?

ELF hakkında sorduğunuz soruna bağlıdır. ET_REL (genellikle .o) türünde bir yeniden yüklenebilen nesne dosyanız varsa, değişiklik oldukça önemsizdir: sadece dosyanın sonuna yeni bir bölüm eklersiniz (genellikle dize içeriği .rodata bölümünde bulunur, böylece bir (daha büyük) yaparsınız bunun kopyalama ve daha sonra en .sh_offset ve .sh_size bölüm başlığı dosyasında doğru yere işaret tekabül güncelleyin. Öte yandan

, bağlantılı bir için (ET_DYN veya ET_EXEC), görev çok karışık ikili olduğunu ELF çok zorlu (neredeyse imkansız) olduğu için, çoklu işaretçilerin güncellenmesi gerekeceğinden ve bellekte yerleştirme keyfi olmadığından,

İlgili konular