Mengidentifikasi tipe prosesor dari kode biner mentah?

19

Tidak benar-benar terkait dengan chip, tetapi mudah-mudahan saya akan mendapatkan beberapa petunjuk untuk mengikuti dari sini.

Saya mendapat sepotong kode, tetapi saya tidak tahu untuk apa prosesor itu dimaksudkan. Apakah ada alat yang tersedia yang dapat membantu saya mengidentifikasi jenis kode? Metode statistik yang dapat membantu? distribusi byte? distribusi pasangan, dll? Markov rantai mungkin?

pesulap
sumber
7
Bisakah Anda memberi kami 200 byte pertama dalam hex mentah?
Ayah menangis
Ini pertanyaan yang menyenangkan. Perangkat apa yang Anda retas?
DavidEGrayson
1
Anda dapat mencoba memberi makan ke beberapa pembongkar yang berbeda dan melihat apa yang terjadi.
JustJeff
2
Saya akan memberi nama kode itu dalam 100 byte! = P
JustJeff
Pertanyaan bagus Mungkin lebih cocok untuk StackOverflow.
sharptooth

Jawaban:

16

Coba jalankan melalui file GNU. Jika ada header standar, itu akan mengambilnya.

Misalnya.

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
Toby Jaffey
sumber
Sudah mencobanya. File GNU mengatakan itu adalah "data".
mentalis
3
Bisakah Anda mempostingnya? Sudah mencoba mencari ASCII di dalamnya dengan "string"?
Toby Jaffey
9

Ini adalah pertanyaan yang sangat menarik. Ada jutaan set instruksi di luar sana, tapi hanya segelintir yang sangat umum digunakan.

Hal pertama yang saya lihat adalah asal dan tujuan penggunaan. Jika Anda menduga itu dirancang di Amerika Serikat, Anda akan terutama akan menargetkan prosesor dengan lembar data tersedia dalam bahasa Inggris, misalnya. Jika itu dirancang di Asia, maka ada sejumlah prosesor yang mereka gunakan untuk massa diproduksi perangkat yang insinyur AS jarang melihat. Bahkan Eropa memiliki beberapa prosesor yang lebih umum daripada yang lain.

Saya kemudian akan melihat ukuran dan fungsionalitas kode (dengan asumsi Anda tahu apa yang dilakukan kode ini sampai taraf tertentu). Jika itu beberapa megabyte kode, Anda bisa cukup diskon prosesor 8 bit yang paling tertanam dan mulai melihat perangkat yang lebih besar dengan memori eksternal. Jika beberapa kilobyte atau kurang, maka Anda ingin fokus pada perangkat yang lebih kecil dan lebih murah. Jika fungsionalitasnya sederhana, mungkin itu adalah kode untuk prosesor empat bit.

Pada titik ini, ada baiknya melihat struktur memori. Mungkin ada bagian program dan bagian data minimal. Jika ini adalah file biner (dibandingkan dengan intel hex atau catatan motorola) maka Anda hanya memiliki sedikit wawasan tentang di mana dalam memori, sejumlah data ditempatkan. Editor hex mungkin menunjukkan beberapa pola. Jika itu datang dalam format rekaman hex atau s, Anda mungkin memiliki informasi lebih lanjut tentang struktur memori prosesor yang dimaksudkan. Beberapa prosesor mengatur ulang di lokasi memori program 0, beberapa di lokasi memori tertinggi. Program mungkin menyertakan nilai awal EEPROM di lokasi memori yang terpisah. Jika ini dimaksudkan untuk prosesor yang aman (seperti yang digunakan dalam perbankan) bahkan mungkin memiliki kunci keamanan untuk lokasi memori yang aneh.

Bergantung pada bahasa yang diprogramkan, Anda mungkin memiliki beberapa petunjuk tambahan. Jika diprogram dalam C atau bahasa prosedural yang serupa, maka fungsi akan hampir selalu dimulai dengan urutan instruksi untuk menyimpan register tertentu ke stack (banyak dorongan) kemudian tepat sebelum mengembalikan banyak muncul untuk mengembalikan nilai asli dari stack . Jika Anda dapat melakukan pengenalan pola, Anda akan menemukan banyak dari rangkaian ini di seluruh, dan mungkin dapat menentukan instruksi mana yang paling mungkin instruksi push / pop, kembali, dll, yang dapat mempersempit pilihan Anda sedikit.

