konversi yang dapat dieksekusi kembali ke kode sumber C


14

Sayangnya saya kehilangan kode sumber saya dan saya hanya memiliki file output yang dibuat dengan gcc di linux dan saya tidak memiliki akses ke pc saya sekarang. Apakah ada cara untuk mengkonversi file output ke file sumber (di c di bawah linux)?


Apa yang Anda inginkan disebut decompiler. Anda mungkin menemukan bantuan dengan jawaban ini: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf

IDA Pro dengan modul decompiler adalah satu-satunya solusi praktis yang benar-benar berfungsi dengan executable besar.
fpmurphy

@ fpmurphy1 Anda mendapatkan Hopper, yang kualitasnya sebanding dengan IDA Pro dan lisensi mana yang merupakan sebagian kecil dari harga.
Rui F Ribeiro

@ fpmurphy1 Saya belum berhasil melihat kualitas kode yang dihasilkan oleh Avast ... yang menggunakan platform Intel 32-bit lagi? Lagipula saya belum menggunakan Wintel selama beberapa dekade sekarang. lihat unix.stackexchange.com/questions/418354/... Perbedaan harga cukup signifikan namun, Hex-ray / IDA pro mulai dari 1500USD untuk lisensi pribadi hingga beberapa nilai luar biasa untuk lisensi komersial seperti 5000USD atau lebih tinggi AFAIK, Hopper adalah 100USD untuk satu pengguna, dan 130 untuk satu komputer.
Rui F Ribeiro

@RuiFRibeiro. Banyak sekali malware yang saya periksa masih 32-bit.
fpmurphy

Jawaban:


25

Jadi Anda punya sapi, tetapi Anda secara tidak sengaja mengubahnya menjadi hamburger, dan sekarang Anda ingin sapi Anda kembali.

Maaf, itu tidak berfungsi seperti itu.

Cukup kembalikan file sumber dari cadangan Anda.

Ah, Anda tidak punya cadangan. Sayangnya, alam semesta tidak memberi Anda istirahat untuk itu.

Anda dapat mendekompilasi biner. Itu tidak akan memberi Anda kode sumber Anda, tetapi itu akan memberi Anda beberapa kode sumber dengan perilaku yang sama. Anda tidak akan mendapatkan nama-nama variabel kecuali itu biner debug. Anda tidak akan mendapatkan logika yang sama persis kecuali Anda mengkompilasi tanpa optimasi. Jelas, Anda tidak akan mendapatkan komentar.

Saya telah menggunakan Boomerang untuk mendekompilasi beberapa program, dan hasilnya lebih mudah dibaca daripada kode mesin. Saya tidak tahu apakah itu alat terbaik di luar sana. Pokoknya, jangan berharap keajaiban.


1
Boomerang terlihat agak rapi; malu referensi dokumentasi gcc -O4 karena itu tidak melakukan apa-apa (di luar -O3) jika ingatanku benar. Kalimat terakhir Anda tentu saja sangat valid serta lima kalimat pertama Anda. Itu tidak berarti bahwa sisanya tidak valid karena Anda membuat poin yang sangat kuat tentang pentingnya membuat cadangan secara teratur. +1
Pryftan

6

Beberapa alat umum dalam rekayasa terbalik yang dapat dieksekusi.

  1. Perintah "file" yang mengambil path file sebagai parameter pertama sehingga Anda dapat menentukan (dalam kebanyakan kasus) jenis yang dapat dieksekusi yang Anda miliki.
  2. Disassembler yang menunjukkan dengan tepat apa yang dapat dieksekusi tetapi sulit dibaca bagi mereka yang tidak menulis kode assembly pada arsitektur spesifik itu atau memiliki pengalaman dengan disassembly.
  3. Dekompiler seperti Boomerang, Hex-ray, dan Snowman dapat memberikan beberapa keterbacaan yang lebih besar tetapi mereka tidak memulihkan nama variabel aktual atau sintaksis dari program asli dan mereka tidak 100% dapat diandalkan, terutama dalam kasus-kasus di mana insinyur yang menciptakan executable diuji dengan paket-paket ini dan mencoba mengaburkan keamanan lebih lanjut.
  4. Diagram atau tabel aliran data. Saya tahu tidak ada alat gratis untuk melakukan ini secara otomatis, tetapi skrip Python atau Bash di atas parser teks dari output perakitan (yang dapat ditulis dalam sed atau Perl) dapat membantu.
  5. Pensil dan kertas, percaya atau tidak, untuk mencatat alur dan ide.

Dalam kebanyakan kasus yang saya lihat, kode harus ditulis ulang dari awal, dikelola sebagai program bahasa assembly, atau disusun kembali dengan menerapkan kembali permintaan perubahan ke versi yang lebih lama.


1
# 1: Benar meskipun ada kesalahannya juga. # 3: Kurasa itu komersial? Saya hanya ingin tahu secara akademis (saya memiliki cadangan yang berlebihan sehingga tidak perlu untuk hal semacam itu). # 4: cflow (meskipun yang menggunakan sumber ada beberapa yang bekerja pada biner - dengan beberapa peringatan tentu saja) terlintas dalam pikiran. Ada orang lain di luar sana, tergantung pada apa yang Anda kejar. Adapun output grafis saya tidak dapat membantu di sana karena saya tidak suka atau perlu output grafis untuk hal semacam itu (saya akan merasa lebih mengganggu sebenarnya). # 5: sangat benar. Anda juga dapat menggunakan file teks di sini, tentu saja.
Pryftan

3

Apa yang ingin Anda lakukan disebut "dekompilasi". Ada banyak dekompiler di luar sana dan tidak praktis untuk membahas semuanya di sini.

Namun, sebagai pernyataan umum: Konversi dari sumber C ke kode mesin yang dapat dieksekusi hilang. Contohnya:

  • Komentar hilang secara permanen
  • Nama variabel hilang
  • Kadang-kadang loop tidak terbuka untuk kinerja
  • Fungsi dapat diatur ulang

Jarang kode dikompilasi seperti ditulis. Sebagian besar kompiler hari ini akan secara drastis mengubah kode Anda untuk mengoptimalkannya. Jadi ketika Anda mendekompilasi, kompiler hanya dapat menebak seperti apa kode sumbernya, ia tidak memiliki cara untuk mengetahui apa kode Anda , karena itu hilang. Jika dekompiler bagus, kode yang Anda dapatkan setidaknya akan dapat dikompilasi kembali menjadi executable yang setara, dan kemudian Anda dapat mulai secara perlahan refactoring agar dapat dibaca. Tetapi kemungkinan besar decompiler akan menghasilkan kode spageti yang benar-benar tidak terbaca, dan akan sangat memusingkan untuk menguraikannya. Kadang-kadang, mungkin akan menjadi kurang berhasil untuk hanya menulis ulang program dari awal.


Mengenai masalah komentar, sesuatu yang baru-baru ini saya perhatikan adalah - dan saya tidak tahu apakah ini akan memungkinkan komentar untuk dibaca oleh decompiler juga tidak saya harapkan decompiler untuk mencari hal semacam ini - ini: -C Jangan membuang komentar. Semua komentar diteruskan ke file output, kecuali komentar dalam arahan yang diproses, yang dihapus bersama dengan arahan. Ini menyoroti efek samping dan juga opsi -CC (ini untuk gcc meskipun mungkin cpp sebagai gantinya). Bukannya saya berharap itu berlaku untuk OP tapi mungkin menarik bagi beberapa orang.
Pryftan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.