...
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
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.
Après approfondissement le bug est du à une question de principe :
Si on fait :
on a l'erreur, tandis que si l'on fait :
cela à l'air de fonctionner.
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
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
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.