ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Nouvelle version du décompilateur Dvfp   



L'auteur

Robert Plagnard
France France
Membre Simple
# 0000000031
enregistré le 15/10/2004

http://www.ingelog.fr
PLAGNARD Robert
75015 PARIS
de la société IngéLog
Fiche personnelle


Note des membres
19/20
2 votes


Contributions > 21 - Outils

Nouvelle version du décompilateur Dvfp
# 0000000415
ajouté le 02/03/2007 18:29:02 et modifié le 02/03/2007
consulté 30209 fois
Niveau expert

Version(s) Foxpro :
VFP 9.0


Télécharger le ZIP (523.86 Ko)
Description
Corrections dans Dvfp

Historique des corrections dans Dvfp

 

Le 16/10/06

 

1) La version 3.14 ne décompile pas bien :

Gather from a fields like aa*, bb*

Dans Gather contrairement à la documentation la vraie syntaxe n’est pas :

… FIELDS LIKE | EXCEPT skeleton …

Mais

… FIELDS LIKE | EXCEPT skeleton_list …

J’ai donc rectifié les fonctions Gather_stmt() et Scatter_stmt() dans Statements.prg

 

2) Dans la version 3.14 j’avais oublié les options menu et popup dans l’instruction push. J’ai donc corrigé la fonction push_stmt() dans Statements.prg

 

3) La version 3.14 décompile bien :

x = lookup( fa, s, fb )

mais pas :

x = lookup( fa, left(s,3), fb)

qui se décompile :

x = lookup( @fa, left(s,3), @fb)

En fait il faut comprendre que la fonction lookup est compilée en donnant les adresses des champs utilisés (ici fa et fb). C’est au décompilateur d’enlever ces @ dans le cas de certaines fonctions (pour simplifier la syntaxe). A cause de la récursivité, quand une fonction appelle une autre fonction je détruisais la variable llTrimArobas car j’avais oublié de la déclarer local dans la fonction BuildExpression de Expressions.prg ! C’est corrigé.

 

4) Cosmétique. J’ai ajouté un ‘*’ devant le dump des instructions pour que le texte reste compilable.

 

Le 17/10/06

 

5) Les constantes Datetime ne se décompile pas, exemple :

dt = {^2006-10-17 12:45:00}

Je corrige en ajoutant un nouveau type de constante T_DATETIME_, je modifie donc

  • dfox.h
  • tokens.prg
  • expressions.prg

 

Dans expressions.prg je rajoute la fonction ConstDatetimeToC( double )

 

Au passage on constate que la partie entière du double est un nombre de jours alors que le nombre de secondes depuis 00h00 est égale à 86400 * la partie fractionnaire du double.

En FoxPro, pour l’arithmétique sur les types « date » 1 représente un jour, alors que pour l’arithmétique sur les types « datetime » 1 représente une seconde, pour ajouter un jour à un « datetime » il faut lui rajouter 86400 (ou passer par les fonctions de conversion).

 

Le 17/10/06

 

6) Quand on extrait l’app d’un exe et que l’app existe déjà dans la version 3.14 de Dvfp ou de Dump on obtient un message d’erreur.

Le prg AppFromExe a été modifié pour éviter cette erreur. A partir de la version 3.141 il n’y a plus d’erreur mais l’app existant est écrasé par la nouvelle extraction.

 

Le 24/10/06

 

7) Ayant découvert dernièrement la fonction aLanguage, j’ai créé un petit programme qui appelle toutes les fonctions. J’ai ainsi rajouté les fonctions suivantes qui n’étaient pas traitées :

 

AnsiToOem

Change

Completed

CpNoTrans

Network

DbAlias

Fixed

Float

GetHost

IsHosted

Pack

PadPrompt

RemoveProperty

Rollback

UnPack

 

A part RemoveProperty ces fonctions ne sont pas documentées dans la doc de ma version de VFP9.

Maintenant, toutes les fonctions données par aLanguage( array, 2) sont décompilées correctement. Les modifications de constantes et d’initialisations ont été faites dans :

  • dfox.h
  • inits.prg.

