|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : juillet 2012 Messages : 3 ![]() |
Bonjour,
J'ai besoin de récupérer une partie de code source d'un programme dont l'auteur a abandonné le projet et reste injoignable. À partir du programme Delphi, j'ai pu obtenir le code assembleur de la procédure voulue. Comme je n'arrive pas bien à lire l'assembleur, quelqu'un peut-il me le traduire en autre chose ? Le code concerne une boite de dialogue dans laquelle un champ de saisie permet de rentrer une clé, un autre permet de lire une clé, et un bouton permet de transformer la première vers la deuxième. S'il y a besoin d'autres parties de code assembleur, je peux les fournir. Merci ! Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Bonjour,
Citation:
Citation:
Parce qu'en l'occurrence, ce code ne fait qu'appeler dans l'ordre toutes les routines que tu as citées toi-même : affichage du champs de saisie, du bouton, etc. Il n'y aucune référence interne ni saut à l'intérieur de la routine, sauf pour la gestion des exceptions avec Try Catch Finally. |
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : juillet 2012 Messages : 3 ![]() |
Je souhaite savoir quel est l'algorithme qui est utilisé pour passer d'un champ à l'autre. Le deuxième champ contient un code servant à désinstaller une application sur des postes, et comme cette application doit être désinstallée de tout un parc, j'aimerais éviter d'avoir à saisir le code pour chaque ordinateur.
EDIT: je n'y connais rien en assembleur (au mieux je sais ce que signifie mov eax, ebx), et j'espèrerais qu'on puisse trouver l'agorithme quelque part dans ce code. |
|
|
00
|
|
|
#4 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Hélas non. Ce code assembleur est très court, même s'il paraît fourni par rapport au code source d'un langage de plus haut niveau.
Les premières lignes sont le prologue classique de l'ouverture d'un cadre de pile et de l'entrée dans une fonction : on empile EBP puis on sauvegarde ESP (le pointeur de pile) dans EBP pour pouvoir ramener cette pile dans son état initial en restaurant ce pointeur en cas de pépin (comprendre : une exception). « XOR ecx,ecx » met ECX à zéro et les « push ECX » réservent et nettoient simultanément 28 octets dans la pile pour les variables locales.Les « mov » suivants servent à sauvegarder les paramètres de la fonction, passés initialement dans les registres EAX et EDX. Un nouveau « push EBP » permet de remonter plusieurs cadres de pile en cascade si besoin et, enfin, le « push 004AB1E7 » correspond à l'adresse de ton « Finaly » tout en bas de ton code. En tête de pile, un simple « ret » nous y emmènera directement au lieu de quitter la fonction. Ce prologue est la section la plus longue de ton programme et pourtant, il ne correspond encore à rien ! C'est en gros ce qui est produit à partir du moment où tu as écrit « BEGIN ». Tout le reste du code correspond à la gestion de tes objets et tu vois qu'à chaque fois, le code est ridicule : un registre chargé, un appel à une fonction extérieure et c'est à peu près tout. Ton désassembleur a le bon goût de te mettre en commentaire les appels auquels chaque section correspond. Tu peux presque les considérer, donc, comme le code source original ! Tout cela est dû au fait qu'on est en présence d'un MVC et de programmation orientée objet : les fonctions qui nous intéressent sont considérées comme des méthodes ou fonction-membres de ces dits objets et la routine que tu as désassemblée ne fait que les invoquer. Tout le travail se fait donc automatiquement et à un autre endroit. Question subsidiaire : de quel logiciel s'agit-il ? En outre, le MVC fait que tes objets sont sollicités lorsqu'un événement extérieur au programme se produit, comme un clic de la part de l'utilisateur. Dans ce cas, c'est le système d'exploitation, puis le framework utilisé, qui vont automatiquement appeler de leur propre chef une fonction de callback définie à l'avance, et parfois même directement à la compilation. Il n'y a plus qu'à trouver la bonne routine. |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : juillet 2012 Messages : 3 ![]() |
Merci pour les explications !
Peut-être que la routine qui génère le code est cachée derrière "TClientSocket._PROC_00487ED4". Le programme d'appelle IACA mais n'a pas de diffusion publique, vu qu'il sert uniquement au sein des établissements scolaires. De toute façon je l'ai en grande partie supprimé via des scripts, mais j'aurais aimé connaître l'algo... juste pour le fun. |
|
|
00
|
|
|
#6 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
S'agit-il de ceci ? : http://crdp.ac-reims.fr/iaca/
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com