...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Psycode
Messages : 131
Inscription : lun. 23/août/2004 18:47
Localisation : Jupiter ?

...

Message par Psycode »

...
Dernière modification par Psycode le ven. 03/sept./2004 17:26, modifié 1 fois.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Psycode,

Jamais facile de reprendre un code ASM si il n'est pas un peu commenté !

Bon ... voila ce que j'ai fait pour essayer d'aider à la fois sur le bug et sur le principe :

- avant tout le bug n'est ni Pure ni ASM mais un bug de codage à mon point de vue
- J'ai décompilé le code ASM dans une procédure XorWithKeyPBCode() pour en retirer l'algorithmique et corrigé le bug
- J'ai recodé en ASM natif (avec les !) pour en faire une procédure aussi performante que l'original (Procédure XorWithKeyASMCode)

J'ai laissé également les lignes de test à la fin.

Voila qui j'espère te permettra d'en faire qq chose.

Slts

Code : Tout sélectionner

Procedure XorWithKey (sText.l, LenText.l, sKey.l, LenKey.l)
  ! XOR     ecx, ecx
  ! MOV     esi, dword [esp]
  ! MOV     edi, dword [esp+8]
  ! MOV     edx, dword [esp+4]
  ! MOV     ebp, dword [esp+12]
  ! ADD     ebp, esi
! _xornextbyte:
  ! MOV     al, [esi]
  ! MOV     bl, [edi]
  ! XOR     al, bl
  ! MOV     [esi], al
  ! INC      ecx
  ! INC      esi
  ! INC      edi
  ! CMP     esi, ebp
  ! JGE      _xorcomplete
  ! CMP     ecx, edx
  ! JGE      _xornextround
  ! JMP      _xornextbyte
! _xornextround:
  ! XOR     ecx, ecx
  ! SUB     edi, edx
  ! JMP      _xornextbyte
! _xorcomplete:
EndProcedure

Procedure XorWithKeyPBCode(sText.l, LenText.l, sKey.l, LenKey.l)
  LenKey + sText
  Repeat
    For i = 0 To LenKey
      PokeB(sText, PeekB(sText) ! PeekB(sKey))
      sText + 1
      sKey + 1
      If sText => LenKey : Goto XorWithKeyPBCodecomplete : EndIf
    Next
    sKey - LenText
  ForEver
XorWithKeyPBCodecomplete:
EndProcedure

Procedure XorWithKeyASMCode(sText.l, LenText.l, sKey.l, LenKey.l)
  !  MOV     eax, dword [esp+12] ; LenKey + sText
  !  ADD     eax, dword [esp]
! _XorWithKeyASMCode_Repeat: ; Repeat
    !  MOV     ebx, 0 ; i = 0 ; For i = 0 To LenKey
! _XorWithKeyASMCode_For_i:
      !  MOV     ecx, dword [esp] ; PokeB(sText, PeekB(sText) ! PeekB(sKey))
      !  MOV     edx, dword [esp+8]
      !  MOV     esi, [ecx]
      !  XOR     esi, [edx]
      !  MOV     [ecx], esi
      !  INC      ecx ; sText + 1
      !  INC      edx ; sKey + 1
      !  CMP     ecx, dword [esp+12] ; If sText => LenKey : Goto XorWithKeyASMCodecomplete : EndIf
      !  JGE      _XorWithKeyASMCodecomplete
    !  INC      ebx ; i + 1 ; Next
    !  CMP     ebx, dword [esp+12] ; If i <= LenKey : Goto XorWithKeyASMCode_For_i : EndIf
    !  JGE      _XorWithKeyASMCode_For_i
    !  SUB     edx, dword [esp+4] ; sKey - LenText
  !  JMP      _XorWithKeyASMCode_Repeat ; Goto XorWithKeyASMCode_Repeat
! _XorWithKeyASMCodecomplete:
EndProcedure

sText.s = "PureBasic est super."
sKey.s = "azertyuiop"
Debug sText
;// Encrypt
XorWithKey(@sText, Len(sText), @sKey, Len(sKey))
;// And again, which decrypts it
Debug sText
XorWithKey(@sText, Len(sText), @sKey, Len(sKey))
Debug sText

sText.s = "PureBasic est super."
sKey.s = "azertyuiop"
XorWithKeyPBCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText
XorWithKeyPBCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText

sText.s = "Voyez le brick géant que j'examine près du wharf"
sKey.s = "azertyuiop"
XorWithKeyPBCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText
XorWithKeyPBCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText

sText.s = "PureBasic est super."
sKey.s = "azertyuiop"
XorWithKeyASMCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText
XorWithKeyASMCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText

sText.s = "Voyez le brick géant que j'examine près du wharf"
sKey.s = "azertyuiop"
XorWithKeyASMCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText
XorWithKeyASMCode(@sText, Len(sText), @sKey, Len(sKey))
Debug sText

Count = 100000

tz = ElapsedMilliseconds() : For i = 1 To Count : sText.s = "PureBasic est super." : sKey.s = "azertyuiop" : XorWithKey(@sText, Len(sText), @sKey, Len(sKey)) : XorWithKey(@sText, Len(sText), @sKey, Len(sKey)) : Next : Debug ElapsedMilliseconds() - tz

tz = ElapsedMilliseconds() : For i = 1 To Count : sText.s = "PureBasic est super." : sKey.s = "azertyuiop" : XorWithKeyPBCode(@sText, Len(sText), @sKey, Len(sKey)) : XorWithKeyPBCode(@sText, Len(sText), @sKey, Len(sKey)) : Next : Debug ElapsedMilliseconds() - tz

tz = ElapsedMilliseconds() : For i = 1 To Count : sText.s = "PureBasic est super." : sKey.s = "azertyuiop" : XorWithKeyASMCode(@sText, Len(sText), @sKey, Len(sKey)) : XorWithKeyASMCode(@sText, Len(sText), @sKey, Len(sKey)) : Next : Debug ElapsedMilliseconds() - tz
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Psycode
Messages : 131
Inscription : lun. 23/août/2004 18:47
Localisation : Jupiter ?

Message par Psycode »

...
Dernière modification par Psycode le ven. 03/sept./2004 17:27, modifié 1 fois.
Wait And See...
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Après approfondissement le bug est du à une question de principe :

Si on fait :

Code : Tout sélectionner

  sText.s = "Voyez le brick géant que j'examine près du wharf"
  sKey.s = "PureBasic est super."
  XorWithKey(@sText, Len(sText), @sKey, Len(sKey))
  Debug sText
  XorWithKey(@sText, Len(sText), @sKey, Len(sKey))
  Debug sText
on a l'erreur, tandis que si l'on fait :

Code : Tout sélectionner

  sText.s = "Voyez le brick géant que j'examine près du wharf"
  sKey.s = "PureBasic est super."
  lText = Len(sText)
  XorWithKey(@sText, lText, @sKey, Len(sKey))
  Debug sText
  XorWithKey(@sText, lText, @sKey, Len(sKey))
  Debug sText
cela à l'air de fonctionner.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Répondre