Page 1 sur 1

...

Publié : mer. 25/août/2004 23:55
par Psycode
...

Publié : jeu. 26/août/2004 18:24
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

Publié : jeu. 26/août/2004 18:34
par Psycode
...

Publié : jeu. 26/août/2004 22:21
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.