Esta es una pregunta muy interesante. Existen millones de conjuntos de instrucciones, pero solo unos pocos de los más utilizados.
Lo primero que miraría es el origen y el uso previsto. Si sospecha que fue diseñado en los EE. UU., Principalmente se centraría en procesadores con hojas de datos disponibles en inglés, por ejemplo. Si fue diseñado en Asia, entonces hay una serie de procesadores que utilizan para dispositivos fabricados en masa que los ingenieros estadounidenses rara vez ven. Incluso Europa tiene algunos procesadores que son más comunes que otros.
Luego echaría un vistazo al tamaño y la funcionalidad del código (suponiendo que sepa lo que hace el código hasta cierto punto). Si se trata de unos pocos megabytes de código, puede descartar la mayoría de los procesadores integrados de 8 bits y comenzar a buscar dispositivos más grandes con memoria externa. Si son unos pocos kilobytes o menos, entonces querrás enfocarte en dispositivos más pequeños y baratos. Si la funcionalidad es simple, incluso podría ser un código para un procesador de cuatro bits.
En este punto, vale la pena mirar la estructura de la memoria. Es probable que haya una sección de programa y una sección de datos como mínimo. Si se trata de un archivo binario (en comparación con el registro de Intel hexadecimal o motorola), tiene poca información sobre dónde se están colocando ciertos fragmentos de datos en la memoria. Un editor hexadecimal puede mostrar algunos patrones. Si viene en un formato de registro hexadecimal, es posible que tenga más información sobre la estructura de memoria del procesador para el que está destinado. Algunos procesadores se reinician en la ubicación de memoria del programa 0, algunos en la ubicación de memoria más alta. El programa puede incluir valores iniciales de EEPROM en una ubicación de memoria separada. Si está destinado a un procesador seguro (como se usa en la banca), incluso podría tener claves de seguridad para una ubicación de memoria extraña.
Dependiendo del idioma en el que se programó, es posible que tenga algunas pistas adicionales. Si se programó en C o en un lenguaje de procedimiento similar, las funciones casi siempre comenzarán con una secuencia de instrucciones para guardar ciertos registros en la pila (muchos empujes) y luego justo antes de devolver muchas ventanas emergentes para devolver los valores originales de la pila . Si puede hacer algún reconocimiento de patrones, encontrará muchas de estas secuencias en todo momento y podrá determinar qué instrucciones son más probablemente instrucciones push / pop, retorno, etc., que podrían reducir un poco sus opciones.
Si es un dispositivo integrado con interrupciones, puede tener una tabla de vectores de interrupciones, que se verá como un montón de saltos a diferentes ubicaciones de memoria, todo en un bloque grande, probablemente en una ubicación conveniente (dirección de 0x ??? 0, por ejemplo) . Las tablas de salto también se usan en otras partes para otras cosas, pero si puede ubicar una secuencia de instrucciones que se vean idénticas, excepto cuál sería la dirección a la que saltar, podría inferir cómo se ve una instrucción de salto, y nuevamente sus elecciones abajo.
En ese punto, comenzaría con las arquitecturas de procesador más comunes y vería si algo se correlaciona. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502, etc, etc., etc. Hay listas de procesadores comunes y conjuntos de instrucciones, al menos en el mundo de habla inglesa, que podrían ser útiles.
No conozco ninguna herramienta automatizada que ayude con esto, pero MAME emula una gran cantidad de arquitecturas de procesador, y un posible método es ejecutar el código a través de varios procesadores y ver los registros para ver si algo hace clic de acuerdo con lo que sabes sobre el diseño.