Comment modifier la sortie d'un programme pour lequel vous n'avez pas le code source

89

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:

  1. Développé il y a plus de 20 ans
  2. Developer a pris sa retraite il y a 10 ans
  3. Application graphique
  4. Fonctionne seul
  5. 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?

Alec
la source
149
Savez-vous quel est le calcul qu'il effectue? Si tel est le cas, écrivez une nouvelle application, insérez quelques données de test dans les deux applications pour vérifier si la nouvelle fonctionne de la même manière, puis jetez l’ancienne. Ensuite, effectuez les modifications souhaitées.
David Arno
13
Le commentaire de @DavidArno apporterait une bonne réponse. L'ingénierie inverse est possible, mais modifier les spécifications et réécrire l'application sera beaucoup moins cher / plus facile / plus rapide.
Dan Pichelman
44
L'autre façon de le modifier serait de prendre le résultat obtenu par le programme original et de le filtrer comme vous le souhaitez.
Blrfl
9
@Alec si vous ouvrez le fichier .exe avec un éditeur hexadécimal, vous obtiendrez peut-être des indices sur son contenu. Par exemple, le nom du compilateur pourrait être incorporé. De là, vous en saurez plus sur les options de décompilation possibles.
GrandmasterB
26
Alternativement, vous pouvez essayer de trouver le monsieur qui a écrit la demande et voir s'il est prêt à entrer pour un jour ou deux (peut-être quelques heures par jour) en tant que consultant. S'il est un développeur retraité, il a une chance modérée d'apprécier un peu d'argent de dépense à un taux de 100-150 $ / heure tout en profitant du moment de travailler un peu pendant un court laps de temps.
RLH

Réponses:

234

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.

Je souhaite modifier les colonnes, le format d'espacement et ajouter une logique VBA, etc. sur la feuille de calcul Excel

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.

Doc Brown
la source
9
Pourquoi le nouveau programme doit-il appeler l'ancien EXE? Pourquoi ne pas simplement rendre le nouveau programme indépendant et ensuite écrire un script qui appelle les deux et coordonne la sortie et l'entrée? Mon expérience suggère que laisser des langages de ligne de commande tels que bash, PowerShell ou des coordonnées de processus de traitement d'invite de commande est généralement plus simple que d'essayer de le coder vous-même dans un langage impératif. Sinon, +1.
JPMc26
8
@ jpmc26: C'est vrai jusqu'à ce que vous ayez à gérer les règles de citation absurdes de Bash. Oui, ils sont (pour la plupart) compatibles avec POSIX. Non, ils n'ont aucun sens putain. $ FOO ne devrait pas séparer les mots, par exemple.
Kevin
16
@ jpmc26: Je n'ai jamais eu de difficulté à appeler subprocess.run(), personnellement.
Kevin
3
@ jpmc26: Quelle tuyauterie? C'est un livre de cuisine pur; si vous voulez stdout, vous passez la PIPEconstante magique . Sinon, vous ne le faites pas et il est jeté. Qu'est-ce qu'il y a à comprendre?
Kevin
3
... Je devrais ajouter que j’avais utilisé Excel avec VBA dans le passé comme interface pour les utilitaires de ligne de commande avec beaucoup de succès plusieurs fois. La structure est toujours la même: une feuille pour entrer les paramètres en tant qu '"interface utilisateur du pauvre", un bouton "Démarrer" sur cette feuille. Dans le code VBA, il faut un Shellappel 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.
Doc Brown
114

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 .exefichier 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 .execesse 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.

Postme de Sjoerd Job
la source
14
Les décompilateurs modernes produisent en réalité un code assez lisible, en particulier si la source originale est en C ou en assembleur, et non dans un langage de niveau supérieur.
Phyrfox
4
Très bon point. Aussi: il suffit de le corriger pour qu'il fonctionne à nouveau jusqu'à ce que le prochain correctif soit implémenté.
Daniel Jour
33
@phyrfox 20 ans ... le développeur a pris sa retraite il y a 10 ans ... seule la sortie est un tableur Excel ... je mettrais de l'argent sur cela étant une application VB6.
J ...
10
@micaho: ou l'entreprise existe toujours et la personne possédant le savoir-faire pour vérifier les résultats et les hypothèses cachées vient d'être frappée par un camion. Bien sûr, il s’agit d’un risque commercial, de sorte que les parties prenantes devraient en dernier ressort décider. Je voulais juste souligner que le "wrapper" fonctionnera maintenant, mais ne fera qu'ajouter à la dette technique.
Postes de Sjoerd Job
22
@J ...: S'il s'agit de VB6, l'affiche originale a de la chance. Vous pouvez récupérer le code source d'une compilation VB6 assez facilement.
Eric Lippert
74

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.

