Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1189 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Adresse memoire d'une constante??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Adresse memoire d'une constante??

n°1329018
angeljack2​1
MEHDI
Posté le 20-03-2006 à 19:22:21  profilanswer
 

salut tout le monde bon voila je voudrai savoir l'adresse d'une constante pendant l'exécution du programme.
par exemple on prend un programme en pascal, après sa compilation et pendant son exécution si on veux avoir l'adresse d'une variable du programme je crois que c'est faisable avec un pointeur mais si je vous dis l'adresse d'une constante ??
sinon pour les constantes comment ça ce passe ? (je m'explique)
si on prend l'exemple suivant:
 
program essai;
const S=12;
var X:integer;
 
begin
S:=S+1; {je sais que pour les variables on va chercher son adresse mémoire et faire le calcule}
{mais si j'ai ça}
S:=X;{d'où la valeur de X est elle chercher?}
.....
 
merci pour vos réponses ;)

mood
Publicité
Posté le 20-03-2006 à 19:22:21  profilanswer
 

n°1329137
Taz
bisounours-codeur
Posté le 20-03-2006 à 22:20:18  profilanswer
 

pareil que pour toute autre variable.

n°1329150
angeljack2​1
MEHDI
Posté le 20-03-2006 à 22:46:44  profilanswer
 

non si tu met un pointeur sur une constante ça te déclenche une erreur

n°1329163
skelter
Posté le 20-03-2006 à 22:58:01  profilanswer
 

montre le code

n°1329164
angeljack2​1
MEHDI
Posté le 20-03-2006 à 23:02:26  profilanswer
 

non si tu fait par exemple en pascal  
 
program essai;  
type ptr:^integer;
const S=12;  
var X:integer;  
pointeur: ptr;
 
begin  
pointeur:=addr(S); {ça te met erreur a la compilation}  
end.
 
donc comme ça me fait erreur je voudrais savoir la représentation de la mémoire pendant l'exécution du programme, comme ça je pourrai peut être passé à l'action ;)

n°1329189
skelter
Posté le 20-03-2006 à 23:30:47  profilanswer
 

ouai mais ici c'est la catégorie C++, pas pascal

n°1329197
angeljack2​1
MEHDI
Posté le 20-03-2006 à 23:55:53  profilanswer
 

je sais mais je cherche une représentation de la mémoire pendant l'exécution même si c'est en C ça pourrai m'aider

n°1329199
skelter
Posté le 21-03-2006 à 00:05:42  profilanswer
 


c'est quoi l'erreur, et comment tu fais en pascal pour déclarer un pointeur sur un truc constant ?


Message édité par skelter le 21-03-2006 à 00:06:06
n°1329205
angeljack2​1
MEHDI
Posté le 21-03-2006 à 00:44:49  profilanswer
 

justement j'arrive pas lors de la compilation il me met erreur comme quoi impossible de pointé une constante mais moi je cherche a connaître comment les constantes sont gérer pendant l'exécution pour essayer de les atteindre tu voit .
merci encore.

n°1329208
nargy
Posté le 21-03-2006 à 00:57:31  profilanswer
 

ça fait trop longtemps que j ai pas fait de pascal, alors au pif:
 
type ptr:^integer;
const S=12;  
var X:integer;  
pointeur: ptr;
 
begin  
X:=S;
pointeur:=addr(X);
end.

mood
Publicité
Posté le 21-03-2006 à 00:57:31  profilanswer
 

n°1329214
nargy
Posté le 21-03-2006 à 02:40:11  profilanswer
 

Ha ouais, j ai vu un sujet dans la rubrique pascal, dans lequel tu explique que tu cherches à modifier une constante. On t a répondu que c était impossible, ils avaient tord, c est tout à fait possible:
 
Quand tu déclare une constante, elle n est pas stockée avec les autres données, elle est stockée dans le segment de code, à chaque fois que tu l utilise. Pour la repérer, tu y mets une valeur bidon, tu compile et tu scan le fichier executable en binaire pour repérer tous les endroits où se trouve la constante.
 
Comme la plupart des OS interdisent l écriture dans un segment de code, c est plus facile de changer toutes les copies de la constante avant d executer le programme.
 
Si tu as besoin de changer la constante au cours de l execution, tu doit d abord hacker ton système d exploitation (c est plus facile avec linux, il y a les sources) pour lui faire accepter d écrire dans le segment de code. Ensuite tu construit un fichier texte avec les adresses relative des constante, en vue de charger le fichier au cours de l execution du programme pour changer la constante.
 
Quand ton programme est terminé et compilé, tu remplis le fichier texte avec les adresse relatives que tu trouve dans le fichier binaire. Ça aide d avoir le code assembleur de la compilation, un désassembleur et un debogueur, surtout que quand par exemple tu additionne deux constantes, le compilo stoque en fait le résultat de l addition.
 
Voilà, tu est prêt pour changer toutes les constantes de ton programme d un seul coup, quand tu en as besoin.
 
Si tu cherche une solution plus simple, comme avoir un pointeur sur la constante, c est possible dans certains langages mais le compilateur refusera que tu change la valeur puisque tu l a déclaré constante.
 
Tu peut à la rigueur hacker le compilateur, mais bien que l adresse retournée soit dans le segment de données, le compilateur a tout de même recopié cette valeur partout où tu l a utilisé puisque tu lui avait dit que c était une constante. Il faudrait dans ce cas que tu hacke le compilo pour qu il  traite les constantes comme les autres variables.
 
Le plus simple finalement reste à dire au compilteur que c est pas une constante comme ça il ne la recopie pas partout, il la stocke dans le segment de donnée uniquement et tu peut la changer.
 
Bon, c est vrai que les compilos ils sont pas très futés de recopier les constantes partout, mais si tu regarde la définition du mot <<constant>>, ça peut se comprendre.
 
Les hackers font tout ça souvent, le cas le plus répandu étant les cheat codes dans les jeux, que tu peut repérer en examinant le fichier executable avec un éditeur binaire ou un desassembleur.
 
Pour augmenter le nombre de vies dans un jeu, tu le désassemble et tu recherche tous les nombres <<3>> (s il y a 3 vies au départ) et tu le change à 255, tu recommence jusqu à ce que tu tombe sur les bonnes constantes.
 
Ça prends beaucoup de temps le hacking, alors j ai arrêté, mais c est très marrant, et puis ça permet d aller à la fin des jeux quand tu rames, de débloquer des logiciels, ou de tester des trucs auquels les développeurs n avaient pas pensé.
 
:D

n°1329481
bjone
Insert booze to continue
Posté le 21-03-2006 à 14:19:20  profilanswer
 

comme ça, ça va l'occuper il fera pas de bêtises pendant ce temps là.
 
(par contre recopier les contantes partout, ça peut être futé)

n°1329510
nargy
Posté le 21-03-2006 à 14:50:57  profilanswer
 

> (par contre recopier les contantes partout, ça peut être futé)
c était ironique, bien sûr.

n°1329798
angeljack2​1
MEHDI
Posté le 21-03-2006 à 21:37:09  profilanswer
 

oula oula oula salut nargy merci pour ces explications bien détaillées je te serai reconnaissant même si ça m'a l'air un peu dure à réaliser :) en faite c'est l'idée que j'avais derrière la tête mais j'arrivais pas à trouver.
merci encore pour tout (surtout nargy ;))

