Seperti yang ditunjukkan oleh Oli dalam jawabannya, Anda tidak bisa mendapatkan kode sumber asli dari file yang dapat dieksekusi.
Selama kompilasi kode sumber (kompilasi dimaksudkan sebagai dalam penerimaan umum yang lebih luas, maka sebagai keseluruhan proses yang "mengubah" kode sumber menjadi executable), banyak informasi yang hilang.
Preprocessor C, untuk satu, akan melakukan hal berikut (antara lain):
- Menafsirkan, mengeksekusi dan menghapus arahan preprocessor (
#
pernyataan)
- Hapus komentar
- Hapus spasi yang tidak perlu
Di sisi lain, apa yang tidak hilang selama kompilasi kode sumber secara teknis dapat dikembalikan ke kode sumber yang secara fungsional setara.
Hal ini karena:
- Instruksi biner memiliki korrispondensi 1: 1 dengan instruksi perakitan; perakitan kode sumber rakitan hanya merupakan konversi belaka dari instruksi rakitan menjadi instruksi biner berdasarkan tabel korespondensi; instruksi biner tunggal selalu dapat diidentifikasi dan dapat dikembalikan ke instruksi assembly tunggal ;
- Instruksi perakitan tidak memiliki korrispondensi 1: 1 dengan instruksi C; kompilasi kode sumber C biasanya bukan hanya konversi belaka dari instruksi C ke instruksi perakitan berdasarkan pada tabel korrispondensi, bahkan seringkali sebaliknya; biasanya instruksi C dikonversi menjadi instruksi perakitan multipel (seringkali berbeda berdasarkan kompiler); namun, pola instruksi rakitan banyak biasanya dapat diidentifikasi dan dapat dikembalikan ke instruksi C tunggal ;
Ada alat yang disebut pengurai yang tujuannya adalah untuk mencoba mengembalikan yang dapat dieksekusi ke kode sumber yang secara fungsional setara; namun hasilnya biasanya sesuatu yang jauh dari kode sumber asli (dan biasanya juga tidak dapat dikompilasi);
Pertimbangkan program ini:
#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;
}
Dengan mengkompilasinya menjadi yang dapat dieksekusi dan mendekompilasinya menjadi kode sumber lagi, ini kurang lebih apa yang biasanya Anda dapatkan kembali (dalam kasus khusus ini saya menggunakan gcc
/ Boomerang ):
// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
printf("Literal strings will be recovered");
return 0;
}
Seperti yang diperkirakan:
- Arahan preprosesor tidak ada
- Komentar tidak ada (selain dari
// address: 0x80483fb
, yang telah ditambahkan oleh dekompiler)
- Ruang kosong yang tidak perlu hilang (selain dari baris baru dan tabulasi, yang telah ditambahkan oleh dekompiler)
Ini juga hasil yang cukup bagus; tidak jarang mendapatkan instruksi perakitan inline ke dalam kode:
asm("assembly_instruction");
__asm__("assembly_instruction");
Intinya adalah (seperti yang sudah ditunjukkan dalam jawaban lain): Anda tidak bisa mendapatkan sumber asli dari file executable *.
* Namun, tergantung pada executable dan keberuntungan Anda, Anda mungkin bisa mendapatkan sesuatu menggunakan dekompiler.
strings
program filter dapat sangat berguna dalam mengidentifikasi apa program biner tertentu atau tidak karena akan mencetak semua string teks yang tertanam lebih lama dari panjang yang ditentukan dalam sebuah file biner dan melihat pesan dalam suatu program terkadang memberi tahu Anda banyak tentang apa itu dan apa yang dilakukannya.