Zasm fournit une bibliothèque très flexible et légère pour manipuler et générer du code x86-64 à l'aide de Zydis comme backend. ZASM stocke tout comme des nœuds tels que les instructions, les données, les étiquettes, les sections, etc. qui fournit un moyen de manipuler / transformer facilement le code avant de les sérialiser en binaire. L'API est inspirée par ASMJIT, donc si vous avez utilisé ASMJIT avant cela devrait vous sembler très familier.
Certains de mes projets utilisaient des zydis et des asmjit où les instructions ont été décodées pour la première fois avec des zydis, puis placées dans le constructeur d'Asmjit pour permettre le traitement / analyse des instructions / succursales avant de réencoder / déménager le code modifié, il y a quelques inconvénients à cette approche qui sera expliquée plus loin. Zydis a récemment introduit un moyen d'utiliser les mêmes structures / données qu'il doit déjà coder des instructions qui mènent à ZASM. Cette bibliothèque vise à être un assembleur / décodeur de niveau supérieur qui peut être utilisé pour diverses choses comme l'exemple mentionné précédemment.
Une forte différence entre ZASM et ASMJIT est l'accent mis sur des données d'instructions précises telles que l'accès à l'opérande, l'utilisation du registre caché, les indicateurs de processeur corrects qui peuvent être manquants ou mauvais dans ASMJIT à quelques exceptions bien sûr, ASMJIT vise à un moyen convivial de générer du code à la volée pour Disons Say Scripting ou High Performance Computing. Zasm n'essaie pas de remplacer ASMJIT de quelque manière que ce soit, il a des objectifs différents.
La deuxième raison de Zasm est que le codeur Zydis étant un niveau extrêmement bas, ce qui signifie que vous n'avez pas de choses comme les étiquettes, Zasm fournit une classe de haut niveau pour assembler des instructions et fournit des étiquettes comme un assembleur ordinaire.
Zasm utilise CMake en combinaison avec CMKR pour simplifier le maintien des CMakelists.txt. Le bâtiment doit être aussi simple que d'utiliser les commandes suivantes d'un terminal dans le répertoire racine:
cmake . -B build
cmake --build build --config Release
Si vous souhaitez également construire les tests, utilisez
cmake . -B build -DZASM_BUILD_TESTS=ON
Le programme est le conteneur qui contient toutes les données et sert également de liste doublement liée. Les instructions, les étiquettes, les données, les sections, etc. sont stockées comme des nœuds qui permet à l'utilisateur de supprimer / insérer / se réorganiser assez facilement.
La classe d'assembleur fournit des fonctions membres générées pour générer des instructions / données / étiquettes dans le programme à la position du curseur spécifié. Pour émettre mov rax, -1 l'équivalent serait asssembler.mov(operands::rax, operands::Imm(-1));
La classe de sérialiseur sérialise les nœuds du programme en binaire et stocke l'état résultant. Après une sérialisation réussie, l'utilisateur peut interroger le code binaire et les données résultant tels que l'adresse des étiquettes, les informations de relocalisation, les données de section, etc.
Décode les données binaires dans l'objet d'instruction qui peut être utilisé directement ou stocké dans le programme.
Le projet fournit quelques exemples de base qui peuvent être trouvés ici. Il existe également divers tests pour presque tout ce que ZASM fournit, s'il y a d'abord quelque chose qui manque les tests, ils fournissent également de bons exemples. Si vous avez toujours des questions, vous pouvez nous contacter via Discord.