Cet espace est dédié à la notion de désassemblage de code assembleur sur processeurs intel et amd. Ce projet se compose d'une librairie de désassemblage de base (BeaEngine.lib) pour plateformes windows sur architectures IA-32 ou Intel64, d'outils utilisant cette lib (LookInside, plugin pour Immunity Debugger, plugin pour OllyDbg), d'un "Length Disassembler Engine" (LDE64) et d'une documentation sur l'encodage des instructions x86 et x86-64.
BeaEngine.lib est une librairie codée en C (grâce à l'IDE Code::Blocks et au compilateur Pelles C ) conçue pour décoder les instructions des architectures intel 32 bits et/ou 64 bits. Elle comporte à l'heure actuelle une seule fonction appelée Disasm qui permet de désassembler n'importe quelle ligne de code qui respecte le jeu d'instructions Intel. Ceci inclus le jeu d'instructions standard, les technologies FPU, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, VMX. Pour les adeptes de l'analyse de codes malicieux et plus généralement de codes obfusqués, BeaEngine décode également les instructions non documentées proposées comme des "alias" sur sandpile. Dans tous les cas de figure, elle renvoie une structure complexe qui décrit de façon très précise l'instruction analysée.
Elle est prévue pour être utilisée en C (utilisable avec Visual Studio, Pelles C, LCC ou MingW), en assembleur (utilisable avec masm32, nasm, fasm, GoAsm) en Python et en Delphi. Elle peut être utilisée indifféremment en ring3 et en ring0 puisqu'elle n'utilise pas l'API windows. Elle a été pensée et conçue pour réaliser de nombreuses tâches. Elle permet dans un premier temps d'obtenir le mnémonic et les opérandes suivant la syntaxe spécifiée : syntaxe intel pour Nasm, masm32 et masm64, GoAsm32 et GoAsm64, fasm et syntaxe AT&T. Elle permet également des analyses fines de data-flow ou de control-flow, pour construire des slices ou pour élaborer des patterns d'obfuscation.Le pack proposé ici est composé de la librairie, de son code source sous licence LGPL3, de nombreux exemples plus ou moins complexes incluant les headers pour les langages C, Python, Delphi, masm32, nasm, fasm ,GoAsm.
BeaEngine a été codé à partir des tables d'opcodes proposées dans la documentation intel et a été complété par les tables proposées par Christian Ludloff sur son site www.sandpile.org
Pour cet exemple, nous voulons décoder , sur une architecture 32 bits, la séquence de bytes suivante :
0x89, 0x94, 0x88, 0x00, 0x20, 0x40, 0x00
Si vous demandez une syntaxe de sortie MASM32 , BeaEngine vous renverra ceci :
mov dword ptr ds:[eax + ecx*4 + 402000h], edx
Si vous demandez une syntaxe de sortie AT&T , BeaEngine vous renverra ceci :
movd %edx, %ds:402000h(%eax,%ecx,4)
Si vous demandez une syntaxe de sortie NASM , BeaEngine vous renverra ceci :
mov dword [ds:eax + ecx*4 + 0x402000], edx
Exemple 1 : analyse complète
Pour ceux qui veulent analyser l'instruction précédente de façon précise, BeaEngine propose les champs suivants :
Cette fois ci, nous voulons décoder , sur une architecture 64 bits, la séquence de bytes suivante :
0x41, 0x80, 0x7E, 0x01, 0x22
Si vous demandez une syntaxe de sortie MASM64 , BeaEngine vous renverra ceci :
cmp byte ptr ds:[r14+01h], 22h
Si vous demandez une syntaxe de sortie AT&T , BeaEngine vous renverra ceci :
cmpb $22h, %ds:01h(%r14,)
Si vous demandez une syntaxe de sortie NASM , BeaEngine vous renverra ceci :
cmp byte [ds:r14+0x01], 0x22
Exemple 2 : analyse complète
Pour ceux qui veulent analyser l'instruction précédente de façon précise, BeaEngine propose les champs suivants :
Performances
Pour un poids d'environ 250 ko (sous forme de dll), la fonction Disasm de BeaEngine propose un rendement assez confortable. Sur un intel core 2 duo, elle permet de désassembler un fichier de 50 Mo (contenant l'équivalent de 22 millions d'instructions) en environ 13 secondes. A titre de comparaison, la fonction Disasm du moteur de OllyDebugger 1.10 qui renvoie également une structure très complète permet de désassembler le même fichier de 50 Mo en environ 40 secondes.
Contributeurs
Un grand merci à tous les contributeurs qui ont fait progressé BeaEngine par leurs conseils, leurs correctifs et leurs remarques:
4 novembre 2009 | BeaEngine 3.1.0
|
16 octobre 2009 | BeaEngine 3.0.6 (correction d'une mauvaise interprétation des registres cs et ds) Merci à sessiondiy. |
3 octobre 2009 | BeaEngine 3.0.5 (l'instruction non documentée bswap reg16 a été ajoutée)Merci à 29a metal. |
2 août 2009 | BeaEngine 3.0.4 (ajout d'une instruction FPU oubliée) Merci à Rafal Cyran pour m'avoir signalé l'instruction fucomip qui avait été oubliée. |
28 juin 2009 | Header Delphi Merci à Zoxc pour mettre à disposition un header pour les codeurs Delphi. |
1er mars 2009 | BeaEngine 3.0.2 (correction d'un bug sur instruction push imm16) merci à bax. |
23 février 2009 | BeaEngine 3.0.1 (correction d'un bug sur architecture x64) merci à KumaT. |
13 février 2009 | BeaEngine 3.0 (versions x64 et x86 pour le reversing) - codée en C. |
28 juin 2007 | BeaEngine 2.3 (mise à jour). |
1er juin 2007 | BeaEngine 2.2 (mise à jour), doc sur l'encodage des instructions. |
8 mai 2007 | BeaEngine 2.1 - mise à jour (correction de bugs mineurs). |
10 avril 2007 | BeaEngine 2.0 - Routine de désassemblage 32 bits et 64 bits ! (codée en asm pour masm32). |
10 novembre 2006 | BeaEngine 1.0 - Routine de désassemblage 32 bits codée asm pour masm32. |