Đâ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ế