Yürütülebilir bir ikili dosyadaki dizeleri ne zaman düzenleyebilirim?


11

Yürütülebilir bir ikili var; diyelim a.out. İkili dizeleri içeren görebilirsiniz

$ strings a.out
...
/usr/share/foo
....

Ben dize değiştirmeniz gerekir /usr/share/fooiçin /usr/share/bar. Dizeyi sadece ile değiştirebilir miyim sed?

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

Bu güvenli bir şey gibi görünüyor. Dizeler aynı uzunlukta olmadığında da çalışır mı?

Yanıtlar:


17

Sürümünüzün sedikili-temiz olup olmayacağını veya girdisinde gerçekten uzun satırlar olduğunu düşündüğü şeyleri boğacak mı bilmiyorum, ancak bu sorunları kısıtlamak, yerinde dizeyi düzenlemek işe yaramalıdır. Çalışıp çalışmadığını görmek için eski ve yeni sürümleri karşılaştırın cmp -l. İki dosya arasındaki sadece üç farkın bu 3 bayt olup olmadığını belirtmelidir.

Dizeleri aynı uzunlukta ise, derlenmiş bir yürütülebilir dosyada dizeleri düzenlemek gerçekten işe yarayacaktır, ancak dizelerin C'de çalışma şekli nedeniyle dizeyi kısaltıyorsanız neredeyse her zaman işe yarayacaktır. C dizelerinde NULsonlandırıcıdan sonraki her şey sayılmaz, bu yüzden NULeskisinin konumundan önce yeni bir sonlandırıcı yazarsanız, dizeyi etkili bir şekilde kısaltırsınız.

Genel olarak, bu kesmek kullanarak bir dizeyi uzatmanın bir yolu yoktur.


Dizeyi benzer bir şeyle kısaltmaya ne dersiniz sed -i 's@longstring@foo@' a.out? Bu tüm ikiliyi 7 bayt daha küçük yapacaktır, bu ikiliyi bozmaz mı?
Martin Vegter

Evet, ikiliyi bozar. Bu yüzden dizeyi tam olarak aynı uzunlukta birine çevirmelisiniz, ancak NULaçıkladığım gibi daha erken bir konumda bir sonlandırıcı ayarlayın (belki de çok kısa olsa da). Sorun, NULkomut satırında bir baytın bulunmamasıdır, bu nedenle sedprogramınızı bir dosyaya koyup ona başvurmanız gerekir -f. Öte yandan, yapılacak daha güvenli olan şey, ikili verilerle çalışmak üzere tasarlanmış bir araç kullanmaktır, bunun yerine sedmetin verileriyle çalışmak üzere tasarlanmıştır.
Celada

2
İyi cevap. sed birçok şey yapabilir, ancak genel olarak ikili editörlerin icat ettiği şey budur. Büyük bir ikili dosyada gezinirken kullanmak zor olabilir, ancak işleri bayt bayt değiştirmenize izin verir. hexeditBir ikili dosyayı incelemek veya değiştirmek zorunda kaldığımda kullanıyorum . strings -t x file | lessDüzenleyiciye geçmeden önce değiştirmek istediğiniz (yazdırılabilir) dizelerin ofsetlerini bulmak için kullanabilirsiniz .
Joe

Diyelim ki C programımda bir dizem var: "Benim adım Mr Robot" ve 'was' ile 'is' yerine koymak istiyorum, o zaman dolgu \0dikkatle yapılmalıdır, çünkü değiştirme bunu yaparsa: "Benim adım \ 0 Bay Robot "ise, dize ile işlem yaparken '\ 0' karakteri sorun yaratacaktır çünkü uzunluk istemeden azalır.
Nehal J Wani

@NehalJWani hayır, bu durumda dizenin geri kalanını bir bayt ileri kaydırmanız gerekir, böylece yeni, ekstra, sonlandırmanız NULvar olan bitişi biter NUL.
Celada
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.