Xác định loại bộ xử lý từ mã nhị phân thô?


19

Không thực sự liên quan đến chip, nhưng hy vọng tôi sẽ nhận được một số hướng để theo dõi từ đây.

Tôi đã nhận được một đoạn mã, nhưng tôi không biết nó dùng cho bộ xử lý nào. Có công cụ nào có thể giúp tôi xác định loại mã không? Những phương pháp thống kê có thể giúp đỡ? Phân phối byte? Phân phối cặp, v.v? Chuỗi Markov có thể?


7
Bạn có thể cho chúng tôi 200 byte đầu tiên trong hex thô không?
pingswept

Đây là một câu hỏi thú vị. Bạn đang hack loại thiết bị nào?
DavidEGrayson

1
bạn có thể thử cho nó ăn một vài thứ khác nhau và xem điều gì sẽ xảy ra.
JustJeff

2
Tôi sẽ đặt tên mã đó bằng 100 byte! = P
JustJeff

Câu hỏi tuyệt vời. Có thể phù hợp hơn với StackOverflow.
sharptooth

Câu trả lời:


16

Hãy thử chạy nó qua tệp GNU. Nếu nó có bất kỳ tiêu đề tiêu chuẩn nào, nó sẽ chọn nó.

Ví dụ.

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped

Đã thử mà. Tệp GNU cho biết đó là "dữ liệu".
nhà tâm thần học

3
Bạn có thể gửi một số của nó? Đã thử tìm kiếm ASCII trong đó bằng "chuỗi"?
Toby Jaffey

9

Đây là một câu hỏi rất thú vị. Có hàng triệu bộ hướng dẫn ngoài kia, nhưng chỉ một số ít được sử dụng rất phổ biến.

Điều đầu tiên tôi nhìn vào là nguồn gốc và mục đích sử dụng. Nếu bạn nghi ngờ nó được thiết kế ở Mỹ, thì bạn chủ yếu nhắm mục tiêu vào bộ xử lý với các bảng dữ liệu có sẵn bằng tiếng Anh. Nếu nó được thiết kế ở châu Á, thì có một số bộ xử lý họ sử dụng cho các thiết bị sản xuất hàng loạt mà các kỹ sư Mỹ hiếm khi nhìn thấy. Ngay cả châu Âu cũng có một vài bộ xử lý phổ biến hơn các bộ xử lý khác.

Sau đó, tôi sẽ xem kích thước và chức năng mã (giả sử bạn biết mã làm gì ở một mức độ nào đó). Nếu đó là một vài megabyte mã, bạn có thể giảm giá khá nhiều bộ xử lý 8 bit được nhúng và bắt đầu xem xét các thiết bị lớn hơn có bộ nhớ ngoài. Nếu đó là một vài kilobyte hoặc ít hơn, thì thay vào đó bạn muốn tập trung vào các thiết bị nhỏ hơn, rẻ hơn. Nếu chức năng đơn giản, nó thậm chí có thể là mã cho bộ xử lý bốn bit.

Tại thời điểm này, nó đáng để nhìn vào cấu trúc bộ nhớ. Có khả năng là một phần chương trình và một phần dữ liệu tối thiểu. Nếu đó là một tệp nhị phân (so với bản ghi intel hex hoặc motorola) thì bạn sẽ có một cái nhìn sâu sắc về vị trí trong bộ nhớ của một số dữ liệu nhất định. Một trình soạn thảo hex có thể hiển thị một số mẫu. Nếu nó có định dạng bản ghi hex hoặc s, bạn có thể có thêm thông tin về cấu trúc bộ nhớ của bộ xử lý. Một số bộ xử lý đặt lại ở vị trí bộ nhớ chương trình 0, một số ở vị trí bộ nhớ cao nhất. Chương trình có thể bao gồm các giá trị ban đầu EEPROM ở một vị trí bộ nhớ riêng. Nếu nó có nghĩa là một bộ xử lý an toàn (như được sử dụng trong ngân hàng) thì nó thậm chí có thể có các khóa bảo mật cho một vị trí bộ nhớ kỳ lạ.

Tùy thuộc vào ngôn ngữ được lập trình, bạn có thể có thêm một số manh mối. Nếu nó được lập trình bằng C hoặc một ngôn ngữ thủ tục tương tự, thì các hàm hầu như sẽ luôn bắt đầu bằng một chuỗi các hướng dẫn để lưu các thanh ghi nhất định vào ngăn xếp (rất nhiều lần đẩy) sau đó ngay trước khi trả lại nhiều cửa sổ bật lên để trả về giá trị ban đầu từ ngăn xếp . Nếu bạn có thể thực hiện một số nhận dạng mẫu, bạn sẽ tìm thấy nhiều chuỗi trong số này và có thể xác định hướng dẫn nào có khả năng là hướng dẫn đẩy / bật, quay lại, v.v., có thể thu hẹp lựa chọn của bạn xuống một chút.

