Essa ferramenta digitaliza um arquivo executável em busca de dados Delphi, incluindo RTTI e tabelas de função virtual. Ele gera um arquivo json com informações sobre classes e funções identificadas, que podem ser usadas para análises adicionais, por exemplo:
Um script IDAPETHON que pode carregar a saída no IDA é fornecido.
O script foi escrito para complementar outras ferramentas para a engenharia reversa Delphi.
Lançado como código aberto pelo NCC Group plc - http://www.nccgroup.com/
Desenvolvido por David Cannings (@EDECA) [email protected]
http://www.github.com/nccgroup/pythia
Este projeto é divulgado sob a licença AGPL. Consulte a licença para obter mais informações.
O fluxo de alto nível é:
Delphi Vftables estão bem documentados. As informações para a versão mais recente estão disponíveis na Embarcadero. A documentação não oficial está disponível para Delphi 2005 (veja aqui).
O código -fonte para Pascal gratuito também é útil (espelho do github).
O primeiro item em um vftable é vmtSelfPtr , que aponta para o início da tabela de função virtual. O script verifica cada segmento de código no arquivo PE em busca de qualquer local que aponte para a frente +0x4C bytes. Observe que o compilador Delphi alinha Vftables a um limite de 4 bytes (para otimização).
Por exemplo, o seguinte VA 0x0046E1C8 contém o deslocamento 0x0046E214 , que é 0x4C antes do local atual. Conforme mostrado em Ida:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
Essa abordagem pode gerar falsos positivos; portanto, outros campos no Vftable são verificados quanto a valores sensíveis. Por exemplo, o vmtInstanceSize é verificado para garantir que não seja excessivo e que os ponteiros de função sejam verificados para estar em uma seção executável. Durante o teste, a taxa falsa positiva foi muito baixa, apesar do método de busca de força bruta.
Cada função encontrada em um Vftable é verificada para ver se é herdado do pai ou sobrecarregado. A Delphi não suporta herança múltipla, portanto isso pode ser alcançado verificando o ponteiro no vftable pai com o mesmo deslocamento.
Se ambos os ponteiros referenciam a mesma função, ela é herdada. Se a criança tiver um ponteiro diferente, ela foi sobrecarregada.
A saída primária da ferramenta é um arquivo JSON que pode ser alimentado em processamento / ferramentas subsequentes. No entanto, alguns outros formatos de saída estão incluídos.
Use a opção --save-tree para gerar um arquivo como:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. etc ..
PACKAGEINFO ou DVCLAL Resource) e ajuste a varredura para diferentes layouts VFTABLE.call [ecx+3Fh] para um método de instância)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> que são bastante indecifráveis na IDA.Envie -me exemplos de binários onde essa ferramenta não funciona, para que possa ser melhorada.