Mengapa kita tidak bisa memahami konten file biner setelah dikompilasi?


11

Sejauh yang saya tahu, setiap program terdiri dari paket instruksi prosesor dengan beberapa variabel data spesifik (float, int, char ...) untuk bekerja pada register prosesor .

Jadi, hal pertama yang saya pikirkan (dahulu sekali) adalah bahwa jika Anda tahu bahwa nilai ASCII %¨#$¨#(hanya contoh acak) dapat diartikan sebagai alamat register penunjuk tumpukan (hanya mencontohkan) dari x86 prosesor Jika ini benar, setiap kali Anda menemukan nilai "tidak terbaca" ini ketika membaca konten file biner, Anda bisa mengartikan bahwa register penumpuk tumpukan digunakan untuk mengelola beberapa variabel data.

Sayangnya ini tidak terjadi. Di bawah, ada contoh konten ping.exeprogram dari Windows yang dibuka dengan notepad.exe:

Ping.exe seperti yang terlihat di MS Notepad

Ini adalah file biner dan datanya tidak bisa dipahami oleh kita manusia (bisa dipahami untuk mesin.) Tidak masuk akal bagi siapa pun bahkan jika mereka tahu kode Assembly (level terendah dari bahasa mesin.)

Jadi, jika saya sudah mengerti semuanya dengan benar, bisa seseorang menjelaskan

  1. Mengapa kode biner tidak dapat kembali ke kode Assembly sejauh ini, dalam hal yang sama?
  2. Jika seseorang dapat memahami kode assembly, mengapa biner yang dikompilasi yang dihasilkan dari kode ini "tidak dapat dibaca" lagi?

12
Anda bisa, Anda hanya perlu disassembler .
David Schwartz

Jadi saya dapat membongkar file .exe ??? Saya hanya tahu bahwa itu bekerja dengan kode yang dikelola ...
Diogo

13
Anda dapat membongkar setiap executable. Apakah Anda bisa memahami keluaran yang dibongkar itu adalah cerita lain.
David Schwartz

5
Kompilasi atau perakitan menghilangkan banyak informasi penting manusia seperti nama variabel, label cabang, dll. Dissasembly mendapatkan aliran instruksi, tetapi Anda masih harus mencari tahu.
mpez0

1
Juga kode kebingungan dapat menghalangi pembongkaran.
matematika

Jawaban:


13

Pertama, register tidak memiliki alamat. Setiap instruksi dalam bahasa assembly apa pun diterjemahkan menjadi opcode. Opcodes di x86 dapat berupa satu, dua, tiga, atau bahkan lebih banyak byte (pada beberapa prosesor lainnya "lebar tetap"). Biasanya opcode mengidentifikasi instruksi, mode pengalamatan, dan register yang terlibat. "Mode pengalamatan" menentukan apakah lebih dari opcode diperlukan oleh CPU, yaitu mode pengalamatan "segera" berarti ada data tambahan tepat setelah (atau "segera setelah") instruksi untuk instruksi tersebut - mode pengalamatan "absolut" berarti bahwa alamat memori mengikuti instruksi dan digunakan oleh instruksi itu.

Anda dapat mengetahui opcode sesuatu seperti MOV AL,SPatau serupa dan kemudian mencarinya. x86 memiliki banyak instruksi yang beroperasi pada stack pointer.

Tapi tolong, tolong berhenti menggunakan Notepad dan gunakan hex editor sebagai gantinya. Saya akan merekomendasikan HxD, meskipun ada banyak lainnya.

Dan @David Schwartz benar. Disassembler akan beralih melalui file, dan menerjemahkan opcodes kembali menjadi teks yang dapat dibaca. Apa yang ingin Anda lakukan benar-benar mungkin.

Namun, Anda perlu tahu di mana dalam file instruksi dimulai karena jika Anda mulai di alamat yang salah, beberapa data yang seharusnya menjadi "operan" ke opcodes (seperti instruksi yang mengambil alamat untuk operan atau "argumen") mungkin disalahartikan sebagai opcodes. Mengetahui hal ini membutuhkan pengetahuan tentang format yang dapat dieksekusi, yaitu untuk Windows format "Portable Executable" atau PE (dan seringkali ELF untuk sistem Linux). Saya yakin ada pembongkar yang mengerti PE, dll. Tapi saya tidak tahu apa-apa.


1
IDA adalah salah satu PE dissembler yang lebih umum. Bekerja dengan file Linux dan Mac juga. Versi 5.0 masih tersedia sebagai freeware
Scott Chamberlain

1
> jika Anda mulai dari alamat yang salah, ... mungkin disalahartikan. Itulah sebabnya semua kejadian %¨#$¨#tidak harus menjadi referensi ke stack-pointer; mungkin saja di tengah dua perintah yang berbeda : _3p%¨#dan $¨#b5F( _3p   %¨#$¨#   b5F).
Synetech

12

Jadi, jika saya sudah mengerti semuanya dengan benar

Tidak terlalu.

Ini adalah file biner dan datanya tidak bisa dipahami oleh kita manusia

Biasanya file biner tidak dapat dipahami oleh manusia dan mesin, terutama ketika tujuan dari file tersebut tidak diketahui. Perhatikan bahwa tidak semua file biner adalah file yang dapat dieksekusi. Banyak file biner adalah file data yang tidak mengandung instruksi mesin apa pun. Itulah sebabnya ekstensi file digunakan saat memberi nama file (dalam beberapa OS). . ekstensi com digunakan oleh CP / M untuk menunjukkan file yang dapat dieksekusi. . ekstensi exe ditambahkan oleh MS-DOS untuk menunjukkan format file yang dapat dieksekusi lainnya. * nixes menggunakan atribut eksekusi untuk menunjukkan file mana yang dapat dieksekusi, meskipun bisa berupa skrip dan juga kode.

Seperti yang telah disebutkan oleh orang lain, file biner, yang berisi angka, harus dilihat oleh program hex dump atau hex editor dan bukan oleh penampil teks.

ada contoh konten program ping.exe

File itu sebenarnya adalah program yang dapat dipindahkan, dan tidak semua data dalam file itu mewakili kode mesin. Ada informasi tentang program seperti perpustakaan dinamis mana yang dibutuhkan, rutin mana yang harus ditautkan, persyaratan untuk tumpukan dan memori program & data, dan titik masuk program. Operan alamat dalam file bisa berupa nilai relatif yang perlu dihitung dengan nilai absolut, atau referensi yang perlu diselesaikan.

"File program" yang mungkin Anda pikirkan disebut file gambar biner atau dump memori program. File seperti itu hanya akan berisi kode mesin dan data, dengan semua referensi alamat yang ditetapkan untuk dieksekusi.

bahkan jika mereka tahu kode Assembly (level terendah dari bahasa mesin.)

Bahasa assembly tidak sama dengan bahasa mesin . CPU tipikal (untuk mengecualikan komputer bahasa tingkat tinggi) menerima kode mesin sebagai input, satu instruksi pada satu waktu. Operan adalah register atau alamat memori numerik. Bahasa assembly adalah bahasa level yang lebih tinggi yang dapat menggunakan label simbolik untuk lokasi dan variabel instruksi, serta mengganti kode op numerik dengan mnemonik. Program bahasa assembly harus dikonversi ke bahasa mesin / kode sebelum benar-benar dapat dieksekusi (biasanya oleh utilitas yang disebut assembler, linker dan loader).

Operasi terbalik, pembongkaran, dapat dilakukan pada file program dengan beberapa keberhasilan dan kehilangan informasi simbolik. Pembongkaran dari memori dump atau file gambar program lebih banyak coba-coba, karena kode dan lokasi data perlu diidentifikasi secara manual.

BTW ada orang yang bisa membaca dan kode kode mesin (angka) Tentu saja ini jauh lebih mudah pada CPU atau mikrokontroler 8-bit daripada prosesor CISC 32-bit dengan selusin mode alamat memori.


3

Anda tidak dapat melihat penyandian file biner yang tepat dan dimaksudkan melalui Notepad. Harap tinjau ini untuk referensi di masa mendatang. Sebagian besar program pengeditan teks tidak mem-parsing format penyandian biner, dan diharapkan mem-parsing pemformatan kode karakter ASCII.

Jadi membuka file biner dalam editor teks akan menghasilkan karakter ASCII yang setara yang tidak masuk akal dengan format asli dari data biner seperti yang diuraikan oleh editor teks. Seperti disebutkan, hex editor, dan beberapa memiliki fitur biner, untuk melihat konten dalam format biner murni.

Anda salah bahwa isi file biner tidak dapat dipahami. Walaupun mereka akan sulit, dan dalam arsitektur komputer modern sangat sulit untuk membongkar sendiri dari biner ke instruksi yang benar dikenali oleh CPU untuk eksekusi (atau emulasi / virtual CPU), dll., Itu bisa dilakukan.

Bagaimana menurut Anda emulator diprogram? Pengembang perlu mengetahui opcodes untuk dapat memprogram sistem fiktif untuk mengenali dan berperilaku seperti perangkat keras yang sebenarnya dalam beberapa cara. Dokumentasi menjelaskan banyak arsitektur CPU, dan bahkan GPU memilikinya (walaupun lebih rahasia).

Hal lain yang perlu diperhatikan adalah bahwa pada level terendah, meskipun berkorelasi, "data biner" tidak benar-benar sekelompok nol dan satu, tetapi tegangan tinggi dan rendah diperkuat / dialihkan melalui sirkuit listrik seperti saat ini.

Biner biasanya 1: 1 dengan ini, jadi masuk akal untuk menggunakan sistem angka untuk itu.

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.