n°1329811
skelter
Posté le 21-03-2006 à 22:14:22  profilanswer
 

quand on spécifie une variable const, ca veut dire qu'on ne peut pas la modifier, apres comme on l'a dit depuis le début c'est comme une autre variable
 
nargy > tu es sur de ce que tu dis (source ?)
l'endroit ou est stocké une variable dépend de sa classe de stockage, une variable automatique constante sera sur la pile

n°1329821
bjone
Insert booze to continue
Posté le 21-03-2006 à 22:27:42  profilanswer
 

bin je pense qu'il fait allusion au fait la constante se retrouvera surtout en opérande immédiate dans les instructions l'utilisant...

n°1329825
angeljack2​1
MEHDI
Posté le 21-03-2006 à 22:29:47  profilanswer
 

oui je pense que c'est ça

n°1329828
skelter
Posté le 21-03-2006 à 22:31:27  profilanswer
 

peut etre dans le cas d'une constante litterale n'apparaissant que dans une instruction, elle sera sans doute inserée dans le code, mais la il me semblais qu'on parlais de variables spécifiées const (code du premier post)

n°1329832
nargy
Posté le 21-03-2006 à 22:36:33  profilanswer
 

ça dépends du compilo, souvent il y a les deux, en opérande à des intstructions ASM, et dans la pile.
Quand tu fait:
const int a=10;
print(a+5);
 
le compilo/assembleur, il traduit par:
print(15);
et ta constante à disparue (les codes hexa des instructions sont bidons):
asm:
 push 15   : 45 0F
 call print  : 88 EF 65

n°1329837
chrisbk
-
Posté le 21-03-2006 à 22:45:14  profilanswer
 

je ne pige pas le but de ce topic [:el g]

n°1329858
smaragdus
whores, drugs & J.S. Bach
Posté le 21-03-2006 à 23:29:43  profilanswer
 

chrisbk a écrit :

je ne pige pas le but de ce topic [:el g]

C'est un topic blague [:dawa]

n°1329897
bjone
Insert booze to continue
Posté le 22-03-2006 à 00:32:45  profilanswer
 

chrisbk a écrit :

je ne pige pas le but de ce topic [:el g]


angeljack21 cherche a consommer autant de cachet d'aspirine que devant le SDK de 3DSMax :D

n°1329904
nargy
Posté le 22-03-2006 à 00:54:43  profilanswer
 

Concours de celui qui lance le topic le plus hilarant, résultat le 1er avril :D
 
angeljack21 est en tête, avec une bonne longueur d avance.

n°1329962
angeljack2​1
MEHDI
Posté le 22-03-2006 à 09:27:11  profilanswer
 

mdr nargy :D bin oui ça à l'air hilarant mais bon merci pour tout a vous tous ;)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Adresse memoire d'une constante??

 

Sujets relatifs
Allocation mémoire[PASCAL] modifier une constante
Pointeurs, gestion de la memoire (Pascal)allocation de mémoire alignée
Envoyer un mail a toute une liste d'adresse de la base de dommées ?Macro sous Outlook pour récupérer adresse
stockage d'une adresse ipv4configurer adresse IP et DNS dans une ligne de cmd
Consulter une mémoire partagéeMémoire défaillante chez Internet Explorer !?
Plus de sujets relatifs à : Adresse memoire d'une constante??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR