Saya ingin bertanya bahwa jenis pengkodean apa yang digunakan untuk membuat file yang dapat dieksekusi linux mis. Hexadecemal, biner atau yang lainnya. bagaimana cara dikonversi? Apakah ada cara untuk mendapatkan kembali kode asli dari file yang dapat dieksekusi ini?
Berikut sedikit kode yang saya miliki:
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�$���.)
apa maksudnya artinya?
14.04
command-line
compiling
iptables
executable
Redchief
sumber
sumber
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.Jawaban:
Ini biner. Kode sumber telah dikompilasi. Anda dapat melihatnya di editor (editor heksa seperti
bless
mungkin membuat lebih banyak perubahan yang disempurnakan) tetapi Anda benar-benar perlu tahu apa yang Anda lakukan. Sepertinya hanya bagus untuk membuat perubahan string.Untuk yang lebih hardcore, Anda bisa mulai merekayasa balik biner menjadi kode assembly . Ini sering dianggap sebagai tingkat komputer yang dapat diurai oleh manusia tingkat terendah.
Tapi itu akan mencakup banyak kompiler juga omong kosong. Misalnya, jika Anda mengkompilasi yang paling sederhana
helloworld.cpp
dengan G ++ laluobjdump
, Anda berakhir dengan 226 baris (208 dilucuti) dari yuck. Anda bisa menulis "halo dunia" hanya dalam 15 baris perakitan , kompilasi danobjdump
itu tetapi masih mekar menjadi 166 baris (dilucuti).Jika Anda cukup baik dengan perakitan, ini mungkin memberi Anda cukup akses untuk memahami apa yang terjadi, dan bahkan membiarkan Anda mengubahnya ... Tetapi untuk menjawab pertanyaan awal Anda:
Anda tidak dapat mengubah kode yang dikompilasi kembali menjadi kode sumber asli .
Maaf. Ini adalah transformasi satu arah yang kehilangan informasi (komentar, pemformatan, konsep algoritma yang dapat dibaca, dll), secara statis terkait dengan hal-hal lain dan umumnya dioptimalkan sedemikian rupa yang akan membuatnya tidak dapat dipahami oleh apa pun kecuali programmer terbaik dan paling berpengalaman.
Untuk memberi Anda gambaran tentang skala masalah, seluruh gagasan perangkat lunak rekayasa terbalik memiliki situs Stack Exchange sendiri .
sumber
Saya tidak memiliki poin reputasi yang cukup untuk komentar sehingga itu adalah jawaban:
Tidak, tidak mungkin untuk mengubahnya "kembali". Anda menyebutkan upx packer, apakah Anda pernah membaca manual upx?
Jika Anda kehilangan sumbernya, atau tidak memiliki akses ke kode orang lain, tidak masalah di sini, tidak mungkin.
Eksekusi biner diproduksi dengan kompiler, jangan percaya apa pun yang dinyatakan di situs ini, cukup baca manual kompiler itu. Kemudian, Anda dapat menambahkan di sini, dalam bahasa apa kode asli ditulis, kompiler mana yang digunakan, dan kemudian Anda dapat mencatat sendiri bahwa langkah-langkah ini (preprocessing, kompilasi, menghubungkan, mungkin pengepakan) tidak terbalik secara keseluruhan, tetapi hanya bisa dianalisis apa yang dimaksudkan oleh penulis asli, dan ditulis.
sumber
Ini mungkin file biner (File ELF) seperti yang dijelaskan dengan baik di sini:
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
Jika Anda telah mengubahnya dengan editor teks normal dan menyimpan perubahan Anda, ini bukan ide yang baik dan Anda mungkin telah menghancurkannya.
sumber
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):
#
pernyataan)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:
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:
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 ):Seperti yang diperkirakan:
// address: 0x80483fb
, yang telah ditambahkan oleh dekompiler)Ini juga hasil yang cukup bagus; tidak jarang mendapatkan instruksi perakitan inline ke dalam kode:
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.
sumber
File executable biasanya biner jika Anda berbicara tentang program yang dikompilasi. Anda dapat menemukan informasi lebih lanjut dengan menggunakan
file path/to/executable
. Anda dapat menampilkan file biner yang dapat dieksekusi dalam heksadesimal dengan menggunakan eghexdump -C path/to/executable | less
(apa pun baiknya Anda). Jika Anda ingin "mengubahnya kembali ke bentuk aslinya" Anda harus menggunakan dekompiler yang sesuai untuk melihat posting ini, misalnya , meskipun itu akan memberi Anda kode yang cukup tidak terbaca bukan yang asli dari mana ia dikompilasi. Jika bukan biner yang dikompilasi, itu akan menjadi semacam skrip yang dapat dieksekusi, yang harus mudah dibaca di editor teks apa pun. Apa yang Anda tunjukkan di sini mungkin adalah executable yang dikompilasi. ELF berarti "Format yang dapat dijalankan dan Menghubungkan" yang merupakan format biner umum pada sistem Linux / Unix. Sana'strings path/to/executable
, jika ini yang Anda butuhkan.sumber