traduction ASM -> Purebasic

Pour discuter de l'assembleur
popstatic
Messages : 83
Inscription : lun. 20/sept./2004 18:21
Localisation : derriere toi fais gaffe!

traduction ASM -> Purebasic

Message par popstatic »

salut à tous! j'ai trouvé un snippet de code en assembleur permettant du "CRC32 reversing", c'est a dire reconstituer des données a partir de leur CRC32.
sauf que je voudrai l'utiliser en purebasic et je peine a le traduire, n'etant pas DU TOUT un pro en ASM erf... donc si un de vous pouvait me donner un coup de main ....

j'ai trouvé ce code dans un tutorial... je vous le met en dessous:
Hello,

well today I'm gonna teach you *censored*ers an easy way of 'reversing' crc32. CRC stands for Cyclic Redundancy Check and 32 the size of the result in bits, 32 bits = 1 dword = 4 bytes. Ok, enough of this crap. My method of finding out the values necessary for resulting in a given crc goes like this:

Let's suppose we need a sequence of bytes that results in the crc of 0xA02DD7CB. Analysing the crc32 routine:

lea esi, [message]
mov edx, -1
crcloop:
lodsb
mov ecx, edx
and eax, 0ffh
and ecx, 0ffh
xor eax, ecx ; let's call it X
shr edx, 8
xor edx, dword ptr [eax*4+crctable]
dec contagem
jnz crcloop

We can figure out which value was the last one in X by looking up in the crctable a dword with the highest byte equal to 0xA0, so. eg: 0xA0YYYYYY. Then we save the position of this dword and the rest of the dword, YYYYYY. Why save YYYYYY? because it's the value that has been XOR'd with another one to result in (A0)2DD7CB. Now we XOR YYYYYY with 2DD7CB. Now we do the mentioned operation till the last byte. Here goes a table of the operations:

__________ __________ __________ ___________
| VALUE | O.DWORD | Position | XOR'ing |
|----------|----------|----------|-----------|
| A02DD7CB | A00AE278 | E0 | 002735B3 |
| 2735B300 | 270241AA | 71 | 000037F2 |
| 37F20000 | 37D83BF0 | EB | 0000002A |
| 2A000000 | 2A6F2B94 | FB | 00000000 |
| | | | |
¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯

Ok, so the values we got are the ones that must be the X's. And, as we did this process backwards, we need to put the result backwards as well, so our values are 0xFB, 0xEB, 0x71 and 0xE0 So, we just need to recode a crc32 routine to retrieve the chars to be xored with the current crc in order to result the X's and also replace them in execution so we can keep processing good values. Here it goes:

invoke lstrlen, addr message
mov contagem, eax
lea esi, [message]
lea edi, [temporary]
mov edx, -1
crcloop:
lodsb
mov ecx, edx
and eax, 0ffh
and ecx, 0ffh
xor eax, ecx
cmp contagem, 4
jg skipitt
stosb
mov al, byte ptr [esi-1]
skipitt:
shr edx, 8
xor edx, dword ptr [eax*4+crctable]
dec contagem
jnz crcloop

; Notes:
; message db 0FBh, 0EBh, 71h, 0E0h ; our precious values
; temporary dd 00 ; buffer for the last 4 bytes

After executing this routine we find out that the needed four bytes are 'fuss' (this is only when there's nothing before it. If there are bytes before it then it's probably gonna change ;).

merci d'avance a vous !
Asus bien? asus tres bien!
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bonjour,

Aujourd'hui, bande de [censuré]s, je vais vous apprendre une manière simple de reconstitution CRC32.
CRC vient de l'expression anglaise Cyclic Redundancy Check : Vérification par redondance cyclique.
Et 32 est la taille en bits du résultat, 32 bits = 1 double-mot = 4 octets.
Assez perdu de temps. Ma méthode de recherche des valeurs nécessaires à la reconstitution crc32 procède comme suit:

On va supposer que nous ayons besoin d'une séquence d'octets égale à 0x0A2DD7CB en CRC.
Analysons le routine :

Code : Tout sélectionner

Structure Reg80x86
      REAX
      REBX
      RECX
      REDX
      RFlags
      RESI
      REDI
      REBP
      RESP
EndStructure

      Global CrcTable

Procedure RoutineCRC32(ASM.Reg80x86, *Message)

      With ASM
            \RESI = *Message
            \REDX = -1
            Repeat
                  \REAX = PeekB(\RESI)
                  \RESI + 1
                  \RECX = \REDX
                  \REAX & $FF
                  \RECX & $FF
                  \REAX ! \RECX ; On va l'appeler X...
                  \REDX >> 8
                  \REDX ! PeekL(\REAX << 2 + CrcTable)
                  Contagem - 1
            Until Contagem = 0
      EndWith

