IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Ecrire dans la partie segment code au runtime


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut Ecrire dans la partie segment code au runtime
    Bonjour.
    Il y a quelques années, nous avons acheté le composant scripter chez dream company.
    Depuis, la société semble avoir disparu.
    Depuis peu, des messages de violation d'accès sont apparus sur certaines machines (serveur windows 2008 64 bits)

    En regardant dans le code, j'ai découvert que le composant écrit du langage machine dans un tmemorystream, puis associe un evt avec le code écrit dans le memorystream à l'aide de la fonction setmethodprop.

    En mettant un point d'arrêt à l'adresse de la propriété memory du tmemorystream en vu cpu, je peux voir l'assembleur correspondant au code généré. il semble propre.
    Mais lorsque le processeur saute à cette adresse, il y a une violation d'accès.
    Le code écrit dans le memorystream n'est pas dans la partie segment de code et je suppose que c'est pour cela qu'il y a une violation d'accès.
    (Bien que ça ne pose pas de pb sur d'autres os)

    Je cherche donc une solution pour fixer ce bug.

    Soit en trouvant un moyen pour écrire dans la partie segment de code, soit pour autoriser l'execution du code qui se trouve dans le memorystream ( le heap je suppose)

    J'ai regardé du côté de la fonction writeprocessmemory, mais comment trouver une adresse à laquelle je peux écrire ?

    (J'ai déjà regardé le composant tmsScripter, et il ne me permet pas de remplacer le composant de chez dream company)

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 846
    Points
    24 846
    Par défaut
    En même temps, DC génère un code x86 32Bits, il n'est pas surprenant que sur un OS 64 bits qui émule le 32Bits qu'il y ait quelques mauvaises surprises !

    Il me semblait que TMS avait repris Dream Script, à la différence que DC proposait toutes les unités par défaut (DCClasses, DCControls ...), ce qu'il faut faire manuellement avec TMS (ce qui est extrêmement fastidieux)

    Faudrait regarder VirtualProtect\VirtualProtectEx en PAGE_EXECUTE_READWRITE, en fait, tu n'as pas le droit d'écrire dans le "code segment" mais tu peux changer les droits comme dans le sujet Injection d'opcodes au runtime, je ne peux pas t'en dire plus, je n'ai jamais tenté ce genre de chose, j'ai déjà du mal a écrire un petit code ASM, alors en générer à la volée

    C'est un gros travail en perspective !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup pour ton aide.
    Les liens que tu m'as donné vont me donner des pistes.
    Entre temps, j'ai trouvé comment désactiver le DEP pour mon application et du coup, cela marche.

    Le code généré par dc fonctionne donc même pour une machine 64 bits. l'application étant installé comme application 32 bits.

    Je ne sais pas si tms a repris le composant de dc, mais celui de dc était fournit avec un générateur de source pour pouvoir intégrer n'importe quel composant tiers. C'est surtout cela qui me manque dans le composant de tms.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    ça marche !!

    L'utilisation de VirtualProtect et PAGE_EXECUTE_READWRITE résoud le pb !

    Merci !

  5. #5
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    T'es trop fort le Troll!
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/04/2014, 12h16
  2. jsp : erreur dans une partie de code non executée
    Par julien20vt dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/05/2010, 10h00
  3. Ecrire dans la partie Header du RTF
    Par shuryyy dans le forum Jasper
    Réponses: 1
    Dernier message: 30/10/2008, 07h52
  4. ecrire dans un fichier .resx en code behind
    Par tortuegenie dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/09/2008, 00h14
  5. Réponses: 2
    Dernier message: 08/04/2004, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo