SRCs de Hacker_Zero

Iniciado por [Zero], 18 Abril 2009, 11:51 AM

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

[Zero]

Bueno, lo primero no sé si esto debe ir aquí o en análisis y diseño de malware, sino no va a aquí que alguien lo mueva  :).

Código (asm) [Seleccionar]
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\Inyección de Código en Memoria //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\          By Hacker_Zero       //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\      http://www.eduhack.es    //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

Format PE GUI 4.0
entry start
include 'win32a.inc'

Proceso                 db 'explorer.exe',0
nUser32                 db 'USER32.DLL',0
nMessageBox             db 'MessageBoxA',0
hProceso                dd ?
DirFuncion              dd ?
TamañoDatos             dd ?
pInfo                   PROCESS_INFORMATION
sInfo                   STARTUPINFO

start:
;Cargamos la USER32.DLL
invoke LoadLibrary,nUser32

;Obtenemos la dirección de MessageBoxA
invoke GetProcAddress,eax,nMessageBox
mov [mMessageBoxA],eax

;Obtenemos la dirección de ExitProcess
push    [ExitProcess]
pop     [mExitProcess]

;Creamos el Proceso
invoke CreateProcessA,0,Proceso,0,0,0,CREATE_SUSPENDED,0,0,sInfo,pInfo

;Guardamos el Handle
push [pInfo.hProcess]
pop [hProceso]

;Obtenemos el tamaño e la función a inyectar
mov ebx,FIN
sub ebx,FuncionInyectada
mov [TamañoDatos],ebx

;Reservamos espacio en memoria para la función a inyectar
invoke VirtualAllocEx,[hProceso],0,[TamañoDatos],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [DirFuncion],eax

;Escribimos en memoria los datos
invoke WriteProcessMemory,[hProceso],[DirFuncion],FuncionInyectada,[TamañoDatos],0

;Creamos el hilo en el proceso
invoke CreateRemoteThread,[hProceso],0,0,[DirFuncion],0,0,0

;Salimos
invoke ExitProcess,0

;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
;\\\///\\\///\\\///\\\///\  Función Que se Inyecta  ///\\\///\\\///\\\///
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
proc FuncionInyectada
;Obtenemos la dirección de memoria donde nos estamos ejecutando
pushad
call delta
delta:
pop ebp
sub ebp,delta
push ebp ebp
pop ebx ecx

;Obtenemos la dirección donde se cargó el Mensaje y el Título
add ebx,Mensaje
add ecx,Titulo

;Llamamos a MessageboxA
push 0
push ebx
push ecx
push 0
call [ebp+mMessageBoxA]

;Llamamos a ExitProcess
push 0
call [ebp+mExitProcess]

Titulo           db 'Code Inyectado!',0
Mensaje          db 'xD',0

;Las direcciones en memoria de las apis
mMessageBoxA     dd ?
mExitProcess     dd ?
endp
FIN:
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
;\\\///\\\///\\\///\\\/// Fin Función Que se Inyecta //\\\///\\\///\\\///
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///

data import
    library KERNEL32,'KERNEL32.DLL'
    import  KERNEL32,\
            CreateProcessA,'CreateProcessA',\
            CreateRemoteThread,'CreateRemoteThread',\
            WriteProcessMemory,'WriteProcessMemory',\
            VirtualAllocEx,'VirtualAllocEx',\
            ExitProcess,'ExitProcess',\
            LoadLibrary,'LoadLibraryA',\
            GetProcAddress,'GetProcAddress'
end data   


Está comentado e intenté escribirlo de forma clara para que sea fácil de comprender.

Saludos

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

[Zero]

Bueno, pues hice esto para explorar lo que ofrece la AVICAP32.DLL y me sorprendió mucho, igual me animo a hacer un reproductor de música y/o vídeo  ;D. Bueno el programa tiene algunos fallos como que aveces se freezea al empezar a grabar (igual creando un nuevo hilo se soluciona o igual estoy haciendo algo mal  :P) y que probando con mi webcam un vídeo de 40 segundos me ocupó 350mb de disco  :o. Ésto creo que es porque no tiene soporte para compresión, igual con otras webcams no pasa, no sé.

EDITO: Pulsar ESC para detener la grabación!  ;D

Os dejo el source:

Código (asm) [Seleccionar]
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\ Ejemplo Controlador de WebCam //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\          By Hacker_Zero       //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\      http://www.eduhack.es    //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

Format PE GUI 4.0
entry start
include 'C:\fasm\include\win32ax.inc'
include 'C:\fasm\include\api\comdlg32.inc'
include 'C:\fasm\include\api\kernel32.inc'
include 'C:\fasm\include\api\user32.inc'

;Constantes para los botones
ID_COMENZAR                  = 101
ID_PARAR                     = 102
ID_FOTO                      = 103
ID_GUARDAR                   = 104
ID_GRABAR                    = 105
ID_COMPRESION                = 107
ID_VIDEO                     = 108

;Constantes para controlar el driver
WM_CAP_DRIVER_CONNECT        = 1034
WM_CAP_DRIVER_DISCONNECT     = 1035
WM_CAP_FILE_SAVEAS           = 1047
WM_CAP_FILE_SAVEDIB          = 1049
WM_CAP_DLG_VIDEOCOMPRESSION  = 1070
WM_CAP_SET_PREVIEW           = 1074
WM_CAP_SET_PREVIEWRATE       = 1076
WM_CAP_SET_SCALE             = 1077
WM_CAP_GRAB_FRAME            = 1084
WM_CAP_SEQUENCE              = 1086
WM_CAP_DLG_VIDEOFORMAT       = 1065

section '.data' data readable writeable

        nArchivo         rb 256
        hWebcam          dd ?
        Filtro           db 'Bitmap (*.bmp)',0,'*.bmp',0
        Filtro2          db 'AVI (*.avi)',0,'*.avi',0
        CD               OPENFILENAME ?

section '.code' code readable executable
start:

        xor ebx,ebx       ;ebx=0
        invoke GetModuleHandle,ebx
        invoke  DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,ebx
        invoke  ExitProcess,ebx

;Ciclo de eventos de la ventana
proc DialogProc hwnddlg,msg,wparam,lparam
        push    ebx esi edi
        cmp     [msg],WM_CLOSE
        je      wmclose
        cmp     [msg],WM_COMMAND
        je      wmcommand
        cmp     [msg],WM_INITDIALOG
        je      wminitdialog
        xor     eax,eax
        jmp     finish

  wminitdialog:
        invoke capCreateCaptureWindowA,ebx,WS_VISIBLE or WS_CHILD,10,10,350,270,[hwnddlg],ebx
        mov [hWebcam],eax
        jmp processed
  wmcommand:
        cmp [wparam],BN_CLICKED shl 16 + ID_COMENZAR
        je Comenzar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_PARAR
        je Parar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_FOTO
        je Foto_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_GUARDAR
        je Guardar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_GRABAR
        je Grabar_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_COMPRESION
        je Compresion_Click
        cmp [wparam],BN_CLICKED shl 16 + ID_VIDEO
        je Video_Click
        jmp finish

  wmclose:
        invoke  SendMessage,[hWebcam],WM_CAP_DRIVER_DISCONNECT,ebx,ebx
        invoke  DestroyWindow,[hWebcam]
        invoke  EndDialog,[hwnddlg],ebx
  processed:
        mov     eax,1
  finish:
        pop     edi esi ebx
        ret
endp

;Empezamos a capturar
proc Comenzar_Click
     invoke  SendMessage,[hWebcam],WM_CAP_DRIVER_CONNECT,ebx,ebx        ;Conectamos el driver
     invoke  SendMessage,[hWebcam],WM_CAP_SET_SCALE,TRUE,ebx            ;Escalamos la imagen al tamaño de la ventana
     invoke  SendMessage, [hWebcam], WM_CAP_SET_PREVIEWRATE,100,ebx     ;Fotos por segundo que se muestran
     invoke  SendMessage,[hWebcam],WM_CAP_SET_PREVIEW,TRUE,ebx          ;Habilitamos el preview en la ventana
                                                                        ;(que se vea video en la ventana)
     jmp finish
endp

;Paramos de capturar
proc Parar_Click
     invoke SendMessage,[hWebcam],WM_CAP_DRIVER_DISCONNECT,ebx,ebx      ;Desconectamos el driver
     jmp finish
endp

;Guardar imagen en archivo
proc Guardar_Click
     mov [CD.lStructSize],76
     mov [CD.lpstrFilter],Filtro
     mov [CD.lpstrFile],nArchivo
     mov [CD.nMaxFile],256
     invoke GetSaveFileName,CD                                          ;Mostramos el Common Dialog
     invoke lstrcat,nArchivo,'.bmp'                                     ;Añadimos la extensión al archivo
     invoke SendMessage,[hWebcam],WM_CAP_FILE_SAVEDIB,ebx,nArchivo      ;Guardamos la imagen en el archivo.bmp
     jmp finish
endp

;Hacemos una foto
proc Foto_Click
     invoke SendMessage,[hWebcam],WM_CAP_GRAB_FRAME,ebx,ebx             ;Hacemos la foto
     jmp finish
endp

;Empezamos a grabar (pulsar ESC para detener)
proc Grabar_Click
     mov [CD.lStructSize],76
     mov [CD.lpstrFilter],Filtro2
     mov [CD.lpstrFile],nArchivo
     mov [CD.nMaxFile],256
     invoke GetSaveFileName,CD                                         ;Mostramos el Common Dialog
     invoke lstrcat,nArchivo,'.avi'                                    ;Añadimos la extensión al archivo
     invoke SendMessage,[hWebcam],WM_CAP_SEQUENCE,ebx,ebx              ;Empezamos a grabar la secuencia
     invoke SendMessage,[hWebcam],WM_CAP_FILE_SAVEAS,ebx,nArchivo      ;Guardamos la secuencia en el archivo al terminar
     jmp finish
endp

proc Video_Click
     invoke SendMessage,[hWebcam],WM_CAP_DLG_VIDEOFORMAT,ebx,ebx       ;Mostramos la ventana de configuración de
                                                                       ;vídeo (varía según el dispositivo)
     jmp finish
endp

proc Compresion_Click
     invoke SendMessage,[hWebcam],WM_CAP_DLG_VIDEOCOMPRESSION,ebx,ebx  ;Mostramos la ventana de configuración de
                                                                       ;compresión (varía según el dispositivo)
     jmp finish
endp

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          comdlg32,'COMDLG32.DLL',\
          avicap32,'AVICAP32.DLL'

  import  avicap32,capCreateCaptureWindowA,'capCreateCaptureWindowA'

section '.rsrc' resource data readable

  directory RT_DIALOG,dialogs

  resource dialogs,37,LANG_ENGLISH+SUBLANG_DEFAULT,Principal

  dialog Principal,'WebCam Capturer',330,100,250,220,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'BUTTON','Comenzar',ID_COMENZAR,20,180,45,14,WS_VISIBLE
    dialogitem 'BUTTON','Parar',ID_PARAR,70,180,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Foto',ID_FOTO,120,180,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Guardar',ID_GUARDAR,170,180,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Grabar',ID_GRABAR,20,200,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Compresión',ID_COMPRESION,120,200,45,15,WS_VISIBLE
    dialogitem 'BUTTON','Video',ID_VIDEO,170,200,45,15,WS_VISIBLE
  enddialog


Os dejo una captura para los que no quieren compilar ¬¬'  ;D:



Saludos

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

Karcrack

#2
Muy buen code ;D

Cuando lo vi en CM me encanto ;D

Saludos ;)

PD: Porque haces PUSH/POP envez de MOV? :xD

[Zero]

Porque no se puede hacer un mov entre dos variables, o lo haces con push y pop o usas un registro como hueco temporal y así lo haces con mov.

Saludos  ;)

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

Karcrack

Cita de: Hacker_Zero en 18 Abril 2009, 13:22 PM
Porque no se puede hacer un mov entre dos variables, o lo haces con push y pop o usas un registro como hueco temporal y así lo haces con mov.

Saludos  ;)
Cierto :xD

Por cierto, he estado testeando tu code y no inyecta, crea un proceso nuevo, habria que hacerlo asi para inyectar:
Código (asm) [Seleccionar]
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\Inyección de Código en Memoria //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\          By Hacker_Zero       //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\      http://www.eduhack.es    //\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

Format PE GUI 4.0
entry start
include 'win32a.inc'

