
Me doy cuenta de que podemos volcar un ensamblado equivalente del código C++ usando muchos depuradores y demás.
Pero ¿qué pasa con el código binario? El formato de bits en cada byte que compone las instrucciones reales de la máquina, que (pueden) formar los microprogramas (si la microarquitectura tiene uno).
Si cada línea de código C++ TIENE que convertirse a código de máquina de alguna manera y en algún punto a lo largo del programa (por ejemplo, un flotante puede definirse en C++, pero no tiene uso hasta que se inserta en la pila, por lo que no puede convertir 1: 1 a todo el código de máquina, línea por línea, pero se usará independientemente), se puede rastrear cada declaración, etc. Pero los depuradores no generan la formación de bits que ocupan cada instrucción individual.
Si cada programa se formatea con instrucciones de patrón de bytes/bits para la CPU, debe ser posible (supongo) rastrear todo el código que escribe hasta los bits reales en el nivel del circuito.
Pero para tener la mayor seguridad posible,Es posiblehacer esto en la medida que estoy describiendo aquí? Los depuradores/software modernos no ofrecen esta característica, e incluso los que sí parecen no brindarle al desarrollador la representación binaria completa de cada instrucción.
PD: Esto, por supuesto, supone que el código compilado es fácilmente ejecutable con instrucciones para la arquitectura prevista (y no algún lenguaje interpretado o código de bytes que necesita otro programa para traducirlo).
Respuesta1
Puede utilizar un desensamblador para convertir el código binario compilado a lenguaje ensamblador. Eso le permitiría "leer" (con dificultad) software distribuido únicamente en binario.
Para la otra parte de su pregunta, parece que desea algún tipo de descompilador de hardware que brinde información más detallada sobre cómo la CPU ejecuta una instrucción binaria particular. No conozco ninguna herramienta para hacer esto. Probablemente tendrás que leer los manuales de hardware y hacer este tipo de análisis mentalmente.
Respuesta2
No.
Bueno, tal vez, pero no hay garantía porque el código que entra en el compilador rara vez es el mismo que el código que sale por dos razones: los humanos son terribles escribiendo código eficiente y los humanos no piensan en el código de la misma manera. que una CPU necesita para procesarlo. Debido a esto, los compiladores optimizarán el código fuente antes de convertirlo a ensamblador/binario. Esto puede llevar adeclaraciones reordenadas, declaraciones inútiles eliminadas y funciones completas insertadas.
Por ejemplo, dado el siguiente pseudocódigo:
int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);
puede reducirse completamente a
int x = 16;
por un buen compilador optimizador, que no se corresponde en absoluto con la fuente. Es por eso que al depurar, a menudo es necesario deshabilitar las optimizaciones del compilador. Con todas las optimizaciones del compilador deshabilitadas, el compilador intentará generar un ensamblado que coincida con el código fuente 1 por 1.