EndProcedure
On peut déterminer la dernière valeur de X en regardant le double-mot ayant $A0 en octet de poids de fort dans la table Crc,
par exemple $A0yyyyyy. On enregistre alors ce double-mot avec la partie yyyyyy. Pourquoi enregistrer aussi yyyyyy?
Parce que c'est la valeur qui subit l'opération OU EXCLUSIF avec un des autres double-mots pour obtenir $2DD7CB.
>> On effectue cette opération
>> On réalise ensuite l'operation jusqu'au dernier octet
>> On obtient la table suivante:

Code : Tout sélectionner

Valeur   |Double-mot source |Position |Résultat de l'opé OU EXCLUSIF
---------|------------------|---------|-----------------------------
A02DD7CB |A00AE278          |E0       |002735B3
2735B300 |270241AA          |71       |000037F2
37F20000 |37D83BF0          |EB       |0000002A
2A000000 |2A6F2B94          |FB       |00000000
Ok, les valeurs que nous obtenons sont ces valeurs X.
Et comme on a fait ce process en arrière-plan, on a besoin de mettre le résultat en arrière-plan aussi.
Donc nos valeurs sont $FB, $EB, $71 et $E0. On a donc juste besoin de recoder une routine Crc32 pour retrouver
les caractères qui doivent subir un OU EXCLUSIF avec le Crc actuel pour obtenir ces X et les remplacer durant l'exécution.
On pourra alors se permettre de traiter les bonnes valeurs. On a alors:

Code : Tout sélectionner

      Define *Message
      Define *Temporary
      Define Contagem.L
      Define ASM.Reg80x86
      
      Contagem = MemorySize(Message)
      With ASM
            \RESI = *Message
            \REDI = *Temporary
            \REDX = -1
            Repeat
                  \REAX = PeekB(\RESI)
                  \RESI + 1
                  \RECX = \REDX
                  If Contagem <= 4
                        PokeB(\REDI, \REAX)
                        \REDI + 1
                        \REAX & $FFFFFF00
                        \REAX | PeekB(\RESI - 1)
                  EndIf
                  \REDX >> 8
                  \REDX ! PeekL(\REAX << 2 + CrcTable)
                  Contagem - 1
            Until Contagem = 0
      EndWith            
...
; Notes
Ma pratique actuelle en oenologie atteint un seuil qui ne me permet plus d'avancer grandement (NdT)
Il reste 2 AllocateMemory() à placer en début de code + insérer la structure Reg80x86 précisée dans 1er code.

PS: C'est quoi Crc32?...
Dernière modification par Ollivier le ven. 28/déc./2007 15:48, modifié 2 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ollivier a écrit :bande de branleurs
Traduction incorrecte.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

[quote="Ollivier"] bande de branleurs,
quote]
humour déplacé ou prétention carabiné avec complication.???
en tous cas superflu.
le CRC32 ,lorsque l' on a COMPRIS le principe, est facilement codable en basic pour le Basiciens et ASM pour les ASMiens.
MAIS!! Grand Merci! pour lui, Oliv pour ta réponse travailée.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

tonton a écrit :
Ollivier a écrit : bande de branleurs,
quote]
humour déplacé ou prétention carabiné avec complication.???
en tous cas superflu.
le CRC32 ,lorsque l' on a COMPRIS le principe, est facilement codable en basic pour le Basiciens et ASM pour les ASMiens.
MAIS!! Grand Merci! pour lui, Oliv pour ta réponse travailée.
Moi j'avais trouvé ça drôle ;)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

humour déplacé ou prétention carabiné avec complication.???
Ben quoi! Moi j'y connais rien au Crc32! En attendant, l'auteur (plutôt prétentieux quand même...) a censuré son expression.
Donc, pour ne pas heurter la sensibilité du public et troubler l'image de ce forum, je censure mon expression! Circonstances de soirée ou pas, le principe de précaution est de mise!
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

ha les quiproquo! :?
c était pas pour toi oliv!, c était pour le rosbeef!!!, leur monopol linguistique leur humour sarcasique et leur pays moisi!!!
je comprends rien a la langue des bouffeurs de merdes, je pensais a la traduction .
pour toi c était ca!!
""""MAIS!! Grand Merci! pour lui, Oliv pour ta réponse travailée."""" :D
popstatic
Messages : 83
Inscription : lun. 20/sept./2004 18:21
Localisation : derriere toi fais gaffe!

Message par popstatic »

Ah bah ca c'est super gentuil!! :D

j'ai donc eu la confirmation de ce que je pensais: non je n'aurais jamais put produire un code comme celui la erf...
je vais regarder attentivement la facon dont tu t'y es pris, et apprendre pas mal de chose par la mm occasion!
merci!
Asus bien? asus tres bien!
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ouaib...

Ben moi, j'ai toujours pas compris le "quoi faisant" du crc32...
En plus, j'étais tellement bourré le jour où j'ai traduit ça que j'ai réussi à mettre les registres Asm dans une structure que... j'ai visiblement créé par la même occasion...

Ollivier
Répondre