Paolo
la source
52
C'est le vrai fruit à portée de main. Tout le monde (y compris moi-même) rompt avec l'utilisation de compétences de programmation complexes telles que le reverse engineering, la réimplémentation des fonctionnalités du programme ou l'ajout de couches au traitement des données. En réalité, le meilleur endroit pour commencer est un email amical qui pourrait revenir dans une heure avec l'emplacement du code source ou une autre solution idéale.
user1717828
2
Quand à la maison avec une application de 10 ans moi aussi je déclenche un désassembleur mais pendant les heures de travail l'objectif est différent ^^
Paolo
2
Vous êtes-vous souvenu de quelque chose à ce sujet? :)
Angel
2
bien sûr! Malheureusement, la société a été soumise à trois acquisitions et fusionnements, de sorte que de nombreuses informations ont été perdues et qu'une partie des sauvegardes était dans le sac perdu.
Paolo
1
Recherchez dans l'EXE des chaînes incorporées pouvant inclure le nom d'un développeur ou quelque chose du genre. C'est plus facile qu'un démontage complet!
JDługosz
55

Des suggestions quelles options j'ai pour faire face à ce genre de problèmes?

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.

Telastyn
la source
2
@Alec Le fait que Java soit une langue appropriée ou non dépend principalement de la quantité de données que vous devez gérer / de la quantité de calculs que vous devez effectuer. Si les deux sont faibles, java va bien. Si l'une ou l'autre est critique, vous feriez mieux de passer en C ou C ++. Mais comme vous semblez n'utiliser que des quantités de données qui s'inscrivent dans un tableur Excel, je ne pense pas qu'il y ait suffisamment de données pour faire de Java un mauvais choix (Excel exploserait probablement avant votre application).
cmaster
18
@cmaster L'idée que Java est prohibitif pour les calculs lourds est une notion dépassée. Le pire point de référence indiqué ici n'est même pas 4x (la plupart sont 2x ou moins) et si un point scalaire à un chiffre est votre point de rupture, les économies en matière de sécurité (qui se traduisent directement en dollars des développeurs) vont probablement compenser les pertes de performances. .
CorsiKa
8
@Alec n'importe quelle langue fonctionnera. VBA semble être un bon choix car il intègre déjà si bien Excel.
Captain Man
4
@corsiKa Cela dépend entièrement de la taille de votre application. Si une seule exécution consomme plusieurs dizaines de milliers d'heures de processeur, un facteur de 2 ou 4 devient prohibitif: il se traduit directement par le nombre de résultats que vous pouvez obtenir sur plusieurs millions de machines. En outre, ces applications fonctionnent généralement en mode parallèle, de sorte que la récupération de place est un pur poison pour leurs performances, les petites interruptions se multipliant par le nombre de processus. Je vous le dis, de telles applications existent et elles ne sont certainement pas écrites en Java. Ils ne sont tout simplement pas utilisés par les entreprises Internet moyennes.
cmaster
7
@cmaster Nous parlons de calculs simples, et non d'un moteur de jeu AAA complet avec illumination globale en temps réel, rendu physique, octrees de voxel éparpillés animés, simulation de champ de physique universelle, etc. Aucune infraction, mais l'insertion d'un argument RE performance ici est mauvaise. La facilité d'utilisation devrait être au premier rang, et en tant que personne utilisant le C ++ depuis quelques années, c'est le dernier langage que je recommanderais dans ce cas.
3

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.

svelte
la source
3

É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.

h22
la source
3
En quoi cela diffère-t-il de la réponse votée par le plus voté de Doc Brown?
Laf
Je ne suis pas d'accord avec l'hypothèse selon laquelle la réponse de Doc est mal écrite. C'est clair et succinct.
Mât
1
Si vous examinez le texte de cette réponse, vous verrez que la seule partie informative constitue exactement la fin de la dernière phrase "qui appelle votre héritage" exe ", prend la sortie et la traite plus avant."
h22
2
Pas un vote négatif, et je ne vois pas pourquoi cela a eu -3 ... Est-ce que Meta a encore une fois? mais séparément, je vous conseillerais de ne pas critiquer quelqu'un d'autre pour "contient beaucoup de blah qui dilue le cerveau" quand (A) c'est un jugement subjectif et (B) à mon avis subjectif, le vôtre contient tout simplement ça!
underscore_d
Cela peut également être réécrit en "contient des causeries génériques non informatives qui détournent l'attention du sujet et qui font perdre du temps aux lecteurs", si cela semble plus utile. Fournit un indice sur la bonne approche pour la seconde partie de la dernière phrase. Cela n'avait aucune intention d'être insultant. Commentaire supprimé.
h22
1

É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.

Carlos
la source
0

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.

Mukesh Adhvaryu
la source
12
La datation de l'exe ne devrait pas vraiment compter
vendredi
1
En fait, avec l'optimisation des optimiseurs chaque année, l'ingénierie inverse devient de plus en plus difficile.
MSalters