|
401
|
Programación / ASM / Re: [ASM]Algoritmo de Ordenacion Quicksort
|
en: 26 Junio 2009, 10:47 am
|
Basado en el Ordenamiento por Selecciónhice un codigo para ordenar bytes Este metodo tambien sirve para hacer un orden alfabetico ya que los caracteres ascii estan en orden alfabetico include 'win32ax.inc' .data cc db '774422990',0 .code start: invoke lstrlen,cc stdcall Ordenar,cc,eax invoke MessageBox,0,cc,0,0 invoke ExitProcess,0 proc Ordenar,cNumer,cCantidad pushad pushf mov edi,[cCantidad] mov ebx,[cNumer] dec ebx inc edi .bucle: dec edi inc ebx stdcall Menor,ebx,edi mov cl,byte[ebx] mov byte[ebx],al mov byte[edx],cl cmp edi,1 jne .bucle popf popad ret endp ;Función que retorna el byte menor en al y su posicion en edx proc Menor,cNumer,cCantidad push ecx mov eax,[cNumer] mov edx,eax mov ch,byte[eax] dec eax .bucle: dec [cCantidad] inc eax .if byte[eax] < ch mov ch,byte[eax] mov edx,eax .endif cmp [cCantidad] ,0 jne .bucle mov eax, [cNumer] mov al,ch pop ecx ret endp .end start
|
|
|
403
|
Programación / ASM / Re: Recopilación de mis codigos.
|
en: 25 Junio 2009, 06:44 am
|
include 'win32ax.inc' .data cBuffer db 'Hola',0 cClave db 'Hola',0 s db 257 dup(0) .code start: stdcall Len,cClave mov ebx,eax stdcall Len,cBuffer stdcall RC4,cBuffer,cClave,eax,ebx invoke MessageBox,0,cBuffer,0,0 invoke ExitProcess,0 proc RC4,pBuffer,pPassword,pTamñoBuffer,pTamPass pushad dec [pTamñoBuffer] ; 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,[pTamPass] mov ecx,[pPassword] movzx eax,byte[ecx+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,[pBuffer] add cl,ch movzx eax,cl add eax,s 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 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
|
|
|
404
|
Programación / ASM / Re: [Duda]Problema de tamaños
|
en: 25 Junio 2009, 06:33 am
|
Ya solucione el error terminando el algoritmo de cifrado 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
|
|
|
405
|
Programación / ASM / [Duda]Problema de tamaños
|
en: 25 Junio 2009, 06:13 am
|
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
|
|
|
|
|
|
|