1

J'utilise une application d'édition de mémoire appelée Cheat Engine. J'attache Cheat Engine à un jeu. Dans mon jeu, j'ai un entier de 32 bits connu sous le nom de HP. Si je redémarre mon jeu, HP est stocké à une nouvelle adresse mémoire B. Il semble qu'avec Cheat Engine, je puisse faire un scan du pointeur et trouver une adresse mémoire statique, C, qui pointe vers une autre adresse mémoire et son décalage, D et offset, de sorte que [D + offset] stocke toujours l'adresse mémoire de HP pendant cette session. Donc, si je déréférence [D + offset], je reçois toujours l'adresse mémoire qui stocke HP.Quel est l'avantage des offsets pour les pointeurs?

Voici un diagramme:

A ou B -> HP

D + offset -> A ou B

C -> D

Quel est l'avantage d'utiliser des compensations? Pourquoi C ne peut-il pas pointer directement vers A ou B directement? Je suis familier que l'utilisation de décalages est bénéfique lorsqu'il s'agit de tableaux dans le langage C. Cela signifie-t-il que chaque fois que je vois un décalage sur un pointeur, le pointeur pointe vers le premier élément d'un tableau et que le décalage fait référence à l'un des éléments du tableau?

+0

Les réponses à ce niveau peuvent être fortement influencées par l'architecture et le jeu d'instructions de la puce (ou machine virtuelle) sur laquelle le code est destiné à s'exécuter. Certains ensembles d'instructions encouragent ce genre de choses en fournissant des modes d'adressage rapides pour l'indexation de décalage. – dmckee

Répondre

2

Il devrait être facile d'imaginer et de comprendre si vous connaissez le langage de programmation C. Tout ce que vous écrivez en C est très proche du code machine réel qui est généré lors de la compilation du programme.

L'abstraction d'un objet en C est souvent faite avec une "struct".

Dans votre exemple, imaginez un struct « Player » très simple:

struct Player { 
    int id; 
    float xposition; 
    float yposition; 
    int health; 
    int maxhealth; 
}; 

Si vous voulez créer un objet comme celui-ci, vous pouvez faire quelque chose comme ceci:

struct Player *myPlayer = malloc(sizeof(struct Player)); 

Qu'est-ce qu'un beau Regarder chose structurée dans la langue haute est en fait juste un bloc de mémoire dans un programme compilé. Pour accéder par exemple à "santé" vous faites myPlayer->health; en C. Mais maintenant, comment cela ressemble-t-il à un programme compilé qui ne connaît pas les beaux noms et qui a juste un bloc de mémoire à utiliser?

Il doit fonctionner avec les décalages du pointeur de base. Dans l'exemple ci-dessus (en supposant système d'exploitation Windows et un défaut configuré compilateur sain d'esprit) un accès à un code de machine pseudo ressemble à quelque chose comme ceci:

move myHealth, read4bytes[myPlayer + 12] 

Si vous reverse-engineering d'un progamme, vous ne pouvez pas dire de un offset-access si le bloc de mémoire était une struct, un tableau, ou peut-être une classe (à partir du code C++) ou quelque chose de complètement différent.

+0

L'explique parfaitement. Réponse géniale. :) – user2312080

Questions connexes