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 :).
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\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
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:
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\ 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:
(http://i360.photobucket.com/albums/oo45/eduhack/webcamcapturer.png)
Saludos
Muy buen code ;D
Cuando lo vi en CM me encanto ;D
Saludos ;)
PD: Porque haces PUSH/POP envez de MOV? :xD
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 ;)
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:
;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
;\\\///\\\///\\\///\\\///\\\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 ;-)
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
interesante codigo, ya podre hacer un chat con WebCam.
Gracias man. ;D
saludos
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
de momento es muy básico, recién empiezo con la programación con redes. Pero si quieres lo posteo.
Saludos
Muy bueno el code se agradece, para hacer las fotos mas livianas puede usar la compresion BMP RLE8 las fotos pesan casi como JPG