1. #1
    Invité de passage
    Inscrit en
    mars 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 2
    Points : 0
    Points
    0

    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 Expert
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 063
    Points
    1 063

    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 actif
    Profil pro
    Développeur informatique
    Inscrit en
    janvier 2003
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 184
    Points : 157
    Points
    157

    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
    Invité régulier
    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 actif
    Profil pro
    Développeur informatique
    Inscrit en
    janvier 2003
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 184
    Points : 157
    Points
    157

    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.

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