web-dev-qa-db-fra.com

Trouver le langage de programmation utilisé

Quelle est la façon la plus simple de savoir dans quel langage de programmation une application a été écrite? Je voudrais savoir si son vb ou c ++ ou delphi ou .net etc à partir du fichier exe du programme.

34
veagles

Essayez PEiD

bien sûr, s'ils ont utilisé un packer, un déballage devra être fait en premier :)

27
John T

Démarrez-le et vérifiez les DLL d'exécution qu'il utilise avec Process Explorer.

Si cela ne le rend pas immédiatement évident, recherchez sur le Web des références à ces DLL.

La plupart des désassembleurs (y compris Olly je pense) peuvent facilement vous montrer le texte contenu dans un EXE ou une DLL, et cela peut aussi parfois donner un indice. Les types Delphi sont souvent préfixés avec T comme dans TMyClass.

S'il s'agit d'un petit exécutable sans références DLL et sans texte, vous pourriez être SOL. À ce stade, vous devrez rechercher les idiomes de compilateurs particuliers, et ce serait principalement une conjecture.

11
Ed Guiness

Il existe un art pour détecter dans quelle langue un programme a été écrit. C'est possible mais il n'y a pas de règles strictes et rapides. Cela demande beaucoup d'expérience (et cela mène également à la question "Pourquoi voudriez-vous ..." mais voici quelques idées sur la façon de procéder).

Ce que vous cherchez, c'est une "signature". La signature peut être une certaine chaîne incluse par le compilateur, une référence à une API qui est assez courante dans l'outil de programmation utilisé, ou même un style de programmation commun aux outils utilisés, visible dans les chaînes contenues Dans l'application.

De plus, il existe des styles de déploiement d'une application: divers fichiers de configuration trouvés dans le répertoire de déploiement, des DLL et des assemblages et même des images, des répertoires ou des icônes.

Les applications Java enveloppées dans un exécutable à lancement automatique contiendront des références à Java libs, et auront probablement certaines bibliothèques ou fichiers inclus dans le même répertoire qui indiquent qu'il s'agit de Java.

Comme indiqué dans d'autres réponses, un assembly géré affichera également certains signes: vous pouvez l'ouvrir dans Reflector etc. Bien qu'il soit correct que c # et VB sont "interchangeables" une fois compilés, ce n'est pas le cas). il est vrai qu'ils sont identiques. Si vous utilisez Reflector pour démonter le code VB), vous verrez très souvent que l'assembly fait référence à l'assembly Microsoft.VisualBasic.dll. être capable de faire la différence entre les applications Mono car elles contiendront très probablement des références aux assemblages mono.

De nombreux compilateurs assemblent et lient le code de certaines manières, et laissent des traces de pas. Par exemple, en examinant un exécutable de fenêtre à l'aide de "strings: tab dans Process Explorer , vous verrez beaucoup de chaînes. En les utilisant, vous pourrez déterminer les styles de programmation, les méthodes appelées, les méthodes d'erreur ou de trace sans l'exe.

Un exemple est que les compilateurs utilisent différents mécanismes de localisation: Microsoft stocke les chaînes localisées dans des fichiers XML ou des fichiers de ressources. D'autres compilateurs utiliseront une tactique différente.

Un autre exemple est c ++ nom mangling . Le compilateur CodeWarrior utilise un algorithme différent pour modifier les noms des variables membres et des fonctions d'un appel que Visual Studio.

Je suppose que vous pourriez écrire un livre sur le sujet de déterminer avec précision la lignée de tout exécutable. Ce sujet serait probablement appelé "programmation de l'archéologie".

8
Blue Toque

Vous pouvez essayer d'utiliser Depends pour voir quelles dépendances d'exécution il a, ce qui pourrait donner des indices.

3
Paul Dixon

La façon la plus simple est de demander au développeur du programme. Il ne nécessite aucune connaissance ni aucun programme utilitaire.

2
HS.

Les langages compilés (j'entends par là aucun langage de script ou Java, .NET, etc.) sont compilés dans les instructions d'assemblage du processeur, qui sont essentiellement une conversion à sens unique. Il n'est généralement pas possible de déterminer la langue dans laquelle un programme a été écrit. Cependant, à l'aide d'une marchette de dépendances, vous pouvez potentiellement déterminer la bibliothèque d'exécution que le programme chargeait (le cas échéant) et donc déterminer la langue utilisée (par exemple MS Visual C++ 9 utilise msvcr90.dll).

1
jgottula

vous pouvez vérifier qu'il s'agit d'un assembly .net ou non en essayant de l'ouvrir avec l'outil ildasm.exe

1
Arsen Mkrtchyan
  • Déterminer l'application Delphi
  • Utilisez eda_preview270.exe (de ici ) ou un autre outil d'espionnage et vérifiez les noms de classe de fenêtre. S'ils lisent comme TButton ou TfrmBlubb, c'est une application VCL. S'il y a un "Afx" en eux, c'est probablement MFC.
1
Uli Gerhardt

Le moyen le plus simple que j'ai trouvé (au moins dans les jeux informatiques) était de regarder dans le dossier "redist" imbriqué dans le dossier principal du jeu. Il peut être évident pour certains d'entre vous qui sont plus expérimentés dans la programmation vous-même, mais le but spécifique du MSI dans ce dossier est de permettre au fichier setup.exe d'installer automatiquement les prérequis pour le jeu lui-même. Par exemple: Dans Empire Total War, il existe un MSI appelé "vcredist_x86-sp1.exe". Cela indique que le jeu/programme a été écrit dans "Visual C 2005" de Microsoft dans le .NET Framework (généralement). En fait, si vous ouvrez le MSI/EXE, le programme d'installation doit immédiatement indiquer la langue dans laquelle il est écrit et la version. La raison pour laquelle je suis familier est que je code en C # et VB dans le .NET Framework et que nous installons automatiquement les prérequis pour notre application métier. J'espère que cela vous aidera!

0
ITGuyOU

En général, vous ne pouvez pas.

Si vous pouvez le charger dans Reflector , vous savez qu'il s'agit d'un assembly géré.

0
i_am_jorf

C'est une bonne question. Il n'y a aucun moyen général de le savoir, mais je parie que la plupart des compilateurs et des bibliothèques laissent une marque dans le fichier EXE résultant. Si vous vouliez y consacrer beaucoup de temps, vous pourriez rassembler un tas d'EXE écrits dans des langues connues et rechercher des chaînes courantes. J'imagine que vous en trouveriez.

Dependancy Walker , que quelqu'un d'autre a mentionné serait un bon moyen de rechercher des dépendances révélatrices, comme les versions de MSVCRT, etc.

0
Chad Okere

Si je me souviens bien PE Explorer Disassembler donne quelques informations sur le compilateur qui crée donné pas .net et Java binaire, pour .Net Use Reflector ou ILDAsm outil

0
Arsen Mkrtchyan

Voici une grande vidéo expliquant comment décompresser le fichier .exe, s'il était compressé avec UPX. Logiciel dont vous avez besoin pour cela: PEiD , OllyDbg , ImpREC

Après avoir décompressé le fichier binaire, vous pouvez vérifier avec PEiD de quel langage de programmation le binaire dispose.

0
John Smith

j'essaierais d'exécuter le .exe à travers un programme de "chaînes" pour obtenir des conseils assortis.

0
Scott Evernden