Cet outil scanne un fichier exécutable pour les données Delphi, y compris les tables de fonction RTTI et virtuelles. Il publie un fichier JSON avec des informations sur les classes et fonctions identifiées, qui peuvent être utilisées pour une analyse supplémentaire, par exemple:
Un script idapython qui peut charger la sortie en IDA est fourni.
Le script a été écrit pour compléter d'autres outils pour l'ingénierie inverse Delphi.
Sortie en fonction open source par NCC Group plc - http://www.nccgroup.com/
Développé par David Cannings (@edeca) [email protected]
http://www.github.com/nccgroup/pythia
Ce projet est publié sous la licence AGPL. Veuillez consulter la licence pour plus d'informations.
Le flux de haut niveau est:
Delphi Vftables est bien documenté. Les informations pour la dernière version sont disponibles auprès d'Embarcadero. Une documentation non officielle est disponible pour Delphi 2005 (voir ici).
Le code source de Pascal gratuit est également utile (GitHub Mirror).
Le premier élément d'un VFTable est vmtSelfPtr , qui pointe vers le début de la table de fonctions virtuelles. Le script analyse chaque segment de code dans le fichier PE pour n'importe quel emplacement pointant vers l'avant +0x4C octets. Notez que le compilateur Delphi aligne Vftables sur une limite de 4 octets (pour l'optimisation).
Par exemple, le VA 0x0046E1C8 suivant contient le décalage 0x0046E214 , qui est 0x4C avant l'emplacement actuel. Comme indiqué dans Ida:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
Cette approche peut générer de faux positifs, par conséquent, d'autres champs dans le VFTABLE sont vérifiés pour des valeurs sensées. Par exemple, le vmtInstanceSize est vérifié pour s'assurer qu'il n'est pas excessif et que les pointeurs de fonction sont vérifiés pour se situer dans une section exécutable. Lors du test, le taux de faux positifs était très faible, malgré la méthode de recherche de force brute.
Chaque fonction trouvée dans un VFTable est vérifiée pour voir si elle est héritée du parent ou surchargé. Delphi ne prend pas en charge l'héritage multiple, ce qui peut être réalisé en vérifiant le pointeur dans le parent vftable avec le même décalage.
Si les deux pointeurs font référence à la même fonction, il est hérité. Si l'enfant a un pointeur différent, il a été surchargé.
La sortie principale de l'outil est un fichier JSON qui peut être introduit dans un traitement / outils de traitement ultérieur. Cependant, quelques autres formats de sortie sont inclus.
Utilisez l'option --save-tree pour générer un fichier comme:
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) et ajustez la numérisation pour différentes mises en page VFTABLE.call [ecx+3Fh] à une méthode d'instance)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> qui sont assez indéchiffrables dans IDA.Veuillez m'envoyer des exemples de binaires où cet outil ne fonctionne pas, il peut donc être amélioré.