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: 0x80483fb
ayrış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.
strings
filtre 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.