Micro_and_Macro
Messages postés43Date d'inscriptiondimanche 26 mars 2006StatutMembreDernière intervention 1 août 2009
-
28 févr. 2007 à 10:14
vita01
Messages postés9Date d'inscriptionmardi 25 novembre 2008StatutMembreDernière intervention 7 juillet 2010
-
15 déc. 2008 à 11:24
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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 28 févr. 2007 à 19:07
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.
Micro_and_Macro
Messages postés43Date d'inscriptiondimanche 26 mars 2006StatutMembreDernière intervention 1 août 2009 28 févr. 2007 à 18:32
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 !?
Micro_and_Macro
Messages postés43Date d'inscriptiondimanche 26 mars 2006StatutMembreDernière intervention 1 août 2009 28 févr. 2007 à 20:22
(-_-) 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 :/
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 28 févr. 2007 à 20:52
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++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Micro_and_Macro
Messages postés43Date d'inscriptiondimanche 26 mars 2006StatutMembreDernière intervention 1 août 2009 2 mars 2007 à 16:05
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)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 mars 2007 à 20:12
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...
Micro_and_Macro
Messages postés43Date d'inscriptiondimanche 26 mars 2006StatutMembreDernière intervention 1 août 2009 4 mars 2007 à 08:56
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)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 mars 2007 à 15:35
'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.