
La bibliothèque open-source de l'équipe FLARE pour désassembler les instructions Common Intermediate Language (CIL).

dncil est une bibliothèque de désassemblage du langage intermédiaire commun (CIL) écrite en Python qui prend en charge l'analyse de l'en-tête, des instructions et des gestionnaires d'exceptions des méthodes managées .NET. Les données analysées sont exposées via une API orientée objet pour vous aider à développer rapidement des outils d'analyse CIL avec dncil.
Pourquoi Python ? Les bibliothèques existantes qui prennent en charge le désassemblage CIL, comme dnLib, sont écrites en C#. Pour exploiter ces outils, vous devez créer des applications C#, ce qui nécessite une expérience du développement C#. Avec dncil, une alternative pure Python, vous :
C# pour analyser le CIL par programmation.CIL.CIL à des projets Python existants.Le script d'exemple print_cil_from_dn_file.py utilise dncil avec la bibliothèque d'analyse .NET dnfile pour désassembler les méthodes managées trouvées dans un exécutable .NET. Voyons ce qu'il peut faire.
Tout d'abord, compilons le code source C# suivant :
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine ("Hello World!");
}
}
La compilation produit un exécutable PE contenant des métadonnées .NET qui indiquent au Common Language Runtime (CLR) comment exécuter notre code. Nous utilisons dnfile pour analyser ces métadonnées, ce qui nous donne l'offset de notre méthode managée Main. Nous utilisons ensuite dncil pour désassembler et afficher les instructions CIL stockées à cet emplacement.
Voyons ce qui précède en action :
$ python scripts/print_cil_from_dn_file.py hello-world.exe
Method: Main
0000 00 nop
0001 72 01 00 00 70 ldstr "Hello World!"
0006 28 04 00 00 0a call System.Console::WriteLine
000B 00 nop
000C 2a ret
Notre méthode Main est représentée par la classe CilMethodBody. Cette classe contient des données qui incluent l'en-tête, les instructions CIL et les gestionnaires d'exceptions d'une méthode managée donnée. Elle expose également diverses fonctions utilitaires :
> main_method_body.flags
SmallFormat : false
TinyFormat : false
FatFormat : false
TinyFormat1 : true
MoreSects : false
InitLocals : false
CompressedIL : false
> main_method_body.size
14
> hexdump.hexdump(main_method_body.get_bytes())
00000000: 36 00 72 01 00 00 70 28 04 00 00 0A 00 2A 6.r...p(.....*
> hexdump.hexdump(main_method_body.get_header_bytes())
00000000: 36 6
> hexdump.hexdump(main_method_body.get_instruction_bytes())
00000000: 00 72 01 00 00 70 28 04 00 00 0A 00 2A .r...p(.....*
Chaque instruction CIL trouvée dans notre méthode managée Main est représentée par la classe Instruction. Cette classe contient des données qui incluent l'offset, le mnémonique, l'opcode et l'opérande d'une instruction CIL donnée. Elle expose également diverses fonctions utilitaires :
> len(main_method_body.instructions)
5
> insn = main_method_body.instructions[1]
> insn.offset
1
> insn.mnemonic
'ldstr'
> insn.operand
token(0x70000001)
> insn.is_ldstr()
True
> insn.size
5
> hexdump.hexdump(insn.get_bytes())
00000000: 72 01 00 00 70 r...p
> hexdump.hexdump(insn.get_opcode_bytes())
00000000: 72 r
> hexdump.hexdump(insn.get_operand_bytes())
00000000: 01 00 00 70 ...p
Pour installer dncil, utilisez pip pour récupérer le module dncil :
$ pip install dncil
Pour exécuter les scripts d'exemple, assurez-vous d'installer dnfile. Vous pouvez également installer dncil avec les dépendances de développement comme décrit dans la section Development ci-dessous.
Voir print_cil_from_bytes.py pour un exemple rapide d'utilisation de dncil pour afficher les instructions CIL trouvées dans un flux d'octets contenant une méthode managée .NET.
Si vous souhaitez consulter et modifier le code source de dncil, vous devrez le télécharger depuis GitHub et l'installer localement.
Utilisez la commande suivante pour installer dncil localement avec les dépendances de développement :
$ pip install /local/path/to/src[dev]
Vous aurez besoin des dépendances de développement de dncil pour exécuter les tests et le linting comme décrit ci-dessous.
Utilisez la commande suivante pour exécuter les tests :
$ pytest /local/path/to/src/tests
Utilisez les commandes suivantes pour identifier les erreurs de format :
$ black -l 120 -c /local/path/to/src
$ isort --profile black --length-sort --line-width 120 -c /local/path/to/src
$ mypy --config-file /local/path/to/src/.github/mypy/mypy.ini /local/path/to/src/dncil/ /local/path/to/src/scripts/ /local/path/to/src/tests/
dncil est basé sur le code d'analyse CIL trouvé dans dnLib.