Manipulation de chaine dans la base de registre [Résolu]

Signaler
Messages postés
43
Date d'inscription
dimanche 26 mars 2006
Statut
Membre
Dernière intervention
1 août 2009
-
Messages postés
9
Date d'inscription
mardi 25 novembre 2008
Statut
Membre
Dernière intervention
7 juillet 2010
-
Salut, tout le monde je maitrise mal la manipulation des chaines etc..
J'ai besoin d'aide ! :p

Voilà je récupère d'un client un " buff      db 512 dup (0) "  de valeur   "/title montitre"
Je découpe donc la chaîne.pour pouvoir inscrire "montitre" dans une valeur de la base de registre
En affichant la var "temp" avec une message box , on obtient bien "montitre",mais dans la base de registre on obtient 32@, à chaque fois.
Je pense que le pronlème vient du SIZEOF temp ou que temp n'est pas null terminated

ietitle:
   mov eax,OFFSET buff  ;on récupere le buffer
    add eax,7 ;on saute de 7 caracteres pour sauter la commande+1 espace et arriver à la chaine
    mov temp,eax ; on sauve la var titre
    Invoke RegOpenKeyEx, HKEY_CURRENT_USER, addr clef2, 0, KEY_ALL_ACCESS, addr hreg ; ouverture
    Invoke RegSetValueEx,hreg,addr valuereg2,0,REG_EXPAND_SZ,offset temp,SIZOF temp ;ecriture
    Invoke RegCloseKey, hreg ;fermeture

Qu'en pensez vous?

9 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
offset temp ???
tu as mis dans tmp l'adresse, now tu donnes l'adressde de la variable contenant l'adresse,ça te parait cohérent ???


SIZOF temp ??? mais c'est 4 à tout coup, c'est strlen(chaine) qu'attend l'API.
REG_EXPAND_SZ ??? TABLEAU DE CHAINES SEPAREE2 PAR UN 0 ET FINISSANT DONC PAR 2 ZEROS.


Invoke RegOpenKeyEx, HKEY_CURRENT_USER, addr clef2, 0, KEY_ALL_ACCESS, addr hreg ; ouverture
mov eax, offset buff
add eax, 6 ; (ADRESSE - 1) CHAINE A ECRIRE
lea edx, [eax+1] ; CONSERVERA L'ADRESSE
goLEN: ; CALCUL strlen(EDX)
add eax, 1
cmp byte ptr[eax], 0
jne short goLEN
sub eax, edx ; OK ON A LEN ET ADRESSE CHAINE
push eax
push edx
push REG_SZ
push 0
push offset valuereg2
push hreg
call RegSetValueEx


Ecrire en ASM a la vertu de forcer à réfléchir sur ce qu'on tape, le sabir ne mène à rien de bon.

ciao...
BruNews, MVP VC++
Messages postés
43
Date d'inscription
dimanche 26 mars 2006
Statut
Membre
Dernière intervention
1 août 2009

Petite précision sur temp : temp      dd ?

Voilà , je n'ai toujours pas trouvé la solution.
Par contre si j'initialise temp comme ceci : temp dd "montitre"
la donnée s'inscrit effectivement bien dans le registre !?

 

<center> 

</center>
Messages postés
43
Date d'inscription
dimanche 26 mars 2006
Statut
Membre
Dernière intervention
1 août 2009

(-_-)  Sympa.
Je sais qu'il me manque des bases théoriques, instruction processeurs , manipulation des registres etc!!!
L'ASM ne s'apprend pas en une semaine à mon avis, donc j'essai de comprendre , je me plante ,  j'apprend etc

Je pense que ta réponse sera instructive , car ne crois pas que je vais copier coller ton code, mais bien décorticer chaque action, pour au final comprendre..

Si je post c'est que je bloque.. et donc que j'ai réflêchi avant.. maintenant peut être que je ne suis pas doué 'ok'; il ne fallait pas te sentir obligé de m'aider hein :/

<center> 

</center>
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Mais qui parle de "pas doué" ? personne.
Faut pas prendre la mouche pour la forme, intéresse toi aux points que j'ai soulignés et tout ira bien.

J'insiste sur un point:
La syntaxe de haut niveau en ASM est une inepsie, le haut niveau valable de l'ASM est le C car il y a un compilo pour optimiser. Force toi à écrire en ASM, c'est la seule manière d'obtenir un code valable.

ciao...
BruNews, MVP VC++
Messages postés
43
Date d'inscription
dimanche 26 mars 2006
Statut
Membre
Dernière intervention
1 août 2009

Oui, surchauffe,me suis emporté, une pause s'imposait.
C'est vrai qu'en relisant,ça parait logique,ça ne pouvait pas fonctionner ainsi.
1.Mais il me parait étrange que cela fonctionne avec une var. initialisée non ?
2.Tu as dit "SIZOF temp ??? mais c'est 4" , tu pourrais aller un peu pus loin , j'aimerais en connaitre la raison.
Merci, je résolute ^^
Did you know?
In York, it is perfectly legal to shoot a Scotsman with a bow and arrow (except on Sundays)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tu entends quoi par "var initialisée" ?

En fait "sizeof temp" je parlais de taille d'un pointeur mais ce n'est pas forcément le cas ici, je vais aussi un peu trop vite parfois, passer d'un site à l'autre...

ciao...
BruNews, MVP VC++
Messages postés
43
Date d'inscription
dimanche 26 mars 2006
Statut
Membre
Dernière intervention
1 août 2009

Salut,tu étais dans le juste en tout cas^^
1.pour la var initialisée j'entends (temp db"blablbl",0), mais en relisant le code , c'est normal que cela fonctionnait car temp n'était plus un pointeur à ce moment(sans le offset buff )...

2.Et oui , Sizeof temp avait,autrement la taille d'un pointeur; c'était le cas..

3.Avec ta réponse si la commande était /title montitre,dans le registre s'inscrivait montitre[][].
J'ai donc fait un sub eax,2 sans trop savoir pourquoi exactement.
Ce pourrait être que tu sors de la boucle quand  le byte vaut 0.(mais dans ce cas sub eax,1)
J'ai lu une histoire de"carriage return",quelque part.

4.Je n'ai pas trouvé la signification du  jne "short" golen..Je doute que ce soit par simple goût vestimentaire hein^^
ok je sors[]

5.Pour l'asm haut niveau , tu parles pour tout ce qui n'est pas en héxa ou plutot des invoke .if .while companie
Donc tu penses qu'un code C pourrait être plus rapide qu'un code asm haut niveau (O_O)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
'short' réduit la taille de l'instruction de JMP, seulement si déplacement <= 127 octets.
Si écrit "montitre[][]" c'est que ta chaine finit ainsi mais mon calcul strlen() est tout à fait juste.


Je t'ai fait démo ici:
http://www.asmfr.com/code.aspx?ID=41733

ciao...
BruNews, MVP VC++
Messages postés
9
Date d'inscription
mardi 25 novembre 2008
Statut
Membre
Dernière intervention
7 juillet 2010

salut, comment pouraais-je executer ce programme avec Masm 16?
merci