yürütülebilir dosyayı C kaynak koduna geri dönüştür


14

Ne yazık ki kaynak kodumu kaybettim ve ben sadece linux gcc ile yapılan çıkış dosyası var ve ben şimdi benim pc herhangi bir erişim yok. Çıkış dosyasını kaynak dosya (linux altında c) dönüştürmek için herhangi bir yolu var mı?


Ne istersen bir dekomperi denir. Bu cevapla ilgili yardım bulabilirsiniz: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf

Decompiler modüllü IDA Pro, büyük çalıştırılabilir dosyalarla çalışan tek pratik çözümdür.
fpmurphy

@ fpmurphy1 Kaliteyi IDA Pro ile karşılaştırılabilir ve hangi lisansın fiyatın bir kısmı olduğu Hopper'a sahipsiniz.
Rui F Ribeiro

@ fpmurphy1 Henüz Avast tarafından üretilen kodun kalitesini görmeyi başaramadım ... Intel 32 bit platformları artık kullanan var mı? Üstelik Wintel'i onlarca yıldır kullanmadım. bkz. unix.stackexchange.com/questions/418354/… Fiyat farkı oldukça önemlidir, ancak Hex-rays / IDA pro, kişisel bir lisans için 1500USD'den 5000USD veya AFAIK gibi ticari lisanslar için bazı fahiş değerlere başlar, Hopper 100USD'dir tek bir kullanıcı için ve 130 tek bir bilgisayar için.
Rui F Ribeiro

@RuiFRibeiro. İncelediğim bir sürü kötü amaçlı yazılım hala 32 bit.
fpmurphy

Yanıtlar:


25

Yani bir ineğin vardı, ama yanlışlıkla onu hamburgere dönüştürdün ve şimdi ineğini geri istiyorsun.

Üzgünüm, sadece bu şekilde çalışmaz.

Kaynak dosyayı yedeklemelerinizden geri yüklemeniz yeterlidir.

Ah, yedeklemen yoktu. Ne yazık ki, evren size bunun için bir mola vermiyor.

Sen edebilirsiniz koda ikili. Bu size kaynak kodunuzu vermeyecektir, ancak aynı davranışa sahip bazı kaynak kodları verecektir . Hata ayıklama ikili değilse değişken adlarını alamazsınız. Optimizasyon olmadan derlemediğiniz sürece aynı mantığı elde edemezsiniz. Açıkçası, yorum almayacaksınız.

Bazı programları koda etmek için Boomerang kullandım ve sonuç makine kodundan daha okunabilir oldu. Orada en iyi araç olup olmadığını bilmiyorum. Her neyse, mucizeler beklemeyin.


1
Boomerang oldukça düzgün görünüyor; utanç verici belgeler gcc -O4 utanç çünkü bellek bana doğru hizmet verirse (-O3 dışında) kesinlikle hiçbir şey yapmaz. Elbette son cümleniz ve ilk beş cümleniz son derece geçerlidir. Bu, düzenli olarak yedeklemenin önemi hakkında çok güçlü bir noktaya değindiğiniz için geri kalanların geçerli olmadığı anlamına gelmez. +1
Pryftan

6

Bir yürütülebilir dosyayı tersine mühendislikte birçok araç yaygındır.

  1. Dosya yolunu ilk parametre olarak alan "dosya" komutu, böylece (çoğu durumda) ne tür yürütülebilir dosyaya sahip olduğunuzu belirleyebilirsiniz.
  2. Yürütülebilir dosyanın ne yaptığını TAMAMEN gösteren ancak bu belirli mimaride montaj kodu yazmayan veya sökme deneyimi olan kişiler için okunması zor olan sökücüler.
  3. Boomerang, Hex-ray ve Snowman gibi dekompiler biraz daha okunabilirlik sağlayabilir, ancak orijinal programın gerçek değişken adlarını veya sözdizimini kurtarmazlar ve özellikle yürütülebiliri oluşturan mühendislerin test edildiği durumlarda% 100 güvenilir değildirler. bu paketler ve güvenliği daha da gizlemeye çalıştı.
  4. Veri akış diyagramları veya tabloları. Bunu otomatik olarak yapmak için ücretsiz bir araç bilmiyorum, ancak montaj çıktısının bir metin ayrıştırıcısının üstündeki bir Python veya Bash betiği (sed veya Perl'de yazılabilir) yardımcı olabilir.
  5. Kalem ve kağıt, ister inan ister inanma, akışları ve fikirleri not etmek için.

Çoğu durumda, kodun sıfırdan yeniden yazılması, bir montaj dili programı olarak tutulması veya değişiklik isteklerinin eski bir sürüme yeniden uygulanmasıyla yeniden oluşturulması gerekiyordu.


1
# 1: Arızaları olmasına rağmen doğrudur. # 3: Sanırım bunlar ticari mi? Sadece akademik olarak merak ediyorum (yedeklerim var, bu tür şeylere gerek yok). # 4: cflow (kaynağı kullanıyor olsa da, ikili üzerinde çalışan bazı şeyler var - elbette bazı uyarılarla) akla geliyor. Sonrasında ne olduğuna bağlı olarak dışarıda başkaları da var. Grafik çıktı gelince ben bu tür bir şey için grafik çıktı sevmiyorum ya da ihtiyacım var gibi yardımcı olamaz (aslında daha dikkat dağıtıcı bulurdum). # 5: Çok doğru. Elbette burada bir metin dosyası da kullanabilirsiniz.
Pryftan

3

Yapmak istediğiniz şeye "ayrıştırma" denir. Dışarıda çok sayıda decompiler var ve hepsini burada ele almak pratik değil.

Ancak, genel bir açıklama olarak: C kaynağından yürütülebilir makine koduna dönüşüm kayıptır. Örneğin:

  • Yorumlar geri döndürülemez şekilde kayboluyor
  • Değişken isimleri kayboldu
  • Bazen döngüler performans için açılır
  • İşlevler yeniden düzenlenmiş olabilir

Kodun yazılı olarak derlenmesi nadirdir. Çoğu derleyici bu gün kodunuzu optimize etmek için büyük ölçüde değiştirecektir. Böylece, derleme yaptığınızda, derleyici sadece kaynak kodun nasıl görünmesi gerektiğini tahmin edebilir , kodunuzun ne olduğunu bilmenin bir yolu yoktur , çünkü bu gitti. Decompiler iyi ise, aldığınız kod en azından eşdeğer bir yürütülebilir dosyaya derlenebilir ve daha sonra okunabilir olması için yavaşça yeniden düzenleme başlatabilirsiniz. Ancak büyük olasılıkla kod çözücü kesinlikle okunamayan spagetti kodu üretecek ve deşifre etmek büyük bir baş ağrısı olacaktır. Bazen, programı sıfırdan yeniden yazmak daha az iş olabilir .


Yorumlar konusunda son zamanlarda fark ettiğim bir şey var - ve bu yorumların bir decompiler tarafından okunmasına izin verip vermeyeceği hakkında hiçbir fikrim yok, ne de decompiler'ın bu tür şeyleri bile aramasını beklemiyorum - bu: -C Yorumları atmayın. Yönerge ile birlikte silinen işlenmiş yönergelerdeki yorumlar dışında tüm yorumlar çıktı dosyasına aktarılır. Yan etkileri ve -CC seçeneğinin vurgulamaktadır (bu, muhtemelen cpp olsa da gcc içindir). OP'ye uygulanmasını beklediğimden değil, belki bazılarına ilgi duyduğum için.
Pryftan
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.