
La biblioteca de código abierto del equipo FLARE para desensamblar instrucciones de Common Intermediate Language (CIL).

dncil es una librería de desensamblado de Common Intermediate Language (CIL) escrita en Python que permite analizar el encabezado, las instrucciones y los controladores de excepciones de métodos administrados de .NET. Los datos analizados se exponen a través de una API orientada a objetos para ayudarte a desarrollar rápidamente herramientas de análisis de CIL con dncil.
¿Por qué Python? Las librerías existentes que admiten el desensamblado de CIL, como dnLib, están escritas en C#. Para aprovechar estas herramientas, debes crear aplicaciones C#, lo que requiere experiencia en desarrollo con C#. Con dncil, una alternativa en Python puro, puedes:
C# para analizar CIL programáticamente.CIL.CIL con proyectos Python existentes.El script de ejemplo print_cil_from_dn_file.py usa dncil junto con la librería de análisis de .NET dnfile para desensamblar los métodos administrados que se encuentran en un ejecutable de .NET. Veamos qué puede hacer.
Primero, compilamos el siguiente código fuente en C#:
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine ("Hello World!");
}
}
La compilación produce un ejecutable PE que contiene metadatos de .NET que informan al Common Language Runtime (CLR) cómo ejecutar nuestro código. Usamos dnfile para analizar estos metadatos, lo que nos da el desplazamiento de nuestro método administrado Main. Luego usamos dncil para desensamblar y mostrar las instrucciones CIL almacenadas en esa ubicación.
Veamos lo anterior en acción:
$ 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
Nuestro método Main está representado por la clase CilMethodBody. Esta clase contiene datos que incluyen el encabezado, las instrucciones CIL y los controladores de excepciones de un método administrado determinado. También expone varias funciones auxiliares:
> 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(.....*
Cada instrucción CIL encontrada en nuestro método administrado Main está representada por la clase Instruction. Esta clase contiene datos que incluyen el desplazamiento, el mnemónico, el opcode y el operando de una instrucción CIL determinada. También expone varias funciones auxiliares:
> 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
Para instalar dncil, usa pip para obtener el módulo dncil:
$ pip install dncil
Para ejecutar los scripts de ejemplo, asegúrate de instalar dnfile. Alternativamente, instala dncil con las dependencias de desarrollo como se describe en la sección Desarrollo a continuación.
Consulta print_cil_from_bytes.py para ver un ejemplo rápido de cómo usar dncil para imprimir las instrucciones CIL que se encuentran en un flujo de bytes que contiene un método administrado de .NET.
Si deseas revisar y modificar el código fuente de dncil, deberás descargarlo de GitHub e instalarlo localmente.
Usa el siguiente comando para instalar dncil localmente con las dependencias de desarrollo:
$ pip install /local/path/to/src[dev]
Necesitarás las dependencias de desarrollo de dncil para ejecutar las pruebas y el linting como se describe a continuación.
Usa el siguiente comando para ejecutar las pruebas:
$ pytest /local/path/to/src/tests
Usa los siguientes comandos para identificar errores de formato:
$ 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 se basa en el código de análisis de CIL que se encuentra en dnLib.