Linux yürütülebilir dosyalarında kullanılan kod dönüştürme türü


13

Ben hexadecemal, ikili veya başka bir şey gibi linux yürütülebilir dosyaları yapmak için ne tür kodlama kullanıldığını sormak istiyorum. nasıl dönüştürülür? Bu yürütülebilir dosyadan orijinal kodu geri almanın herhangi bir yolu var mı?

İşte biraz kod:

ELF���������>�����%|�����@�������������������@�8��@���������������������@�������@�����7<�����7<������� ������������������f�����f���������������������� ������[�UPX!L
h�h�8����������?�E�h=��ڊ̓�N�    4���9ISloB�q�w�]ȉ.��,ς��Q䝦����#e��-�N����/�b,���d<��'��-E��6E�s�/�U���ly�V�Y2]"a��S�.�hU�|�S�J�I�2���X}
�G0�;���5d�$���.)

ne demek istiyorsun?


Her şeyi geri almanıza yardımcı olmasa da, stringsfiltre programının belirli bir ikili programın ne olduğunu belirlemede çok yararlı olabileceğini veya tüm gömülü metin dizelerini belirli bir uzunluktan daha uzun süre yazdıracağından bahsetmeye değer. İkili dosya ve bir programdaki mesajlara bakmak bazen ne olduğunu ve ne yaptığını size söyler.
Joe

Yanıtlar:


29

İkili. Kaynak kodu derlendi. Bir düzenleyicide görüntüleyebilirsiniz ( blessdaha rafine değişiklikler yapmak için onaltılık bir düzenleyici ), ancak ne yaptığınızı gerçekten bilmeniz gerekir. Büyük olasılıkla yalnızca dize değişiklikleri yapmak için iyidir.

Daha sert bir şey için, ikili kod montaj koduna ters mühendislik yapmaya başlayabilirsiniz . Bu genellikle en düşük düzeyde insan tarafından ayrıştırılabilen bilgisayar dili olarak kabul edilir.

objdump -d helloworld | less

Ama çok fazla derleyici saçmalık da içerecek. Örneğin , en basit olanıhelloworld.cpp G ++ ile derlerseniz ve sonra objdump226 satır (208 soyulmuş) yuck ile sonuçlanırsınız. Sen olabilir montaj sadece 15 hatlarında bir "Merhaba dünya" yazma , derlemek ve objdumpbunun ancak 166 satırlara hala çiçekleri (soyulmuş).

Montaj konusunda yeterince iyiyseniz, neler olduğunu anlamanız ve hatta değiştirmenize izin vermeniz için yeterli erişim sağlayabilir ... Ama orijinal sorunuzu cevaplamak için:

Derlenmiş kodu orijinal kaynak koduna geri çeviremezsiniz .

Afedersiniz. Bilgi kaybeden (yorumlar, biçimlendirme, okunabilir algoritma kavramları, vb.) Tek bir dönüşümdür, statik olarak diğer şeylerle bağlantılıdır ve genellikle en iyi ve en deneyimli programcılar dışında hiçbir şey için anlaşılmaz olacak şekilde optimize edilir.

Sorunun ölçeği hakkında bir fikir vermek için, tersine mühendislik yazılımı fikrinin kendi Stack Exchange sitesi vardır .


Bana bunu nasıl tersine çevirip nasıl maksimum kod alacağımı söyleyebilir misin coz Kaynağı kaybettim
redchief

7
Son düzenlememe bakın. Orijinal kaynağa geri dönüş yok. Çok fazla öğrenme ve çok fazla zamanla, demonte montaj koduna göre kaynağı yeniden yazabilirsiniz , ancak çoğu durumda, daha ucuz (zamanınız değersiz değilse) ve sıfırdan yeniden yazmak daha kolay olacaktır.
Oli

1
Maksimum kod miktarını geri almanın yolu, en son yedeklemeyi geri yüklemektir. Bu arada, orijinal kaynak koduna benzeyen bir şeyi güvenilir bir şekilde geri almanın tek yolu da budur .
CVn

1
Son paragrafa katılmamanız, sadece bir yan not: bazı dekompiler IME'nin tam kod yapısını restore etmede harika bir iş çıkarır (elbette söylediğiniz gibi, biçimlendirme, sembollerin adları ...). Programı ilk etapta yazmadıysanız, kurtarılan kaynak kodu hala anlaşılmaz olabilir, ancak kayıp bir kaynak kodunu / bilinmeyen bir kaynak kodunu (en azından bir kısmı ile) kurtarmak için harika bir seçenek olduğunu düşünüyorum. aslında anlaşılır, belirli koda ve şanslı olup olmadığınıza bağlı olarak)
kos

1
Tescilli yazılım dünyasındaki tüm bu EULA'ların yapmanıza izin verilmediğini söylediği şey budur - tersine mühendislik / sökme. Bunlar gibi maddeler içerir çünkü yapmak mümkündür - ama kesinlikle kolay değil! Ancak @ MichaelKjörling'in dediği gibi, şeyleri geri almanın tek iyi yolu, önem verdiğiniz her şey için birden fazla yedekleme düzeyidir.
Joe

7

Bir yorum için yeterli itibar puanım yok, bu yüzden bir cevap:

Hayır, "geri" dönüştürmek mümkün değildir. Upx paketleyicisinden bahsettiniz, upx kılavuzunu hiç okudunuz mu?

Kaynağı kaybettiyseniz veya başka birinin koduna erişiminiz yoksa burada önemli değil, bu mümkün değil.