Nếu đó là một thiết bị nhúng có ngắt, nó có thể có bảng vectơ ngắt, trông giống như một nhóm nhảy đến các vị trí bộ nhớ khác nhau trong một khối lớn, có thể là tại một vị trí thuận tiện (ví dụ địa chỉ 0x ??? 0) . Bàn nhảy cũng được sử dụng ở nơi khác cho những thứ khác, nhưng nếu bạn có thể xác định một chuỗi các lệnh giống hệt nhau ngoại trừ địa chỉ để nhảy đến, bạn có thể suy ra một lệnh nhảy trông như thế nào, và lại thu hẹp lựa chọn của bạn xuống.

Tại thời điểm đó, tôi sẽ bắt đầu với các kiến ​​trúc bộ xử lý phổ biến nhất và xem liệu có gì tương quan không. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502, v.v., v.v. Có những danh sách các bộ xử lý và bộ hướng dẫn phổ biến - ít nhất là trong thế giới nói tiếng Anh - có thể chứng minh sự hữu ích.

Tôi không biết bất kỳ công cụ tự động nào có thể giúp với điều này, nhưng MAME mô phỏng rất nhiều kiến ​​trúc bộ xử lý và một phương pháp có thể là chạy mã thông qua một số bộ xử lý và xem các thanh ghi để xem có gì nhấp theo không bạn biết về thiết kế


"Ngay cả châu Âu cũng có một vài bộ xử lý phổ biến hơn các bộ xử lý khác." Sống ở châu Âu, điều này không bao giờ xảy ra với tôi. Bạn có thể cho ví dụ?
stevenvh

@stevenvh Do các công ty Acorn và Sinclair, các hệ thống nhúng dựa trên 6502 và Z80 rất phổ biến. Và, tất nhiên, bộ xử lý ARM đã bắt đầu tại Acorn Computer.
Adam Davis

5

Ý tưởng: bạn có biết tuổi của mã nguồn, tức là khoảng thời gian / năm nó được tạo ra không?

Nếu nó đủ tuổi, nó có thể cung cấp cho bạn manh mối về việc nó được viết cho bộ xử lý nào. Bạn có thể lấy tuổi / năm được viết và xác định (các) bộ xử lý nào phổ biến trong khoảng thời gian đó và thử tải / thực thi tệp hex trên các tệp đó.

Theo suy nghĩ thứ hai, với sự phổ biến rộng rãi của các bộ xử lý chỉ trong 20 năm qua, đây có thể là một kỹ thuật kim tiêm và không hiệu quả lắm.


4

Nhiều mặt trăng trước đây, khi không có nhiều lõi xử lý khác nhau, tôi đã xác định mã Z80 một vài lần thông qua phân tích tần số . Đối với Z80 CDlà mã máy call subroutineC9return from subroutine(tôi sẽ không bao giờ quên) và đây thường là những mã xảy ra nhiều nhất. Tuy nhiên, điều này đòi hỏi bạn phải làm quen với hướng dẫn được đặt ở cấp mã máy. Có kinh nghiệm trong việc lắp ráp bằng tay giúp đỡ (đã làm điều đó rất nhiều, và tôi vẫn có thể đếm ngược trong hex để tính toán bù đắp).


3

Nếu tệp dành cho PIC 12 bit hoặc 14 bit, mỗi cặp byte sẽ là một từ 12 hoặc 14 bit, thường được lưu trữ LSB trước, với hai hoặc bốn bit quan trọng nhất.


1

Nếu nó được biên dịch từ một ngôn ngữ như C hoặc Pascal, sẽ có một số chuỗi nhị phân tiêu chuẩn nhất định mà bạn có thể tìm kiếm. Ví dụ, với C, hầu hết tất cả các hàm đều bắt đầu bằng thứ gì đó lưu con trỏ ngăn xếp vào con trỏ "khung" hoặc "liên kết". Đối với bất kỳ bộ xử lý nhất định, thường chỉ có một vài cách để làm điều này. Vì vậy, bạn có thể trả lời "là mã này cho bộ xử lý X" bằng cách tìm kiếm nhị phân của X cho các chuỗi này.

Điều đó nói rằng, tôi đã có một số may mắn khác biệt giữa 8088, 6502 và 68000 nhị phân chỉ bằng cách sử dụng biểu đồ. Bất kỳ bộ xử lý nhất định nào cũng có các opc hướng dẫn pháp lý nhất định và chúng có xu hướng được sử dụng thường xuyên hơn một chút so với mức trung bình. Với một khối nhị phân đủ lớn, bạn có thể bắt đầu thấy một số xu hướng nhất định. Tuy nhiên, điều này trở nên khó khăn bởi thực tế là tất cả các toán hạng trong một phần nhị phân nhất định có xu hướng không tương quan với loại bộ xử lý đã cho và điều này về cơ bản chỉ gây nhiễu trong dữ liệu biểu đồ của bạn. Ngoài ra, thậm chí hai chương trình khác nhau cho cùng một bộ xử lý có thể có biểu đồ khác nhau đáng chú ý. Tuy nhiên, nó có thể cung cấp cho bạn một nơi để bắt đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.