web-dev-qa-db-fra.com

convertir ASM en C (pas d'ingénieur inverse)

J'ai googlé et je vois une quantité surprenante de réponses désinvoltes se moquer du demandeur pour avoir posé une telle question.

Microchip fournit gratuitement du code source (je ne veux pas le poster ici au cas où il s'agirait d'un non-non. Fondamentalement, google AN937, cliquez sur le premier lien et il y a un lien pour "code source" et son fichier compressé). Son en ASM et quand je le regarde je commence à aller les yeux croisés. Je voudrais le convertir en quelque chose qui ressemble à un langage de type c pour pouvoir suivre. Parce que des lignes telles que:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

sont probablement très simples mais ils ne signifient rien pour moi.

Il doit y avoir un traducteur automatique ASM en C mais tout ce que je peux trouver, ce sont des gens qui disent que c'est impossible. Franchement, il est impossible que ce soit impossible. Les deux langues ont une structure et cette structure peut certainement être traduite.

je vous remercie.

21
Steven

Vous pouvez absolument créer un programme c à partir d'un assembleur. Le problème est que cela ne ressemble peut-être pas à ce que vous pensez, ou peut-être que ce sera le cas. Mon PIC est rouillé mais avec un autre assembleur, disons que vous aviez

add r1,r2

En C, disons que cela devient

r1 = r1 + r2;

Peut-être plus lisible. Vous perdez tout sens des noms de variable car les valeurs sautent de mémoire en registre et inversement, et les registres sont réutilisés. Si vous parlez des images plus anciennes comportant deux registres, un accumulateur et un autre, eh bien, cela pourrait être plus facile, car les variables étaient en mémoire pour la plupart, vous regardez l'adresse, quelque chose comme: 

q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;

Long et long mais il est clair que mem [0x12] = mem [0x12] + mem [0x13];

Ces emplacements de mémoire sont des variables probables qui ne vont pas sauter comme le code C compilé pour un processeur avec un tas de registres. L'image peut faciliter la tâche pour déterminer les variables, puis effectuer une recherche et un remplacement pour les nommer dans le fichier.

Ce que vous recherchez s'appelle une traduction binaire statique, pas nécessairement une traduction d'un binaire à un autre (un processeur à un autre), mais dans ce cas une traduction de binaire pic en C. Idéalement, vous voudriez prendre l'assembleur donné dans le app note et assemble-le en un binaire en utilisant les outils de la micropuce, puis fais la traduction. Vous pouvez également effectuer une traduction dynamique en binaire, mais vous avez encore moins de chances de trouver l’un de ceux-ci et il n’ya normalement pas de résultat en C mais en binaire. Vous êtes-vous déjà demandé comment fonctionnent ces joysticks de Wal-Mart à 15 $ chez pac-man et galaga? La rom de l'arcade a été convertie à l'aide de la traduction binaire statique, optimisée et nettoyée, et le langage C ou autre langage intermédiaire compilé pour le nouveau processeur cible dans le terminal mobile. J'imagine que tous n'ont pas été réalisés de cette façon, mais je suis sûr que certains l'ont été.

La question à un million de dollars, pouvez-vous trouver un traducteur statique pour une photo? Qui sait, vous devrez probablement en écrire un vous-même. Et devinez ce que cela signifie, vous écrivez un désassembleur, et au lieu de désassembler une instruction dans la syntaxe de l’assembleur natif telle que add r0, r1 vous devez imprimer votre désassembleur r0 = r0 + r1; Au moment où vous aurez terminé ce désassembleur, vous maîtriserez si bien le langage d'assemblage d'images que vous n'aurez plus besoin du traducteur asm to C. Vous avez un problème de poulet et d'oeufs.

37
old_timer

Récupérer le code source exact même à partir d'un programme compilé est fondamentalement impossible. Mais les décompilateurs ont été un domaine de recherche en informatique (par exemple, le décompilateur dcc , qui était un projet de doctorat).

Il existe différents algorithmes qui peuvent être utilisés pour effectuer une correspondance de motif sur un code d'assemblage et générer un code C équivalent, mais il est très difficile de le faire d'une manière générale qui fonctionne pour toutes les entrées.

Vous voudrez peut-être consulter Boomerang pour un effort open source semi-récent sur un décompilateur généralisé.

17
bobbymcr

Vous ne pouvez pas de manière déterministe convertir le code d'assembly en C. Les interruptions, les codes à modification automatique et d'autres éléments de bas niveau n'ont pas de représentation autre que Assembly inline en C. Le processus C peut fonctionner. Sans parler du code C résultant, il sera probablement plus difficile à comprendre que de lire le code d'assemblage ... à moins que vous ne l'utilisiez comme base pour commencer la réimplémentation du code d'assemblage en C, il est quelque peu utile. Découvrez le plug-in Hex-Rays pour IDA.

J'ai déjà travaillé sur un projet où une partie importante de la propriété intellectuelle était constituée d'algorithmes sérieux codés en code assembleur x86. Pour porter le code sur un système intégré, le développeur de ce code (pas moi) a utilisé un outil d'une organisation appelée MicroAPL (si je me souviens bien):

J'ai été très très surpris de la qualité de l'outil.

D'autre part, je pense que c'est un de ces types de choses "si vous devez demander, vous ne pouvez pas vous le permettre" (leurs gammes de prix pour une conversion unique d'un projet aboutissent à environ 4 lignes d'assemblage traitées pour un dollar).

Mais souvent, les routines d’assemblage que vous obtenez auprès d’un fournisseur sont regroupées sous la forme de fonctions pouvant être appelées en C; aussi longtemps que les routines font ce que vous voulez (sur le processeur que vous voulez utiliser), il vous suffit de les assembler et oubliez-les plus ou moins - ce ne sont que des fonctions de bibliothèque que vous appelez de C.

7
Michael Burr

Oui, il est très possible de procéder à un reverse-engineering du code d'un assembleur pour obtenir un code C de bonne qualité.

Je travaille pour une MicroAPL, une société qui produit un outil appelé Relogix pour convertir le code assembleur en C. Cela a été mentionné dans l'un des autres articles.

Veuillez consulter les exemples sur notre site Web:

http://www.microapl.co.uk/asm2c/index.html

7
Simon Marsden

Il doit y avoir un traducteur automatique ASM en C mais tout ce que je peux trouver, ce sont des gens qui disent que c'est impossible. Franchement, il est impossible que ce soit impossible.

Non ce n'est pas. La compilation perd des informations: il y a moins d'informations dans le code de l'objet final que dans le code source C. Un décompilateur ne peut pas créer magiquement cette information à partir de rien, et une telle décompilation est impossible.

6
kquinn

Ce n'est pas impossible, mais très difficile. Un programmeur expérimenté en assembleur et en C pourrait probablement le faire, ou vous pourriez utiliser un décompresseur Decompiler . Certains convertissent assez bien l’asm en C, bien que vous deviez probablement renommer certaines variables et méthodes.

Consultez this site pour obtenir une liste des décompilateurs disponibles pour l’architecture x86.

4
a_m0d

Découvrez ceci: decompiler

Un décompilateur est le nom donné à un programme informatique qui exécute le opération inverse à celle d'un compilateur. C'est-à-dire que cela traduit un fichier contenant des informations sur un niveau d'abstraction relativement faible (généralement conçu pour être un ordinateur lisible plutôt que lisible par l'homme) dans une forme ayant un niveau supérieur de abstraction (généralement conçue pour être lisible par un humain).

3
Nick Dandoulakis

Pas facilement possible. 

En plus de la lisibilité, l’un des grands avantages de C sur l’ASM était qu’il empêchait les astuces de programmation "astucieuses".

Il existe de nombreuses choses que vous pouvez faire dans assembleur qui n'ont pas d'équivalent direct C, Ou qui impliquent une syntaxe tortueuse dans C.

L'autre problème concerne les types de données. La plupart des assembleurs n'ont essentiellement que deux types de données interchangeables: les octets et les mots. Il peut y avoir des constructions de langage pour définir les ints et les floats Etc. mais il n'y a aucune tentative de vérifier que la mémoire est utilisée telle que définie. Il est donc très difficile de mapper le stockage ASM aux types de données C. 

De plus, tout le stockage d'assembleur est essentiellement une "structure"; Le stockage est structuré dans l'ordre dans lequel il est défini (contrairement à C où le stockage est commandé à la fantaisie du moment de l'exécution). De nombreux programmes ASM dépendent de la structure de stockage exacte. Pour obtenir le même effet en C, vous devez définir l'ensemble du stockage dans le cadre d'une même structure. 

Il y a aussi beaucoup d’instructions absentes (sur les manframes IBM anciennes, LA, adresse de chargement, l’instruction était régulièrement utilisée pour effectuer de simples opérations arithimatiques, car elle était plus rapide et n’avait pas besoin d’un registre de débordement).

Bien qu’il soit techniquement possible de traduire en C, le code C résultant serait moins lisible que le code ASM transalté. 

3
James Anderson

Je peux dire avec une garantie de 99%, qu’il n’existe pas de convertisseur prêt pour ce langage d’Assemblée, vous devez donc en écrire un. Vous pouvez simplement l'implémenter en remplaçant la commande ASM par la fonction C:

movf    BARGB2,w -> c_movf(BARGB2,w);
subwf   AARGB2,f -> c_subwf(AARGB2,f);

Cette partie est facile:) Ensuite, vous devez implémenter chaque fonction. Vous pouvez déclarer les registres en tant que globaux pour simplifier les choses. Vous pouvez aussi utiliser non pas des fonctions, mais #defines, en appelant des fonctions si nécessaire. Cela aidera avec le traitement des arguments/résultats.

#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here

Le cas particulier est les directives/étiquettes ASM, je pense qu’il ne peut être converti qu’avec #defines.

Le plaisir commence lorsque vous atteignez certaines fonctionnalités spécifiques au processeur. Il peut s'agir d'appels de fonction simples avec des opérations de pile, de certaines opérations IO/mémoire spécifiques. Les opérations avec le registre de compteur de programme, utilisé pour les calculs, ou l’utilisation/le comptage de ticks/latences sont plus amusantes.

Mais il y a un autre moyen, si cela se produit. C'est hardcore aussi:) Il existe une technique nommée recompilation dynamique existe. Il est utilisé dans de nombreux émulateurs .

Vous n'avez pas besoin de recompiler votre ASM, mais l'idée est presque la même. Vous pouvez utiliser toutes vos #défines dès la première étape, mais y ajouter la prise en charge des fonctionnalités nécessaires (incrémentation de PC/ticks). Vous devez également ajouter un environnement virtuel pour votre code, tel que des gestionnaires de mémoire/E/S, etc.

Bonne chance :)

2
zxcat

Je pense qu’il est plus facile de prendre un livre sur l’assemblée PIC et d’apprendre à le lire. Assembler est généralement assez simple à apprendre, car son niveau est très bas. 

1
jakobengblom2

Il est difficile de convertir une fonction de asm en C mais faisable à la main. La conversion d'un programme entier avec un décompilateur vous donnera un code qui peut être impossible à comprendre car une grande partie de la structure a été perdue pendant la compilation. Sans noms de variables et de fonctions significatifs, le code C résultant est encore très difficile à comprendre.

0
Gerhard

Départ asm2c

Outil Swift pour transformer le code d'assemblage DOS/PMODEW 386 TASM en code C

0
franck