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

C++ Discussion :

executer une chaine char avec asm() [prob]


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut executer une chaine char avec asm() [prob]
    salut à tous

    compileur : mingw
    os : winxp pro

    j'ai un probleme bizarre pour lancer une commande asm

    je vais rechercher une reference pour la passer en parametre à une commande jmp

    si je l'écris à la main ça fonctionne correctement
    asm("jmp 0x22ff10");
    si je la construit ça me fait une erreur :
    stub.cpp:173: error: expected asm body before "asm_command"
    stub.cpp:173: error: expected `;' before ')' token
    stub.cpp:173: warning: statement has no effect
    la construction :

    char data_pValue[50] = { 0 };
    char asm_command[255]={0};
    strcat(asm_command,"\42");
    strcat(asm_command,"jmp ");
    sprintf(data_pValue, "%#x",(unsigned int)&data[0]);
    strcat(asm_command,data_pValue);
    strcat(asm_command, "\042 \0");
    asm(asm_command);
    un
    cout<<asm_command<<"\n";
    me renvoie bien ("jmp 0x22ff10");

    mais
    asm(asm_command);
    ne fonctionne pas, j'ai bidouillé asm_command dans tous les sens (enlevé les doubles quotes, etc..)

    mais sans succes

    quelqu'un aurait-il une idée ?

    rogerio

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le code ASM est compilé et intégré à ton exécutable, il n'est pas interprété magiquement à la volée. Donc pour ça, je ne pense pas que tu puisses passer de chaîne non connue à la compilation à la directive asm.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut lol
    lol

    salut laurent

    ce que tu dis me parait logique, je n'y avais pas pensé, ça complique mon projet à la limite de l'infaisabilité


    donc faudrait que asm aille chercher l'adresse mémoire pour faire le jmp ?

    rogerio

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Si tu connais l'adresse pourquoi ne pas la passer directement ?
    Un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void f()
    {
      long address = ... ;
      __asm__(
        "jmp %0"
          : "r"(address)
      );
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut désolé
    désolé voidseer mais ça marche pas non plus

    je vais étudier le probleme differemment

    rogerio

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par rogerio
    désolé voidseer mais ça marche pas non plus
    Qu'est-ce ce qui ne marche pas exactement ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut ouie
    voidseer

    stub.cpp:179: error: expected primary-expression before "void"
    stub.cpp:179: error: expected `;' before "void"
    la ligne 179 correspond à la declaration void

    void f()

    je l'ai saucé à peu près dans tous les sens et ça bug à chaque fois

    rogerio

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    étrange, cependant le compilo indique avant la fonction.

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu n'aurais pas oublié un ';' à la fin de la déclaration d'une classe ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    j'ai oublié une ligne dans l'inline asm du dessus.
    Le code suivant compile parfaitement avec gcc 4 sous linux, y'a donc de forte chance que ça passe avec mingw.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void f(unsigned long address)
    {
      __asm__(
        "jmp *%0"
         : /* No Output */
         : "r"(address)
      );
    }
     
    int main()
    {
      f(0);
    }
    Bien evidemment, ça provoque un beau segfault.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut ha
    voidseer

    je n'ai pas compris ton script

    tu déclares la fonction f avec un parametre variable address qui est unsigned long

    mais quand tu appelles la fonction avec comme parametre 0

    comment ma référence qui est
    sprintf(data_pValue, "%#x",(unsigned int)&data[0]);
    sera passée en parametre dans ma commande asm

    je l'ai quand même saucé un peu dans tous les sens en partant de ton principe

    je l'ai modifié en

    void f(char address)
    {

    __asm__(
    "jmp *%0"
    : /* No Output */
    : "r"(address)
    );
    }
    j'appelle ensuite la fonction :

    f(data_pValue); // ou data_pValue est un char representant la référence

    ce qui amene le debugger à afficher

    stub.cpp:190: error: invalid conversion from `char*' to `char'
    stub.cpp:190: error: initializing argument 1 of `void f(char)'
    stub.cpp:33: warning: unused variable 'delete_file'
    {standard input}: Assembler messages:
    {standard input}:4781: Error: suffix or operands invalid for `jmp'
    dur

    rogerio

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu possèdes ton adresse sous forme de chaîne de caractères, alors il faudra vraissemblablement que tu la convertisses en entier avant de la passer à la fonction.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut genial
    cool laurent

    pour etre très bon dans un langage de prog il faut 2 ans, il me faudra certainement 5 ans pour le C++, parce que la je commence sérieusement à pedaler dans la semoule


    à l'origine j'ai une référence que je veux passer en parametre à jmp

    grace à l'aide du forum j'ai réussi injecter en char l'expression literal de l'adresse de la référence

    maintenant il faudrait la traduire en entier

    entier c'est assez vague :

    si je me souviens bien les adresses mémoire sont en base16
    faudrait traduire en base2 ou base10 ou en index de la table ascii ?

    désolé mais j'ai vraiment du mal

    rogerio

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par rogerio
    je n'ai pas compris ton script
    tu déclares la fonction f avec un parametre variable address qui est unsigned long mais quand tu appelles la fonction avec comme parametre 0
    Pour l'appel dans le main j'ai juste mis un zéro afin que cela compile. La fonction f() effectue un 'jmp' à l'adresse qui lui est fournie en paramètre. Dans ma version, je lui passe un 'unsigned long' parce que c'est en général ce qui correspond à la représentation d'un adresse mémoire.
    Passer un 'char' en paramètre est vraisemblablement une impasse, si l'adresse à laquelle tu souhaites te brancher est sous la forme d'une chaîne de caractère, il faudra faire la conversion comme l'indique Laurent. Cette conversion est dans la FAQ.
    Ensuite concernant les adresse mémoires, elles ne sont en aucune 'base'. C'est une confusion assez classique, mais un nombre représenté en décimal, binaire, hexadécimal ou que sais-je encore, c'est toujours le même nombre. Que tu écrives, 13 en décimal, D, en hexa, 1101 en binaire, c'est toujours la même valeur.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut yep
    d'accord avec toi voidseer

    mais l'output de la reference est bien une chaine en exa (base16)

    je vais faire un tour dans la faq

    lol

    enfin d'abord je reformate mon pc

    rogerio

Discussions similaires

  1. Executer une chaine concatener dans une procedure stockée
    Par nic413 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 19/06/2006, 10h24
  2. ecrire une chaine dans un fichier [prob]
    Par rogerio dans le forum C++
    Réponses: 5
    Dernier message: 31/05/2006, 02h20
  3. executer une chaine binaire executable
    Par rogerio dans le forum C++
    Réponses: 22
    Dernier message: 03/05/2006, 17h51
  4. [BDD] Comment Executer Une SP Mysql avec ADODB depuis PHP
    Par audreyc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 30/03/2006, 12h17
  5. [API][Système] Executer une commande dos avec arguments
    Par oOoOuuhmAn dans le forum Général Java
    Réponses: 4
    Dernier message: 17/03/2006, 12h37

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