Par contre cela m’a permis de mettre en évidence une erreur dans le traitement de la fonction Icase dans le cas d’un nombre pair d’arguments. Le problème a été réglé dans le programme :

  • Tokens.

 

Le 26/10/06

 

8) Cela m’a aussi donné l’idée de regarder si toutes les commandes étaient reconnues en utilisant aLanguage( array,1). J’ai ainsi rajouté les commandes suivantes :

 

  • Assist (qui est obsolète, qui n’est là que pour compatibilité, qui ne fait rien)
  • RunScript (qui est obsolète, était une commande Mac équivalente à Run)
  • Reset

 

J’ai complété les commandes

  • Rename
  • add

 

Le 02/11/2006

Contraitement à beaucoup d'endroit où l'on peut remplacer un nom litéral par ce même nom entre quotes, il est incorrect d’écrire :

declare integer "f1" in "MyApi" as "fOne" long BufSize

il faut écrire :

declare integer f1 in MyApi as fOne long BufSize

Correction dans Declare_Stmt

Les isExpressionStr() sont remplacés par des isSringLiteral()

 

Le 17/11/06

 

9) Les rencontres AtoutFox m'ont donné des idées!

On ne décompilait pas bien du tout l'expression hyper simple :

x = $0

Il est vrai que je n'utilise pas vraiement la notation "Monnaie".

J'ai donc rajouté un type de constante Money et fait les modifs nécessaires dans dfox.h, expressions et tokens.

Maintenant cela se décompile :

x = $0.0000

ce qui est normal, car il prend 4 décimales pour les types monaie.

 

Le 20/11/06

 

9) Encore les rencontres AtoutFox ! Au passage je m'étais dis que la possibilité de glisser "distinct" dans la liste d'argument de certaines fonctions "aggregate" n'était pas une syntaxe générale de fonction :

Select count( distinct N ) from aaaa

Ne décompilait pas bien (le distinct était oublié). C'est maintenant corrigé pour les fonctions d'agrégation "Count ou Cnt Avg Max Min Sum"

 

10) On m'avait fait remarqué que le "delete view v" ne fonctionnait pas, et pour cause je l'avais oublié. Maintenant c'est OK.

 

11) Le project builder ne reconnaît pas bien les instructions du genre :

Set procedure to 'outils', 'statements'

Pour bien construire le projet il lui faut :

Set procedure to outils, statements

J'ai corrigé en ce sens.

 

Le 09/12/06

 

10) Enfin, quelqu’un qui s’intéresse de prêt à dvfp me fait remarquer que certaines certaines instructions SQL ne se décompilent pas bien. En effet, certaines sous-requêtes ne se forment pas bien. Je corrige donc très légèrement le code. Maintenant on décompile bien des requêtes du type :

select a,(select * from b),c from d

select * from a where x in (select * from b)

select * from a where exists (select * from b)

 

Le 15/02/07

 

11) Correction concernant le mot clé « like » oublié (!) dans une condition SQL

 

12) Ajout de la prise en compte d’un fichier dictionnaire (Dict.dbf) qui permet de choisir la capitalisation des variables et autres identificateurs. Si le mot appartient au dictionnaire on choisit cette capitalisation, sinon (si le dictionnaire est absent, ou si le mot n’est pas dans le dictionnaire) la casse est choisie comme auparavent (et donc pas toujours bien).

L’utilitaire MakeDict est donné pour collecter les mots voulus à partir d’un prg (que l’on obtient facilement avec l’option AllInOnce de dvfp). C’est utilitaire utilise aussi une table Tabu.dbf qui permet d’empécher certains mots (comme les mots réservés de VFP) de rentrer dans le dictionnaire (si on le désire). Bien sûr, on doit modifier à la main la casse des caractères dans le dictionnaire avant de l’utiliser efficacement dans Dvfp.

Le chemin vers le dictionnaire est paramétrable avec la variable « dictionary » de la section [cosmetic] de dvfp.ini

