Dans notre société, nous avons un petit programme (taille .exe de 500 Ko) qui effectue un calcul mathématique et qui finit par cracher le résultat sur une feuille de calcul Excel que nous utilisons pour poursuivre notre flux de travail.
Je souhaite modifier les colonnes, le format d'espacement et ajouter une logique VBA, etc. sur la feuille de calcul Excel, mais comme ces paramètres ne sont pas configurables dans ce programme, il me semble que le seul moyen de le modifier consiste à décomposer / effectuer un reverse engineering du fichier .exe.
Personne ne sait dans quelle langue il a été programmé, la seule chose que nous sachions est:
- Développé il y a plus de 20 ans
- Developer a pris sa retraite il y a 10 ans
- Application graphique
- Fonctionne seul
- Taille 500Kb
Des suggestions quelles options j'ai pour faire face à ce genre de problèmes? L'ingénierie inverse est-elle la seule option ou existe-t-il une meilleure approche?
Réponses:
L'ingénierie inverse peut devenir très difficile, voire plus, si vous ne voulez pas seulement comprendre la logique du programme, mais la modifier et la recompiler. Donc, la première chose que je voudrais essayer est de chercher une solution différente.
Si c'est la seule chose que vous voulez, et si le calcul effectué par le programme est correct, pourquoi ne pas écrire un programme dans la langue de votre choix (peut-être une macro Excel) qui appelle votre ancien "exe", prend la sortie et la traite plus loin.
la source
subprocess.run()
, personnellement.PIPE
constante magique . Sinon, vous ne le faites pas et il est jeté. Qu'est-ce qu'il y a à comprendre?Shell
appel dans Excel VBA comme celui-ci: stackoverflow.com/questions/8902022/… , il est possible de diriger le stdout / stderr de l'utilitaire cmd dans des fichiers séparés, puis d'appliquer le formatage de sortie.En plus des réponses déjà données par Doc Brown et Telastyn, je voudrais suggérer une approche alternative (dans l’hypothèse où cela est essentiel à la mission).
Si vous ne connaissez pas les calculs qu'il effectue et que les calculs sont (quelque peu) critiques, vous devez: déduire la logique d'origine du
.exe
fichier par tous les moyens nécessaires. Décodez-le en utilisant un décompilateur / désassembleur comme IDA si nécessaire. Embaucher un consultant (ou un lot de consultants) si nécessaire.Bien sûr, contourner le problème pour le moment en utilisant leur solution, mais ne le laissez pas être.
La raison que je suggère est la suivante: Vous avez admis que les calculs sont très complexes (selon un ingénieur avec qui vous avez parlé). C'est aussi critique. Ainsi, si, d'une manière ou d'une autre, l'original
.exe
cesse de fonctionner en raison de modifications des plates-formes dont vous disposez (le support 16 bits est peut-être supprimé?), Vous venez de perdre un élément de connaissance essentiel à la mission .Maintenant, je ne m'inquiète pas de perdre le
.exe
, mais de perdre la connaissance qu'il code. Cette connaissance doit être récupérée.Comme auparavant: si ces connaissances sont déjà disponibles, assurez-vous de les écrire dans un format qui ne sera pas perdu de sitôt. Sinon, récupérez-le et écrivez-le.
la source
Demandez au programmeur d'origine, si possible.
Il y a quelques semaines, j'ai été contacté par une entreprise avec laquelle je travaillais il y a 10 ans, avec la même question à propos d'un fichier mdb développé au milieu des années 90.
la source
Si tout ce que vous cherchez à faire est de modifier le résultat, pourquoi ne pas simplement utiliser la composition?
Au lieu de modifier la boîte noire , vous ne pouvez pas accéder facilement, vous créez un nouveau programme qui prend la sortie Excel et que votre mise en forme / colonne change aussi . Ensuite, vous pouvez créer un nouveau script / exe qui appelle les deux programmes dans l'ordre. Il apparaît donc à l'utilisateur final qu'il n'y a qu'un seul programme qui effectue tout le travail, même s'il s'agit de deux étapes distinctes.
la source
Il existe des entreprises spécialisées dans ce type de problème. Ils utilisent un code propriétaire pour décompiler le code natif dans un langage de haut niveau, puis utilisent une expertise humaine pour le rendre utile (par exemple, en donnant à des variables des noms appropriés).
Il y a quelques années, mon employeur a utilisé cette méthode pour migrer du code mainframe S / 390 natif sur des serveurs Linux. Nous leur avons donné un binaire, ils nous ont donné le code source en C.
Que cela soit nécessaire dans votre cas, c'est à vous de décider. Si vous ne vous souciez que du format de la sortie, vous pouvez simplement masser la sortie après sa production. Cependant, comme d'autres l'ont souligné, la logique métier dissimulée dans un blob binaire peut constituer un risque permanent.
la source
Écrivez un simple wrapper autour du programme, en capturant sa sortie. Il n’est pas complexe de faire autant de langages ( Java , C ++ , Python , .NET , par exemple) ont des moyens pour cela. Analyser la sortie et en générer une autre, sous la forme souhaitée. L'utilisateur appellera votre nouveau programme. L'ancien exécutable reste à côté de celui-ci ou peut même être extrait automatiquement de la ressource avant de l'invoquer.
Cette solution ne fonctionne bien sûr que lorsque la sortie est bien structurée et facile à analyser.
Qu'il s'agisse d'une application graphique, ce n'est pas un problème de blocage. Vous pouvez le lancer, générer une sortie, puis le post-traiter automatiquement à la fin de cette interface graphique.
la source
Écrire des tests qui exercent autant de cas que possible sur l'ancien code. Trouvez des cas de coin, testez une entrée incorrecte et testez une entrée correcte.
Identifiez ce qui est correct en sortie dans différents cas, puis essayez d’écrire une implémentation répondant aux mêmes tests .
Je ne voudrais pas aller dans la voie de l'ingénierie inverse. Il est incroyablement compliqué d'inverser le code machine et vous devriez déjà savoir à quoi sert l'exe. L'ingénierie inverse est un peu trop de travail pour ce que vous êtes après.
Si le logiciel a été développé par un gars il y a 20 ans, ce n'est probablement pas quelque chose qui nécessite beaucoup de puissance moderne. Un programme d'interface graphique qui a étendu la machine il y a 20 ans s'enregistrera à peine sur une machine moderne. Vous recherchez donc probablement quelque chose de relativement simple à reproduire.
la source
Essayez de faire de l'ingénierie inverse avec l'exe. Seulement dans le but de trouver la logique de calcul ou au moins pour avoir une idée juste de ce qu'elle fait réellement et si votre ingénierie inverse peut vous mener à ce point, vous pouvez écrire une nouvelle application basée sur cette logique de calcul. En dehors de cela, je ne vois pas d'autre moyen.
Plus facile à dire qu'à faire, faire de l'ingénierie inverse un exe créé il y a 20 ans est un véritable défi.
la source