Zasm proporciona una biblioteca muy flexible y liviana para manipular y generar código X86-64 usando Zydis como backend. Zasm almacena todo como nodos como instrucciones, datos, etiquetas, secciones, etc. que proporciona una forma de manipular/transformar fácilmente el código antes de serializarlo en binario. La API está inspirada en ASMJIT, por lo que si ha usado ASMJIT antes de que esto se sienta muy familiar.
Algunos de mis proyectos estaban usando Zydis y Asmjit, donde las instrucciones se decodificaron por primera vez con Zydis y luego se pusieron en el constructor de Asmjit para permitir el procesamiento/análisis de las instrucciones/ramas antes de volver a codificar/reubicar el código modificado, hay un par de desventajas a este enfoque que se explicarán más abajo. Zydis recientemente introdujo una forma de usar las mismas estructuras/datos que ya tiene que codificar instrucciones que conducen a Zasm. Esta biblioteca tiene como objetivo ser un ensamblador/decodificador de nivel superior que pueda usarse para varias cosas como el ejemplo mencionado anteriormente.
Una fuerte diferencia entre Zasm y ASMJIT es el enfoque en los datos de instrucciones precisos, como el acceso a operandos, el uso de registros ocultos, los indicadores correctos de la CPU, todos los cuales pueden faltar o incorrectamente en ASMJIT con algunas excepciones, por supuesto, ASMJIT apunta a una forma amigable de generar código en la marcha para decir que los scripts o la computación de alto rendimiento. Zasm no está tratando de reemplazar a Asmjit de ninguna manera, tiene diferentes objetivos.
La segunda razón para Zasm es que el codificador Zydis es un nivel extremadamente bajo, lo que significa que no tiene cosas como las etiquetas, Zasm proporciona una clase de alto nivel para instrucciones de ensamblaje y proporciona etiquetas como lo haría un ensamblador ordinario.
Zasm usa Cmake en combinación con CMKR para simplificar el mantenimiento de CMAKELISTS.txt. El edificio debe ser tan fácil como usar los siguientes comandos de un terminal en el directorio raíz:
cmake . -B build
cmake --build build --config Release
Si también desea construir el uso de pruebas
cmake . -B build -DZASM_BUILD_TESTS=ON
El programa es el contenedor que contiene todos los datos y también sirve como una lista doblemente vinculada. Las instrucciones, etiquetas, datos, secciones, etc. se almacenan como nodos que permiten al usuario eliminar/insertar/reordenar con bastante facilidad.
La clase de ensamblador proporciona funciones miembros generadas para generar instrucciones/datos/etiquetas en el programa en la posición del cursor especificada. Para emitir mov rax, -1 el equivalente sería asssembler.mov(operands::rax, operands::Imm(-1));
La clase Serializer serializa los nodos del programa en binarios y almacena el estado resultante. Después de una serialización exitosa, el usuario puede consultar el código binario y los datos resultantes, como la dirección de etiquetas, información de reubicación, datos de sección, etc.
Decodifica los datos binarios en el objeto de instrucción que se puede utilizar directamente o almacenarse directamente en el programa.
El proyecto proporciona algunos ejemplos básicos que se pueden encontrar aquí. También hay varias pruebas para casi todo lo que Zasm proporciona, si primero falta el pago de las pruebas, también proporcionan buenos ejemplos. Si aún tiene preguntas, puede contactarnos a través de Discord.