İkili yürütülebilir bir derleyici ile üretildi, bu sitede belirtilen hiçbir şeye inanmayın, sadece tam olarak bu derleyicinin kılavuzunu okuyun. Daha sonra, buraya, orijinal kodun hangi dilde yazıldığını, hangi derleyicinin kullanıldığını ekleyebilir ve daha sonra bu adımların (önişleme, derleme, bağlama, belki paketleme) bir bütün olarak tersine çevrilmediğini, ancak yalnızca asıl yazarın amaçlamış olabileceği analiz edilip yazılabilir.



3

Oli'nin cevabında zaten belirttiği gibi, bir yürütülebilir dosyanın orijinal kaynak kodunu alamazsınız.

Bir kaynak kodunun derlenmesi sırasında (tipik bir geniş kabulünde olduğu gibi derleme, dolayısıyla bir kaynak kodunu bir çalıştırılabilir dosyaya "dönüştüren tüm süreç), birçok bilgi kaybolur.

C önişlemcisi, biri için aşağıdakileri yapacaktır (diğer şeylerin yanı sıra):

  • Önişlemci yönergelerini yorumlama, yürütme ve kaldırma ( #deyimler)
  • Yorumları kaldır
  • Gereksiz boşlukları kaldırın

Diğer yandan, kaynak kodun derlenmesi sırasında kaybedilmeyen şey, teknik olarak işlevsel olarak eşdeğer bir kaynak koduna geri döndürülebilir.

Bunun nedeni ise:

  • İkili komutlar, montaj talimatları ile 1: 1 uyumluluk gösterir; bir montaj kaynak kodunun montajı, montaj talimatlarının sadece bir corrispondencies tablosuna dayalı olarak ikili talimatlara dönüştürülmesidir; tek bir ikili komut her zaman tanımlanabilir ve tek bir montaj komutuna geri döndürülebilir ;
  • Montaj talimatları yok C talimatları ile 1 corrispondency; a 1 olması bir C kaynak kodunun derlenmesi, genellikle sadece C yönergelerinin bir eşzamanlılık tablosuna dayanan montaj yönergelerine dönüştürülmesi değildir , aslında çoğu zaman tam tersidir; genellikle bir C komutu çoklu (genellikle derleyiciye bağlı olarak farklı) montaj talimatlarına dönüştürülür; bununla birlikte, çoklu montaj talimatları kalıpları genellikle tanımlanabilir ve tek bir C komutuna geri döndürülebilir ;

Amacı, çalıştırılabilir bir dosyayı işlevsel olarak eşdeğer bir kaynak koduna döndürmeye çalışmak olan kod çözücüler olarak adlandırılan araçlar vardır; ancak sonuç genellikle orijinal kaynak kodundan (ve genellikle de uyumsuz) uzak bir şeydir ;

Bu programı düşünün:

#include <stdio.h>

#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered

/*

This comment and the comment above won't be recovered

*/

int main(int argc, char* argv[]) {
    printf(MESSAGE);
    return 0;
}

Yürütülebilir bir dosyaya derleyerek ve tekrar bir kaynak koduna dönüştürerek, bu genellikle geri aldığınız şeydir (bu özel durumda kullandığım gcc/ Boomerang ):

// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
    printf("Literal strings will be recovered");
    return 0;
}

Tahmin edildiği gibi:

  • Önişlemci yönergeleri eksik
  • Yorumlar eksik ( // address: 0x80483fbayrıştırıcı tarafından eklenen, bir yana)
  • Gereksiz boşluk eksik (kod çözücü tarafından eklenen yeni satırlar ve tablolar dışında)

Bu da oldukça iyi bir sonuçtur; koda satır içi montaj talimatları almak nadir değildir:

asm("assembly_instruction");
__asm__("assembly_instruction");

Sonuç olarak (diğer cevaplarda da belirtildiği gibi): bir yürütülebilir dosyanın orijinal kaynağını alamazsınız *.

* Ancak, yürütülebilir ve şans bağlı olarak, belki bir decompiler kullanarak bir şey elde edebilmek.


2

Eğer derlenmiş programlardan bahsediyorsanız çalıştırılabilir dosyalar genellikle ikiliktir. Düğmesini kullanarak daha fazla bilgi bulabilirsiniz file path/to/executable. İkili çalıştırılabilir dosyaları, örn. hexdump -C path/to/executable | less(Ne yaparsanız yapın) kullanarak onaltılık olarak görüntüleyebilirsiniz . "Orijinal biçimine geri dönüştürmek" istiyorsanız , bu gönderiyi görmek için uygun bir kod çözücü kullanmanız gerekir. Derlenmiş bir ikili değilse, herhangi bir metin düzenleyicisinde kolayca okunabilir olması gereken bir tür yürütülebilir komut dosyası olacaktır. Burada bize gösterdikleriniz muhtemelen derlenmiş bir çalıştırılabilir dosyadır. ELF, Linux / Unix sistemlerinde ortak bir ikili format olan "Yürütülebilir ve Bağlanan format" anlamına gelir. Orada'strings path/to/executable, eğer ihtiyacınız olan buysa.


Ben upx packer ile ters mühendislik denedim ama işe yaramadı ve ayrıca önerdiğiniz yazı ile. Lütfen başka bir yol olup olmadığını söyle.
redchief

Çok üzgünüm, ama @ Oli'nin mükemmel yazısında yazılanlardan daha fazlasını söyleyemem.
Hinz
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.