[Duda]Problema de tamaños

Iniciado por YST, 25 Junio 2009, 06:13 AM

0 Miembros y 1 Visitante están viendo este tema.

YST

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 :xD ) no puede ser un dword haber si alguien me ayuda a solucionar el problema :P

Código (asm) [Seleccionar]


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


Yo le enseñe a Kayser a usar objetos en ASM

YST

#1
Ya solucione el error terminando el algoritmo de cifrado :P
Código (asm) [Seleccionar]

include 'win32ax.inc'
.data
cBuffer db 'Hello world',0
cPassword db 'Password',0


.code
start:
stdcall Len,cPassword
mov ebx,eax
stdcall Len,cBuffer
stdcall RC4,cBuffer,cPassword,eax,ebx
invoke MessageBox,0,cBuffer,0,0
invoke ExitProcess,0
proc RC4,pBuffer,pPassword,pTamñoBuffer,pTamPass
locals
s rb MAX_PATH
endl
pushad
dec [pTamñoBuffer]
;   For i = 0 To 255
; DoEvents
; s(i) = i
;   Next i
lea 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,[pTamPass]
mov ecx,[pPassword]
movzx eax,byte[ecx+eax]
add esi,eax
stdcall lMod,esi,256
mov ebx, eax
lea 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
lea 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,[pBuffer]
add cl,ch
movzx eax,cl
lea edx,[s]
add eax,edx
movzx eax,byte[eax]
stdcall lMod,eax,256

mov edx,[pBuffer]
xor byte[edx+esi],al

cmp esi,[pTamñoBuffer]
jne .bucle3_
popad
ret
endp

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
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


Yo le enseñe a Kayser a usar objetos en ASM

Yurix

Gracias , así lo hago yo !!! ;D


Saludos y sigue así


http://kapetres.wordpress.com/ < Mi blog sobre ASM

Parece que alguien no quiere que la info sea liebre >

Alguien lo movio a ese lugar.

YST



Yo le enseñe a Kayser a usar objetos en ASM