PureBasic

Forums PureBasic
Nous sommes le Jeu 23/Mai/2013 2:23

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 9 messages ] 
Auteur Message
 Sujet du message: traduction ASM -> Purebasic
MessagePosté: Lun 12/Nov/2007 19:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 20/Sep/2004 18:21
Messages: 83
Localisation: derriere toi fais gaffe!
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:

Citation:
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!


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Mer 19/Déc/2007 0:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Juin/2007 17:50
Messages: 1901
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:
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:
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:
      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 édition par Ollivier le Ven 28/Déc/2007 15:48, édité 2 fois.

Haut
 Profil  
 
 Sujet du message:
MessagePosté: Mer 19/Déc/2007 9:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
Ollivier a écrit:
bande de branleurs
Traduction incorrecte.


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Mer 19/Déc/2007 19:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 26/Avr/2005 15:19
Messages: 315
[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.


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Mer 19/Déc/2007 22:08 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
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 ;)


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Jeu 20/Déc/2007 12:52 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Juin/2007 17:50
Messages: 1901
Citation:
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!


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Jeu 20/Déc/2007 18:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 26/Avr/2005 15:19
Messages: 315
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


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Mar 25/Déc/2007 20:44 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 20/Sep/2004 18:21
Messages: 83
Localisation: derriere toi fais gaffe!
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!


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Lun 30/Mar/2009 3:13 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Juin/2007 17:50
Messages: 1901
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


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 9 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

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


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye