
A biblioteca de código aberto da equipe FLARE para desmontar instruções da Common Intermediate Language (CIL).

dncil é uma biblioteca de desmontagem da Common Intermediate Language (CIL) escrita em Python que suporta a análise do cabeçalho, das instruções e dos manipuladores de exceção de métodos gerenciados do .NET. Os dados analisados são expostos por meio de uma API orientada a objetos para ajudar você a desenvolver rapidamente ferramentas de análise de CIL usando dncil.
Por que Python? Bibliotecas existentes que suportam desmontagem de CIL, como o dnLib, são escritas em C#. Para aproveitar essas ferramentas, você precisa criar aplicativos C#, o que exige experiência em desenvolvimento C#. Usando o dncil, uma alternativa em Python puro, você:
C# para analisar CIL programaticamente.CIL.CIL com projetos Python existentes.O script de exemplo print_cil_from_dn_file.py usa o dncil em conjunto com a biblioteca de análise .NET dnfile para desmontar os métodos gerenciados encontrados em um executável .NET. Vamos ver o que ele pode fazer.
Primeiro, compilamos o seguinte código-fonte C#:
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine ("Hello World!");
}
}
A compilação resulta em um executável PE contendo metadados .NET que informam ao Common Language Runtime (CLR) como executar nosso código. Usamos o dnfile para analisar esses metadados, o que nos dá o deslocamento do nosso método gerenciado Main. Em seguida, usamos o dncil para desmontar e exibir as instruções CIL armazenadas nesse local.
Vejamos o acima em ação:
$ 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
Nosso método Main é representado pela classe CilMethodBody. Essa classe contém dados que incluem o cabeçalho, as instruções CIL e os manipuladores de exceção de um determinado método gerenciado. Ela também expõe várias funções 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 instrução CIL encontrada em nosso método gerenciado Main é representada pela classe Instruction. Essa classe contém dados que incluem o deslocamento, o mnemônico, o opcode e o operando de uma determinada instrução CIL. Ela também expõe várias funções 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 o dncil, use o pip para obter o módulo dncil:
$ pip install dncil
Para executar os scripts de exemplo, instale o dnfile. Alternativamente, instale o dncil com as dependências de desenvolvimento conforme descrito na seção Desenvolvimento abaixo.
Consulte print_cil_from_bytes.py para ver um exemplo rápido de uso do dncil para imprimir as instruções CIL encontradas em um fluxo de bytes contendo um método gerenciado .NET.
Se você quiser revisar e modificar o código-fonte do dncil, precisará baixá-lo do GitHub e instalá-lo localmente.
Use o seguinte comando para instalar o dncil localmente com as dependências de desenvolvimento:
$ pip install /local/path/to/src[dev]
Você precisará das dependências de desenvolvimento do dncil para executar os testes e o linting conforme descrito abaixo.
Use o seguinte comando para executar os testes:
$ pytest /local/path/to/src/tests
Use os seguintes comandos para identificar erros de formatação:
$ 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/
O dncil é baseado no código de análise de CIL encontrado no dnLib.