Delphi décompilation
Pourquoi la décompilation d'un delphi exe, est si facile, par rapport à d'autres exécutables construit avec d'autres langages de programmation/compilateurs?
Pourquoi pensez-vous que c'est facile?
La décompilation de qualité sont disponibles pour tous les langages compilés, je suis conscient de. Surtout que la qualité est assez médiocre.
Sachant que les noms de visual classes de composants (par exemple.,
Le programme vous lien pour crée un .pas de fichiers avec
Si je me souviens bien DeDe est juste un désassembleur qui comprend un peu de Delphi métadonnées. Il appelle un decompiler est trompeuse.
La décompilation de qualité sont disponibles pour tous les langages compilés, je suis conscient de. Surtout que la qualité est assez médiocre.
Sachant que les noms de visual classes de composants (par exemple.,
TMyForm
, TEdit1
, etc.) ne pas vous aider à tout savoir sur les fonctionnalités de l'application. Votre réclamation que ce qui rend plus facile à décompiler est un non-sens, sachant que Delphi32 utilise une classe de fenêtre nommée TAppBuilder
ne signifie pas que vous pouvez écrire une nouvelle version de Delphi IDE avec les mêmes fonctionnalités.Le programme vous lien pour crée un .pas de fichiers avec
assembler code
à l'intérieur. pas vraiment ce que j'appellerais une décompilé programme, qui a été démonté. Il ne fait rien de spécial.Si je me souviens bien DeDe est juste un désassembleur qui comprend un peu de Delphi métadonnées. Il appelle un decompiler est trompeuse.
OriginalL'auteur BlackShadow | 2011-05-25
Vous devez vous connecter pour publier un commentaire.
Il ya quelques choses que l'aide à inverser delphi programmes:
published
visibilité des métadonnées utilisé avec RTTIclasses
. Et pour n'importe quelle instance d'une classe, il vous arrive de voir dans le débogueur, vous pouvez obtenir son VMT et donc son nom de la classe.Delphi utilise des fichiers texte décrivant le contenu de votre formulaire et de crochets de gestionnaires d'événements par nom. Évidemment, cette approche a besoin de suffisamment de métadonnées pour désérialiser que la représentation textuelle d'un crochet et les gestionnaires d'événements par nom.
Une alternative quelques autres kits graphiques utilisation est auto-génération de code qui initialise le formulaire et les crochets du gestionnaire d'événements avec le code. Étant donné que ce code utilise directement les pointeurs vers les gestionnaires d'événements et affecte directement les propriétés/appels setters il n'a pas besoin de métadonnées. Qui a pour effet secondaire que l'inversion devient un peu plus difficile.
Il ne devrait pas être trop difficile de créer un programme qui transforme un fichier dfm en une série d'instructions codées en dur qui crée la forme à la place. Si un outil comme Dédé ne fonctionne pas bien plus. Mais ce n'est pas le gain de beaucoup dans la pratique.
Mais de déterminer qui evenhandler correspond à qui le contrôle/l'événement est encore assez facile. Surtout depuis que des choses comme le FLIRT identifie la plupart des fonctions de la bibliothèque. Vous avez juste besoin d'un point d'arrêt de la celle qui vous intéresse et puis l'étape dans le code de l'utilisateur.
C'est pas une question de langue, mais de la façon dont votre toolkit graphique/GUI designer. Mais l'inversion de la partie GUI est rarement intéressant. Il vient vous aide à obtenir pour les parties du code qui vous intéresse plus rapide.
ok, compris. Merci 🙂
Dans le cas de la construction avec les paquets, il est sans doute encore plus facile d'obtenir une liste complète de RTL/VCL entrypoints.
Je pense que les paquets d'exportation de toutes les fonctions à l'aide de dll exportations, avec un nom décomposé. Mais je m'attends à FLIRTER fonctionne pas aussi bien que cela n'a pas beaucoup de différence dans la pratique.
OriginalL'auteur CodesInChaos
L'énoncé est faux. Delphi n'est pas particulièrement plus facile à décompiler que le code produit par les autres grands compilateurs.
Si vous avez été en mesure de prouver que les résultats de la décompilation de Delphi exécutable étaient d'une qualité significativement plus élevée que dans les autres langues couramment utilisés ensuite votre question aurait plus de poids.
Ma réponse se trouve. Où est votre preuve que Delphi de l'exécutable est plus efficace décompilé que MSVC? Si votre question était uniquement destinée à se référer à des compilateurs qui émettent en code natif, pourquoi ne pas vous le dire?
Pas besoin d'être méchant. CodeInChaos décrit le raisonnement bien. Fondamentalement, Delphi programmes de conserver beaucoup plus de métadonnées que les autres compilateurs natifs (certainement plus que, par exemple, VC/MFC programmes), qui fait renverser plus facilement.
Cosmin de l'histoire n'est pas vraiment pertinent. Il a essayé de renverser une seule fonction dans une DLL unique, il n'implique pas de métadonnées. Réel Delphi applications ont de nombreuses classes pour lesquelles la plupart des détails sont disponibles dans le RTTI: le nom, la taille, la hiérarchie d'héritage, les noms des champs et des gestionnaires d'événements pour les événements de l'UI et ainsi de suite. Par exemple, voici ce qui peut être récupéré à partir de l'exécutable pour un seul formulaire: pastie.org/private/bexiwdctu7scsrafqqsw (fait avec un IDC script). De cette façon, vous pouvez restaurer presque complète des schémas de nombreuses classes qui accélère inverser de façon significative.
Lors de l'inversion, tous les rebuts de l'information qui peut être utile, "fluff" ou pas. Même isolé des fonctions de code ont pour interagir avec le reste du programme et les infos supplémentaires que vous pourriez avoir au sujet de qui vous aideront.
OriginalL'auteur David Heffernan
Histoire de la tranchée: la Décompilation d'un minuscule Delphi DLL
J'ai été par le biais d'un Delphi décompilation session de moi-même. Il était l'un de ces faux-sondage "j'ai perdu mes sources" chose, je n'ai vraiment perdre les sources pour une minuscule Firebird UDF de la bibliothèque. Maintenant, je fais pas mieux, je n'ai pas sauté à droite dans la décompilation parce que la bibliothèque était si petit et je savais que d'une réécriture serait beaucoup plus rapide.
Cette DLL exporte une fonction qui ressemble à ceci:
Après avoir fait de la sane chose et la réécriture de la fonction et de faire des tests de régression, j'ai découvert quelque coin obscur-les cas où la nouvelle fonction du résultat n'était pas la même que l'ancienne fonction du résultat! Le problème était, la nouveau fonction du résultat en a été le résultat correct, l'ancienne DLL contenait un BUG et j'ai eu à reproduire le BUG - avec cette fonction, la cohérence est plus importante que la précision.
Encore une fois, ne le sane chose et a essayé de "deviner" le BUG. Je savais que c'était un arrondi de la question, mais ne pouvaient tout simplement pas comprendre ce que c'était. Finalement, j'ai décidé de donner la décompilation j'essaie. Après tout, c'était une petite bibliothèque, le point d'entrée a été simple et je n'ai pas vraiment besoin de re-code compilable, ni 100% décompilation: j'ai seulement besoin de suffisamment de comprendre le vieux BUG donc je peux le reproduire!
Décompilation a échoué! J'ai essayé beaucoup de différents, la décompilation, y compris un couple de "commercial". La plupart des produits que sur la surface ressemblait à de bonnes données, mais pas assez pour comprendre le vieux bug. Le plus prometteur, celui avec la version spécifique de la connaissance de la VCL et RTL a donné le pire échec: bien sûr, c'compris le RTL appels, leur a donné des noms, mais impossible de trouver la fonction exportée! La seule fonction que j'étais intéressé n'a pas été montré int la liste des points d'entrée, et il aurait été tout droit de l'avant, puisque c'est un exporté fonction.
Cette décompilation tentative aurait été facile parce que:
Ma solution
Après décompilation échec de moi, je me suis tourné vers mes propres fidèle Delphi IDE pour le débogage. J'ai écrit un petit programme Delphi directement importations la fonction de la DLL, s'est créé un faux Firbird gestionnaire de mémoire DLL donc mon fichier DLL peuvent charger, appelé mon ancienne fonction avec les paramètres que je connaissais serait donner de mauvais résultats, steped dans le code en utilisant le débogueur et étroitement surveillés par les registres FPU. Après quelques tentatives infructueuses, j'ai enfin remarqué une valeur a été utilisée à partir de la pile FPU as integer où il ne devrait pas en Entier donc j'ai eu mon BUG: j'ai malencontreusement défini un Entier variable locale où j'aurais la Monnaie utilisée. Armés de cette connaissance, j'ai pu reproduire le bug.
Il serait bon de savoir si la cible Delphi versions de la décompilation vous avez utilisé correspondait à la version de la DLL a effectivement été compilé avec.
match parfait: la DLL a été construit avec Delphi 7.
OriginalL'auteur Cosmin Prund
Seule chose qui est plus facile à Delphes est en train de récupérer VCLs.
Après l'utilisation de la décompilation comme Dédé, vous obtiendrez interface utilisateur de l'application, mais sans aucune logique.
Donc, si vous souhaitez récupérer uniquement les formes et les boutons - Delphi est plus facile que d'autres compilateurs, mais si vous voulez savoir ce qui se passe après avoir cliqué sur le bouton, vous aurez besoin d'utiliser ollydbg ou autres (debugger/désassembleur) comme pour les autres langues qui crée des fichiers exécutables.
OriginalL'auteur Jarek Bielicki
Il y a des avantages et des inconvénients. Je ne suis pas sûr de ce que l'angle de votre se référant à être plus facile. Il y a aussi une énorme différence dans un 1 formulaire de demande simple, par rapport à un très approfondie de l'application qui a de nombreuses formes et des tonnes de classes et de fonctions. C'est comme le bloc-notes rapport à Office 2013 (étant donné qu'ils ont été codé en delphi, juste un exemple de comparer la complexité de la langue).
Dans une petite app, avoir des informations supplémentaires Delphi apps "habituellement" contiennent peut rendre un jeu d'enfant. Cependant, dans une grande application, il peut "aider", mais vous avez un million d'appels de creuser à travers. Ils peuvent vous aider à obtenir dans les environs, mais les appels à l'intérieur d'appels à l'intérieur d'appels, puis de multiples retours utilisés comme des sauts... en fait vous avez le vertige. Ensuite, si l'application "a été" emballé ou protégé, certaines choses peuvent encore être brouillé la pagaille. Bien qu'il puisse travailler de programmation sage, de la lecture il peut être beaucoup plus difficile. J'ai été dans l'une, l'autre jour, où toutes les chaînes sont cryptées, donc "référencé chaînes de texte" ont été d'aucune aide, et le chiffrement n'était pas un simple md5 ou base64, c'était un algorithme personnalisé. Peut-être un MD5 avec le sel, puis encodé en base64? Je n'ai jamais pu obtenir de la méthode exacte sur les cordes. Je savais ce que certains d'entre eux étaient censés être, mais je ne pouvais pas reproduire la méthode, même si il a regardé comme il était en base64, il a été le base64 de la chaîne déjà chiffré certains comment... je ne vous fiez pas sur les chaînes de texte, mais dans une grande grande application, chaque petit peu aide.
Bien sûr, mon interprétation de cette question, était à la recherche d'un Delphi exe dans OllyDbg. Je pourrais être hors de la base sur l'endroit où vous les gars allaient avec ce sujet, mais j'ai l'impression en ce qui concerne Olly et la marche arrière, je suis sur le point (si c'est ce dont tu parlais) lol.
OriginalL'auteur Wade