[MASM] conversion décimale avec wsprintf

Tout sur les langages de programmation.

[MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 13 Août 2014, 23:02

Bonjour,

Dans un programme je récupère une valeur entrée par l'utilisateur avec GetDlgItemText, la stocke dans un dword puis je convertis cette chaine en décimale. Pour cela j'utilise wsprintf en lui passant comme format "%d". Cela marche très bien si la chaine entrée ne dépasse pas 4 caractères, par contre si il y a plus de 4 caractères seule la valeur décimale des quatre premiers caractères est retenue. J'imagine que c'est normal puisque la valeur est stockée dans un dword.

Voiçi mon code:

Code: Tout sélectionner
.data?
chaine dd ?

.data
bufferDec db 32 dup(?)
formatDec db "%d", 0

...
...

invoke GetDlgItemText, hWin, IDC_IN, addr chaine, 256
invoke wsprintf, addr bufferDec, addr formatDec, chaine
invoke SetDlgItemText, hWin, IDC_OUT, addr bufferDec


J'aimerais donc pouvoir afficher la valeur décimale quelque soit la taille de la chaine saisie. Il faudrait que je puisse la stocker dans une variable plus grande qu'un dword mais je ne sais pas comment faire; Si quelqu'un a une idée je suis preneur.

Merci
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar dionosis » 18 Août 2014, 01:42

Salut,

Je pense que si tu n'as pas encore eu de réponse c'est du au fait que ta question n'est pas claire.
Il me semble que tu te mélanges complètement les pinceaux entre les types.

Regarde déjà du côté de GetDlgItemInt() pour un entier signé sur 32 bits. Pour plus il te faudra rester en Text et chaîner avec une librairie de précision arbitraire.

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 18 Août 2014, 20:27

Effectivement je ne suis pas très à l'aise avec l'assembleur et il se peut que je me trompe dans les types.
Je ne connaissais pas GetDlgItemInt mais en l'essayant il me semble que ça ne prend en compte que les chiffre rentrés et pas les autres caractères, a moins que je me sois trompé en l'utilisant.

Je n'ai peut être pas été très clair sur ce que je veux faire, voici des précisions:
Si je rentre le caractère "1" je veux obtenir sa valeur ASCII: 49
Si je rentre le caractère "b" je veux obtenir sa valeur ASCII: 98
Si je rentre la chaine "brou" je veux obtenir la valeur ASCII de la chaine: 1970238050

Jusqu'ici j'arrive à faire cela avec le bout de code que j'ai posté plus haut.

En revanche si je rentre la chaine "brouzouf33" je veux obtenir la valeur ASCII de la chaine: 464902875605757734564659
Dans les cas ou la chaine entrée fais plus de 4 caractères comme ici cela ne marche pas du fait que la variable "chaine" soit un DWORD je pense.

En fait je souhaite reproduire ce que fais le petit tools CAscii de Crisanar

Mmmh voilà, j'espère que c'est plus clair.
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar dionosis » 18 Août 2014, 22:01

D'accord, donc ce que tu cherches à obtenir c'est la représentation en chaine de la valeur numérique et non pas ascii.

Crisanar a codé son tool en VB6 et emploie le type 'Decimal' dont voici le descriptif de microsoft :
Code: Tout sélectionner
Decimal    14 bytes
+/-79,228,162,514,264,337,593,543,950,335 with no decimal point;
+/-7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest non-zero number is
+/-0.0000000000000000000000000001

Il va donc te falloir chercher comment manipuler des grands nombres en assembleur, au minimum 12 octets non signés.
Je n'ai jamais eu à le faire en asm donc je ne pourrai pas t'aider plus loin.

Qu'est ce que tu cherches à faire au final ?

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 18 Août 2014, 23:08

Ok, merci pour ces précisions.

Je cherche à reproduire le même programme en assembleur simplement pour me faire la main avec les conversions et tant qu'a faire y rajouter 2-3 fonctions qui me seront utiles.

dionosis a écrit:Il va donc te falloir chercher comment manipuler des grands nombres en assembleur

J'avais un peu peur qu'on me renvoie vers ces BigNums. Je ne m'y suis jamais trop intéressé puisqu'à chaque fois que j'en ai entendu parler c'était en lisant des tutos d'un niveau assez avancé... Je vais essayer voir si je peux trouver quelque chose la dessus d'un peu abordable.
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar dionosis » 19 Août 2014, 12:10

brouzouf33 a écrit:Je cherche à reproduire le même programme en assembleur simplement pour me faire la main avec les conversions et tant qu'a faire y rajouter 2-3 fonctions qui me seront utiles.

Dans 99% des cas, cette conversion n'est utile que dans un contexte de crypto asymétrique.

brouzouf33 a écrit:J'avais un peu peur qu'on me renvoie vers ces BigNums. [...] Je vais essayer voir si je peux trouver quelque chose la dessus d'un peu abordable.

Je te conseille de plutôt faire ça en C, voire même en C# .net puisque depuis le framework 4.0 les BigNums sont pris en charge par la librairie native (je l'ai lu mais jamais essayé personnellement, lib 'Numerical' de mémoire).

Je pense néanmoins que tu devrais faire l'impasse tant que tu n'en as pas concrètement besoin. Il y a beaucoup d'autres choses moins difficiles à appréhender qui te seront plus utiles dans bien des cas ; maîtriser les trois autres conversions par exemple te servira probablement bien plus souvent.

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [MASM] conversion décimale avec wsprintf

Messagepar baboon » 19 Août 2014, 12:38

Je ne comprends pas trop ton besoin en fait.
Tu veux convertir une chaine en sont équivalent en code hexa ?
Si oui tu n'as pas besoin de ce que tu demandes.
Un simple for (i = 0; str[i]; i++)printf("%02X", str[i]); suffit.
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3285
Inscription: 08 Juillet 2005, 17:49

Re: [MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 19 Août 2014, 15:40

baboon a écrit:Je ne comprends pas trop ton besoin en fait.
Tu veux convertir une chaine en sont équivalent en code hexa ?

Non, ça je sais faire. Je veux convertir une chaine en son équivalent ascii.

dionosis a écrit:Dans 99% des cas, cette conversion n'est utile que dans un contexte de crypto asymétrique.

En fait je m'en sers quelque fois lorsque je reverse, par exemple:

Image

Ici EAX contient le sérial que j'ai entré sous sa valeur hexa: 00003039 et ESI contient le bon sérial sous sa valeur hexa: 00029113
Pour connaitre le bon sérial il faut donc convertir la valeur hexa en valeur ascii. Ce que je cherche à faire reviens au même.

dionosis a écrit:maîtriser les trois autres conversions par exemple te servira probablement bien plus souvent.

Justement, je sais déjà faire les trois autres chaine <--> hexa <--> binaire, c'est pourquoi je me tournais maintenant vers celle-là..
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar baboon » 19 Août 2014, 16:36

brouzouf33 a écrit:
baboon a écrit:Je ne comprends pas trop ton besoin en fait.
Tu veux convertir une chaine en sont équivalent en code hexa ?

Non, ça je sais faire. Je veux convertir une chaine en son équivalent ascii.

?!?!
Je ne comprends toujours pas. Qu'est ce que tu appelles un "équivalent ASCII" ?
Tu ne peux pas me donner un exemple de ce que tu souhaite faire ? (entrée -> sortie).
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3285
Inscription: 08 Juillet 2005, 17:49

Re: [MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 19 Août 2014, 19:39

Et bien comme posté plus haut:

brouzouf33 a écrit:Je n'ai peut être pas été très clair sur ce que je veux faire, voici des précisions:
Si je rentre le caractère "1" je veux obtenir sa valeur ASCII: 49
Si je rentre le caractère "b" je veux obtenir sa valeur ASCII: 98
Si je rentre la chaine "brou" je veux obtenir la valeur ASCII de la chaine: 1970238050

Jusqu'ici j'arrive à faire cela avec le bout de code que j'ai posté plus haut.

En revanche si je rentre la chaine "brouzouf33" je veux obtenir la valeur ASCII de la chaine: 464902875605757734564659


Je souhaite donc faire exactement la même chose que ce que fait CAscii de Crisanar mais en assembleur et par moi-même..
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar dionosis » 19 Août 2014, 19:54

brouzouf33 a écrit:En fait je m'en sers quelque fois lorsque je reverse, par exemple:

En fait c'est bien ce que je pensais : tu t'emmêles les pinceaux entre les types, leur valeur, et leur représentation.
Ce que tu cherches à faire ici correspond à la conversion hexadécimale de l'outil de Crisanar, sauf que, Olly interprète eax comme un dword low endian, il te faut donc inverser les octets un par un par groupe de 4 (8*4=32 bits étant la longueur d'eax). La valeur nulle étant la valeur standard de fin de chaîne ascii/ansi, dans ton exemple eax contient la chaîne "90" (0x39, puis 0x30, puis 0x00).

Pour comprendre ce qui se passe, je t'invite à :
- t'orienter vers des cours d'architecture pour comprendre le principe du low endian et même du stockage en général,
- te procurer un éditeur hexadécimal,
- ouvrir un fichier notepad avec (important, l'éditeur doit être en mesure d'enregistrer en ascii/ansi, extension '.txt'),
- dégainer ta calculatrice que tu auras pris soin de paramétrer en mode programmeur ([Affichage] > 'Programmeur').


Baboon a écrit:Je ne comprends toujours pas. Qu'est ce que tu appelles un "équivalent ASCII" ?

dionosis a écrit:D'accord, donc ce que tu cherches à obtenir c'est la représentation en chaine de la valeur numérique et non pas ascii.

C'est la 'faute' de l'outil de Crisanar qui appelle à tort cette conversion 'Code Ascii'.


baboon a écrit:Tu ne peux pas me donner un exemple de ce que tu souhaite faire ? (entrée -> sortie).

brouzouf33 a écrit:En revanche si je rentre la chaine "brouzouf33" je veux obtenir la valeur ASCII de la chaine: 464902875605757734564659


++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [MASM] conversion décimale avec wsprintf

Messagepar baboon » 20 Août 2014, 09:46

Tu n'as pas trop le choix alors, il faudra utiliser une lib de bignum ou la coder toi même.
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3285
Inscription: 08 Juillet 2005, 17:49

Re: [MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 20 Août 2014, 11:27

dionosis a écrit:Pour comprendre ce qui se passe, je t'invite à :
- t'orienter vers des cours d'architecture pour comprendre le principe du low endian et même du stockage en général,
- te procurer un éditeur hexadécimal,
- ouvrir un fichier notepad avec (important, l'éditeur doit être en mesure d'enregistrer en ascii/ansi, extension '.txt'),
- dégainer ta calculatrice que tu auras pris soin de paramétrer en mode programmeur ([Affichage] > 'Programmeur').

Allez, je m'en vais potasser tout ça..

baboon a écrit:Tu n'as pas trop le choix alors, il faudra utiliser une lib de bignum ou la coder toi même.

Je suis loin d'avoir le niveau pour coder une lib de ce genre moi même. J'ai vu qu'il en existait quelques unes qui géraient ça: openssl, miracl.. Je regarderais plutôt du coté de celles-ci.

EDIT:
Si je comprends bien alors CAscii fonctionne lui en Big Endian alors puisque si je rentre comme chaine "09" j'ai bien comme valeur décimale "12345" (le sérial entré sur la copie d'écran posté en exemple) et comme valeur hexa "3039"?
Dernière édition par brouzouf33 le 23 Août 2014, 20:23, édité 1 fois.
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar brouzouf33 » 23 Août 2014, 20:23

Pour ceux qui seraient confrontés au problème ou qui seraient intéressés j'ai résolu le problème en utilisant la BigLib de Roy, très simple d'utilisation.
brouzouf33
Apprenti
Apprenti
 
Messages: 57
Inscription: 01 Janvier 2012, 18:00

Re: [MASM] conversion décimale avec wsprintf

Messagepar dionosis » 24 Août 2014, 03:10

Merci pour l'info, c'est toujours bon de savoir qu'il existe cette lib de dispo en asm.
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités