Pertanyaan Jenis konversi kode yang digunakan dalam file yang dapat dieksekusi Linux


Saya ingin menanyakan jenis pengkodean apa yang digunakan untuk membuat file yang dapat dieksekusi linux mis. hexadecemal, biner atau apa pun. bagaimana itu diubah? Apakah ada cara untuk mendapatkan kembali kode asli dari file yang dapat dieksekusi ini?

Berikut ini 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 artinya itu?


13
2017-09-08 07:34


asal


Meskipun itu tidak akan membantu Anda mendapatkan banyak hal kembali, nilainya dicatat bahwa strings program filter bisa sangat berguna dalam mengidentifikasi apa program biner tertentu atau tidak karena akan mencetak semua string teks tertanam lebih lama dari panjang yang ditentukan dalam file biner dan melihat pesan dalam program kadang-kadang memberi tahu Anda banyak tentang apa itu adalah dan tidak. - Joe
Kemungkinan / sebagian duplikat? stackoverflow.com/questions/193896/whats-a-good-c-decompiler - arielf


Jawaban:


Ini biner. Kode sumber telah dikompilasi. Anda dapat melihatnya di editor (editor hex suka bless mungkin membuat perubahan lebih halus) tetapi Anda benar-benar perlu tahu apa yang Anda lakukan. Itu mungkin hanya bagus untuk membuat perubahan string.

Untuk apa pun yang lebih hardcore, Anda bisa mulai merekayasa balik biner ke dalamnya majelis kode. Ini sering dianggap sebagai bahasa komputer human-parsable tingkat terendah.

objdump -d helloworld | less

Tapi itu akan mencakup banyak omong kosong kompilator juga. Misalnya, jika Anda mengkompilasi yang paling sederhana helloworld.cpp dengan G ++ dan kemudian objdump itu, Anda berakhir dengan 226 baris (208 stripped) dari yuck. Anda bisa tulis "hello world" hanya dalam 15 baris perakitan, kompilasi dan objdump tapi masih berbunga 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 ... Tapi untuk menjawab pertanyaan asli Anda:

Anda tidak dapat mengubah kode yang dikompilasi kembali ke dalam asli Kode sumber.

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 sehingga membuatnya tidak dapat dipahami apa pun kecuali programmer terbaik dan paling berpengalaman.

Untuk memberi Anda gambaran tentang skala masalah, seluruh gagasan perangkat lunak reverse engineering memiliki situs Stack Exchange-nya sendiri.


29
2017-09-08 08:00



Dapatkah Anda memberi tahu saya bagaimana cara merekayasa balik dan mendapatkan kembali jumlah maksimum kode karena saya kehilangan sumbernya - Jaysheel Utekar
Lihat pengeditan terakhir saya. Tidak ada kembali ke sumber aslinya. Dengan banyak pembelajaran dan banyak waktu, Anda mungkin dapat menulis ulang sumber berdasarkan kode assembly yang dibongkar, tetapi dalam banyak kasus, itu akan lebih murah (kecuali waktu Anda tidak berharga) dan lebih mudah untuk hanya menulis ulang dari awal. - Oli♦
Cara mendapatkan kembali jumlah maksimum kode adalah mengembalikan cadangan terbaru. Itu juga, kebetulan, itu hanya cara untuk mendapatkan kembali sesuatu yang menyerupai kode sumber asli. - Michael Kjörling
Tidak setuju dengan paragraf terakhir sama sekali, hanya catatan samping: beberapa dekompiler IME membuat pekerjaan yang hebat dalam memulihkan struktur kode yang tepat (selain tentu saja dari saat Anda mengatakan komentar, pemformatan, nama simbol ...). Jika Anda tidak menulis program di tempat pertama, kode sumber yang dipulihkan mungkin masih tidak dapat dipahami, namun saya pikir itu adalah pilihan yang bagus untuk memulihkan (setidaknya sebagian) kode sumber yang hilang / kode sumber yang tidak dikenal (dengan setidaknya sebagian dari itu benar-benar dimengerti, tergantung pada kode spesifik dan apakah Anda beruntung juga) - kos
Itulah yang semua EULA di dunia perangkat lunak berpemilik mengatakan Anda tidak diperbolehkan melakukan - rekayasa balik / pembongkaran. Mereka termasuk klausa seperti ini karena itu mungkin untuk dilakukan - tetapi tentu saja tidak mudah! Namun seperti yang dikatakan @ Michael Kjörling, satu-satunya cara yang baik untuk mendapatkan kembali adalah dari beberapa tingkat cadangan untuk apa pun yang Anda pedulikan. - Joe


Saya tidak memiliki cukup poin reputasi untuk komentar jadi ini adalah jawaban:

Tidak, itu tidak mungkin untuk mengubahnya "kembali". Anda menyebutkan packer upx, apakah Anda pernah membaca manual dari upx?

Jika Anda kehilangan sumber, atau tidak memiliki akses ke kode orang lain tidak masalah di sini, itu tidak mungkin.

Eksekusi biner dihasilkan dengan kompilator, tidak percaya apa pun yang dinyatakan di situs ini, cukup baca manual dari kompilator itu. Kemudian, Anda dapat menambahkan di sini, dalam bahasa apa kode asli ditulis, kompiler yang digunakan, dan kemudian Anda mungkin mencatat sendiri bahwa langkah-langkah ini (preprocessing, kompilasi, menghubungkan, mungkin pengepakan) tidak terbalik secara keseluruhan, tetapi hanya bisa dianalisis apa yang mungkin dimaksudkan oleh penulis asli, dan ditulis.


7
2017-09-08 14:30





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 bagus dan Anda mungkin telah menghancurkannya.


3
2017-09-08 07:48





Seperti yang ditunjukkan oleh Oli dalam jawabannya, Anda tidak bisa mendapatkan kode sumber yang asli dari yang dapat dieksekusi.

Selama penyusunan kode sumber (kompilasi yang dimaksudkan seperti dalam penerimaan umum yang lebih luas, maka sebagai keseluruhan proses yang "mengubah" kode sumber menjadi dapat dieksekusi), banyak informasi hilang.

The C preprocessor, untuk satu, akan melakukan hal berikut (antara lain):

  • Menafsirkan, menjalankan, 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 diubah menjadi kode sumber yang berfungsi secara fungsional.

Hal ini karena:

  • Instruksi biner memiliki kekosongan 1: 1 dengan instruksi perakitan; merakit kode sumber perakitan hanyalah konversi dari instruksi perakitan ke instruksi biner berdasarkan pada tabel koreksi; instruksi biner tunggal selalu dapat diidentifikasi dan dapat digunakan kembali untuk instruksi perakitan tunggal;
  • petunjuk perakitan tidak memiliki kekosongan 1: 1 dengan instruksi C; kompilasi dari kode sumber C adalah biasanya tidak hanya konversi belaka dari instruksi C ke instruksi perakitan berdasarkan pada tabel koreksi, sebenarnya itu sering sebaliknya; biasanya instruksi C diubah menjadi beberapa instruksi perakitan (seringkali berbeda berdasarkan kompiler); namun, pola beberapa instruksi perakitan biasanya dapat diidentifikasi dan dapat digunakan kembali untuk instruksi C tunggal;

Ada alat yang disebut decompilers yang bertujuan untuk mencoba mengembalikan kode sumber yang dapat dieksekusi ke fungsional yang setara; Namun hasilnya biasanya sesuatu jauh dari kode sumber yang sangat asli (dan biasanya juga tidak dapat dikompensasi);

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 file yang dapat dieksekusi dan mendekompilasi menjadi kode sumber lagi, ini kurang lebih apa yang biasanya Anda dapatkan kembali (dalam kasus khusus ini saya menggunakan gcc / Bumerang):

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

Seperti yang diperkirakan:

  • Arahan preprocessor hilang
  • Komentar hilang (selain dari // address: 0x80483fb, yang telah ditambahkan oleh decompiler)
  • Ruang kosong yang tidak perlu hilang (selain dari baris baru dan tabulasi, yang telah ditambahkan oleh decompiler)

Ini juga merupakan hasil yang cukup bagus; itu tidak jarang untuk mendapatkan instruksi perakitan inline ke dalam kode:

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

Intinya adalah (seperti yang sudah disebutkan dalam jawaban lainnya): Anda tidak bisa mendapatkan sumber asli yang dapat dieksekusi*.

* Namun, tergantung pada eksekusi dan keberuntungan Anda, Anda mungkin bisa mendapatkan sesuatu menggunakan dekompiler.


3
2017-09-09 16:29





Executables biasanya biner jika Anda berbicara tentang program yang dikompilasi. Anda dapat menemukan lebih banyak informasi dengan menggunakan file path/to/executable. Anda dapat menampilkan biner yang dapat dieksekusi dalam heksadesimal dengan menggunakan mis. hexdump -C path/to/executable | less (apa pun yang baik yang akan Anda lakukan). Jika Anda ingin "mengubahnya kembali ke bentuk aslinya" Anda harus menggunakan dekompiler yang sesuai lihat pos ini, mis., meskipun itu akan memberi Anda kode yang cukup terbaca bukan asli yang dikompilasi dari. Jika bukan biner yang dikompilasi, itu akan menjadi semacam skrip yang dapat dijalankan, yang harus mudah dibaca dalam editor teks apa pun. Apa yang Anda tunjukkan kepada kami di sini mungkin adalah eksekusi yang dikompilasi. ELF berarti "Executable and Linking format" yang merupakan format biner umum pada sistem Linux / Unix. Ada kemungkinan untuk mengekstrak bagian string yang dapat dibaca dari file biner dengan menggunakan strings path/to/executable, jika ini yang Anda butuhkan.


2
2017-09-08 08:00



Saya mencoba untuk merekayasa baliknya dengan upx packer tetapi tidak berfungsi dan juga dengan postingan yang Anda sarankan. Jadi tolong beritahu saya jika ada cara lain. - Jaysheel Utekar
Sangat menyesal, tetapi saya tidak dapat memberi tahu Anda apa pun lebih dari apa yang tertulis di pos yang sangat baik dari @ Oli. - Hinz