Commentaires
le 03/03/2007, Mike Gagnon a écrit :
Est-ce que ceci fonctionne comme Refox? Je n'a pas tout lu, mais si tu décompile un executable, est-ce que cela ramene les fichier entier (.scx et sct par exmaple) ou strictement le code? J'ai essayé par deux fois et il me donne toujours des erreurs.
le 05/03/2007, Robert Plagnard a écrit :
Oui Mike, ca ramene les fichiers .scx, .sct, .ico ... dans des répertoires scr, oth, vcl, rpt, lbl, data et prg créés, si besoin est, dans le répertoire de l'exe analysé. Mais pour cela il faut que AllInOne = <<rien du tout>> dans dvfp.ini. Par ailleurs il faut lancer dvfp avec VFP9 et stacksize=256 dans le config.fpw. Dvfp ne décompile pas les projets cryptés, ni les projets foxpro antérieurs à Visual. Si les sources ont été enlevés dans les sct, vct ... il ne sont pas décompilés, car normalement ,VFP ne suprime pas les sources. Je ne cherche pas à décompiler les applications de ceux qui cherchent justement à se protéger. J'ai publier Dvfp pour démontrer qu'on pouvait faire cela avec VFP et pour montrer comment ca marche.
le 07/11/2008, steber a écrit :
J'ai essayé de décompiler avec dvfp.exe un EXE et un APP provenant de VFP5, VFP6 et VFP9 et j'obtiens dans les 6 cas une erreur à l'ouverture du fichier EXE ou APP :
"DVFP Error"
Error 1098 : C:\TEST.APP is not a visual FoxPro production
Line 183 in procedure main
Class Exception

Pourtant, j'arrive à décompiler ces mêmes fichiers EXE et APP avec ReFox.

le 07/11/2008, Francis Faure a écrit :
Bonjour,
Dans ce cas il est probable que le développeur de l'application ai compilé l'exe avec l'option "cryptage".
Dvfp ne décompile pas les projets Cryptés
Cordialement

le 07/11/2008, Robert Plagnard a écrit :
Bonjour,
Bien vu Francis. C'est un petit bug, car je devrais dire que l'app est crypté, mais j'ai regardé dans le code et je sors juste avant. C'est dire que je m'intéressais peu aux app cryptés. Je rappelle que c'est un choix délibéré de ne pas vouloir décompiler les applications cryptées.
Cordialement.

le 10/11/2008, steber a écrit :
OK. Je ne savais pas si les EXE et APP testés étaient cryptés ou pas (certains ne sont visiblement pas cryptés volontairement, mais la présence de sources communes avec d'autres projets cryptés rend tout de même ces projets automatiquement cryptés).
Merci de votre réponse.

le 12/06/2016, Francis Faure a écrit :
Bonjour Robert,
Encore un grand merci pour ce travail et sa publication !

- J'ai identifié un petit problème :
DVFP décompile mal la commande :
ON ERROR <sans code>
il décompile comme
ON ERROR ''
Qui ne se recompile donc pas

Il décompile bien la commande
ON ERROR <avec code>

Si je regarde le ByteCode de ON ERROR <code>
0x31 (ON) 0x10 (ERROR) <string>

Mais le ByteCode de ON ERROR est
0x7B 0x10 + chaine vide

Dans ton code 0xFB est identifié comme
#define S_on_key 0x7B
(DFOX.H)

et utilisé dans INITS.PRG comme
gaCmdTxt( S_on_key ) = 'on' && old stuff

Je pense que 0x7B correspond au statement "ON" mais pour une valeur par défaut, donc a ignorer la chaine qui suit
Probable que cela doit impacter d'autres commande ON ...

Cordialement
Francis

le 13/06/2016, Robert Plagnard a écrit :
Bonjour Francis,
Je n'aurais pas pensé que l'on s'intéresse toujours à ce sujet là.
Néanmoins, je viens de proposer une correction avec la version 3.14159 (oui cette numérotation est un plagiat, je copie sur Knuth avec ses versions de TEX, à chaque version on ajoute une décimale de pi, ça laisse de la marge ...).
Bien cordialement,
Robert

le 13/06/2016, Francis Faure a écrit :
Génial.

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3