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

GDB Discussion :

[GDB]Modifier une variable sans avoir le code source


Sujet :

GDB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [GDB]Modifier une variable sans avoir le code source
    Bonjour,
    Je suis entrain de jouer à un jeu dont je n'ai pas le code source et je voudrais touver avec gdb l'emplacement de la variable qui spécifie le nombre de vies restantes (afin de la modifier). J'ai actuellement (au début du jeu) 5 vies; il faudrait donc que je trouve une variable de type int, uint, short ou unsigned short ou quelque chose dans le genre égale à 5.
    J'arrive à faire "attach [PID du processus]" dans gdb mais je ne sais pas comment lui faire faire une telle recherche.
    Comment pourrais-je m'y prendre? (le programme n'est pas open-source)

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Hum... si tu n'as que le binaire, il y a de fortes chances qu'il soit compilé en release, c'est-à-dire sans symboles de debug ; gdb devrait te le dire ?

    Et sans symboles de debug, il ne te reste plus qu'à analyser le code machine pour trouver ta variable, autant dire que ça va te demander beaucoup de temps...

  3. #3
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Tu peux essayer avec un find mais il faut avoir une plage d'addresse valide.

    Dans cet exemple je cherche l'entier 2 dans une plage prise au hasard (l'addresse de départ a été donné par gdb lors de l'attach).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (gdb) where
    #0  0xffffe424 in __kernel_vsyscall ()
    #1  0xb6c1bc4d in ?? ()
    Backtrace stopped: previous frame inner to this frame (corrupt stack?)
    (gdb) find 0xb6c1bc4d, +800, (int) 2
    0xb6c1bdaf
    0xb6c1be0b
    2 patterns found.
    (gdb) find 0xb6c1bc4d, +800, (int) 10
    Pattern not found.
    (gdb) find 0xb6c1bc4d, +800, (int) 2
    0xb6c1bdaf
    0xb6c1be0b
    2 patterns found.
    (gdb)

  4. #4
    Futur Membre du Club
    Femme Profil pro
    1
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : 1

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Salut,
    ce n'est pas du tout compliqué. Dans gdb, pour modifier une variable à partir de son adresse fait juste:
    set *(int*)<ADRESSE> = <VALEUR>
    ex:

    set *(int*)0xbffd3c4c = 0xCAFEF00D

    ou d'une façon plus courte
    set {int}0xbffd3c4c = 0xCAFEF00D

    Si tu es sur windaube je te conseil d'utiliser CheatEngine, qui est un outil pour analyser les données dans l'espace d'adressage de n'importe quel processus. C'est un outil intéressant permettant de faire la recherche de variable de n'importe quel type (float, int, char, ...) itérativement à travers différents snapshot de la mémoire. C'est super utile si tu veux étendre les possibilités d'un jeu par exemple. C'est un domaine très actif que l'on appel le "game enhancement", et est utilisé massivement pour faire les codes d'action replay.

  5. #5
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Merci cocolapin0 pour le partage, très intéressant.

    Soit dit en passant si je devais coder le jeu, pour le nombre de vies j'utiliserais personnellement un char, plus petit en taille mémoire (1 octet) et largement suffisant si le nombre de vies ne saurait être supérieur à 255, ce qui est le cas je pense dans tous les jeux.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/06/2014, 19h38
  2. [XL-2003] permettre à l'utilisateur de modifier une variable chemin sans accès au code
    Par goldfinger13 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/11/2011, 19h21
  3. Pouvoir modifier son site sans toucher au code via une interface
    Par openeyes dans le forum Général Conception Web
    Réponses: 5
    Dernier message: 04/11/2010, 13h09
  4. logiciel pour modifier des pages d'une site sans connaissance de code
    Par charisma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 07/06/2007, 18h10
  5. Réponses: 2
    Dernier message: 03/05/2006, 16h33

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