Hola,
pasando el algoritmo de RC4 a asm tengo el siguiente problema y es que al hacer un xor a un byte el otro operando ( o como se diga
) no puede ser un dword haber si alguien me ayuda a solucionar el problema
include 'win32ax.inc'
.data
cBuffer db 'Hola',0
cClave db 'Hola',0
s db 257 dup(0)
b rb 20
largo dd ?
.code
start:
stdcall Len,cBuffer
dec eax
push eax
pop [largo]
; For i = 0 To 255
; DoEvents
; s(i) = i
; Next i
mov eax,s
mov byte[eax],0
inc eax
mov ecx,256
.bucle1_:
mov bl,byte[eax-1]
inc bl
mov byte[eax] ,bl
inc eax
loop .bucle1_
; For i = 0 To 255
; DoEvents
; j = (j + s(i) + Key(i Mod Len(sKey))) Mod 256
; tmp = s(i)
; s(i) = s(j)
; s(j) = tmp
; Next i
;j = ebx
;ja = esi
;I = edi
xor ebx,ebx
mov edi,-1
.bucle2_:
inc edi
xor esi,esi
mov esi,ebx
movzx eax,byte[s+edi]
add esi,eax
stdcall lMod,edi,<stdcall Len,cClave>
movzx eax,byte[cClave+eax]
add esi,eax
stdcall lMod,esi,256
mov ebx, eax
mov eax,s
mov cl,byte[eax+ebx] ; s(j)
mov ch,byte[eax+edi] ; s(i)
mov byte[eax+edi],cl
mov byte[eax+ebx],ch
cmp edi,255
jne .bucle2_
inc edi
; For l = 0 To UBound(Buffer)
; DoEvents
; i = (i + 1) Mod 256
; j = (j + s(i)) Mod 256
; tmp = s(i)
; s(i) = s(j)
; s(j) = tmp
; Buffer(l) = Buffer(l) Xor (s((s(i) + s(j)) Mod 256))
; Next l
xor esi,esi ;esi = l
dec esi ; esi = -1
.bucle3_:
inc esi
mov eax,edi
inc eax
stdcall lMod,eax,256
mov edi,eax
mov eax,ebx
xor ecx,ecx
movzx ecx,byte[s+edi]
add eax,ecx
stdcall lMod,eax,256
mov ebx,eax
mov eax,s
mov cl,byte[eax+ebx] ; s(j)
mov ch,byte[eax+edi] ; s(i)
mov byte[eax+edi],cl
mov byte[eax+ebx],ch
mov eax,cBuffer
add cl,ch
movzx eax,cl
add eax,s
stdcall lMod,eax,256
mov edx,cBuffer
xor byte[edx+esi],eax ; EL Problema esta aqui
cmp esi,[largo]
jne .bucle3_
invoke ExitProcess,0
proc lMod,c1,c2
push edx
xor edx,edx
mov eax,[c1]
idiv [c2]
push edx
pop eax
pop edx
ret
endp
proc Len,cCadena ;Funcion que mide la cadena
push ecx edi
mov ecx,-1
mov edi,[cCadena]
mov al,0
repnz scasb
mov eax,ecx
not eax
dec eax
pop edi ecx
ret
endp
.end start