;Proceso                 db 'explorer.exe',0
Proceso                 dd  1172d ;PID del proceso a inyectar
nUser32                 db 'USER32.DLL',0
nMessageBox             db 'MessageBoxA',0
hProceso                dd ?
DirFuncion              dd ?
TamañoDatos             dd ?
pInfo                   PROCESS_INFORMATION
sInfo                   STARTUPINFO

start:
;Cargamos la USER32.DLL
invoke LoadLibrary,nUser32

;Obtenemos la dirección de MessageBoxA
invoke GetProcAddress,eax,nMessageBox
mov [mMessageBoxA],eax

;Obtenemos la dirección de ExitProcess
push    [ExitProcess]
pop     [mExitProcess]

;Creamos el Proceso
;invoke CreateProcessA,0,Proceso,0,0,0,CREATE_SUSPENDED,0,0,sInfo,pInfo
invoke OpenProcess, PROCESS_CREATE_THREAD + PROCESS_VM_OPERATION + PROCESS_VM_WRITE, FALSE, [Proceso]
;Guardamos el Handle
;push [pInfo.hProcess]
;pop [hProceso]
mov [hProceso], eax

;Obtenemos el tamaño e la función a inyectar
mov ebx,FIN
sub ebx,FuncionInyectada
mov [TamañoDatos],ebx

;Reservamos espacio en memoria para la función a inyectar
invoke VirtualAllocEx,[hProceso],0,[TamañoDatos],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [DirFuncion],eax

;Escribimos en memoria los datos
invoke WriteProcessMemory,[hProceso],[DirFuncion],FuncionInyectada,[TamañoDatos],0

;Creamos el hilo en el proceso
invoke CreateRemoteThread,[hProceso],0,0,[DirFuncion],0,0,0

;Salimos
invoke ExitProcess,0

;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
;\\\///\\\///\\\///\\\///\  Función Que se Inyecta  ///\\\///\\\///\\\///
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
proc FuncionInyectada
;Obtenemos la dirección de memoria donde nos estamos ejecutando
pushad
call delta
delta:
pop ebp
sub ebp,delta
push ebp ebp
pop ebx ecx

;Obtenemos la dirección donde se cargó el Mensaje y el Título
add ebx,Mensaje
add ecx,Titulo

;Llamamos a MessageboxA
push 0
push ebx
push ecx
push 0
call [ebp+mMessageBoxA]

;Llamamos a ExitProcess
;push 0
;call [ebp+mExitProcess]

Titulo           db 'Code Inyectado!',0
Mensaje          db 'xD',0

;Las direcciones en memoria de las apis
mMessageBoxA     dd ?
mExitProcess     dd ?
endp
FIN:
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
;\\\///\\\///\\\///\\\/// Fin Función Que se Inyecta //\\\///\\\///\\\///
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///

data import
    library KERNEL32,'KERNEL32.DLL'
    import  KERNEL32,\
            OpenProcess,'OpenProcess',\;CreateProcessA,'CreateProcessA',\
            CreateRemoteThread,'CreateRemoteThread',\
            WriteProcessMemory,'WriteProcessMemory',\
            VirtualAllocEx,'VirtualAllocEx',\
            ExitProcess,'ExitProcess',\
            LoadLibrary,'LoadLibraryA',\
            GetProcAddress,'GetProcAddress'
end data


Haciendo esto no seria recomendable usar ExitProcess... sino te cargas el Explorer :xD :xD ;-)

[Zero]

Si, osea es un código de inyección en memoria, no de inyección en proceso, crea una nueva instancia del exe e inyecta el código, para inyectar el proceso sería lo mismo casi pero con OpenProcess, como bien dijiste jeje.

Saludos

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

Arkangel_0x7C5

interesante codigo, ya podre hacer un chat con WebCam.
Gracias man. ;D

saludos

[Zero]

Jaja, perfecto luego pones el código eh?  ;D. Lo que yo no conseguí fue comprimir la salida en vídeo, no se si es que mi cam no vale, aunque seguro hay otras formas, tampoco busqué mucho la verdad. Me alegro de que te haya servido.

Saludos

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

Arkangel_0x7C5

de momento es muy básico, recién empiezo con la programación con redes. Pero si quieres lo posteo.

Saludos

c4st0r

Muy bueno el code se agradece, para hacer las fotos mas livianas puede usar la compresion BMP RLE8 las fotos pesan casi como JPG