Jika itu adalah perangkat yang tertanam dengan interupsi, itu mungkin memiliki tabel vektor interupsi, yang akan terlihat seperti sekelompok lompatan ke lokasi memori yang berbeda semua dalam satu blok besar, mungkin di lokasi yang nyaman (alamat 0x ??? 0 misalnya) . Tabel lompat digunakan di tempat lain untuk hal-hal lain juga, tetapi jika Anda dapat menemukan urutan instruksi yang terlihat sama kecuali untuk apa alamat untuk melompat, Anda mungkin dapat menyimpulkan seperti apa instruksi lompatan itu, dan lagi-lagi mempersempit pilihan Anda ke bawah.

Pada titik itu, saya akan mulai dengan arsitektur prosesor yang paling umum dan melihat apakah ada yang berkorelasi. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502, dll, dll, dll. Ada daftar prosesor dan set instruksi umum - setidaknya di dunia berbahasa Inggris - yang mungkin terbukti membantu.

Saya tidak mengetahui adanya alat otomatis yang akan membantu dengan ini, tapi MAME mengemulasi besar banyak arsitektur prosesor, dan salah satu metode yang mungkin adalah dengan menjalankan kode melalui sejumlah prosesor dan menonton register untuk melihat apakah klik sesuatu sesuai dengan apa yang Anda tahu tentang desain.

Adam Davis
sumber
"Bahkan Eropa memiliki beberapa prosesor yang lebih umum daripada yang lain." Tinggal di Eropa, ini tidak pernah terpikir olehku. Bisakah Anda memberi contoh?
stevenvh
@stevenvh Karena perusahaan Acorn dan Sinclair, sistem tertanam berbasis 6502 dan Z80 sangat populer. Dan, tentu saja, prosesor ARM dimulai di Acorn Computers.
Adam Davis
5

Ide: apakah Anda tahu usia kode sumber, yaitu, sekitar jam berapa / tahun itu dibuat?

Jika sudah cukup umur, itu mungkin memberi Anda petunjuk untuk prosesor mana itu ditulis. Anda bisa mengambil usia / tahun itu ditulis dan menentukan apa prosesor (s) adalah sekitar populer periode waktu itu, dan mencoba pemuatan / mengeksekusi file hex pada mereka.

Dipikir-pikir, mengingat perkembangan massa prosesor hanya dalam 20 tahun terakhir, mungkin ini teknik jarum-in-a-tumpukan jerami dan tidak sangat bermanfaat.

J. Polfer
sumber
4

Beberapa bulan yang lalu, ketika tidak ada banyak inti prosesor yang berbeda di sekitar, saya mengidentifikasi kode Z80 beberapa kali melalui analisis frekuensi . Untuk Z80 CDadalah kode mesin untuk call subroutinedan C9adalah return from subroutine(saya tidak akan pernah lupa), dan ini sering paling kode terjadi. Ini mengharuskan Anda berkenalan dengan instruksi yang ditetapkan pada level kode mesin. Memiliki pengalaman dalam perakitan dengan tangan membantu (melakukan itu banyak, dan saya masih dapat menghitung mundur dalam hex untuk menghitung offset).

stevenvh
sumber
3

Jika file adalah untuk 12-bit atau 14-bit PIC, setiap pasangan byte akan menjadi kata 12- atau 14-bit, biasanya disimpan LSB pertama, dengan dua atau empat yang paling bit signifikan yang jelas.

supercat
sumber
1

Jika disusun dari bahasa seperti C atau Pascal, akan ada urutan standar tertentu dari biner Anda bisa mencari. Dengan C misalnya, hampir semua fungsi mulai dengan sesuatu yang menyimpan stack pointer ke "frame" atau "link" pointer. Untuk prosesor apa pun, biasanya hanya ada beberapa cara untuk melakukan ini. Jadi Anda bisa menjawab "apakah ini kode untuk prosesor X" dengan mencari biner X untuk urutan ini.

Yang mengatakan, saya memiliki beberapa keberuntungan membedakan antara 8088, 6502 dan 68000 biner hanya menggunakan histogram. Setiap prosesor yang diberikan memiliki opcode instruksi hukum tertentu, dan ini cenderung digunakan sedikit lebih sering daripada rata-rata. Dengan sepotong biner yang cukup besar, Anda dapat mulai melihat tren tertentu. Ini menjadi sulit, bagaimanapun, oleh fakta bahwa semua operan dalam sepotong biner yang diberikan cenderung tidak berkorelasi dengan tipe prosesor yang diberikan, dan ini pada dasarnya hanya membuat suara dalam data histogram Anda. Juga, bahkan dua program berbeda untuk prosesor yang sama mungkin memiliki histogram yang sangat berbeda. Namun, ini dapat memberi Anda tempat untuk memulai.

JustJeff
sumber