Поиск файлов используя Nt-функции...

Тема в разделе "WASM.WIN32", создана пользователем glukker, 22 фев 2008.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вот более и менее оптимизированный вариант:
    Код (Text):
    1. .data
    2. szSlesh db "\",0,0,0
    3. szLink db "\??\C:\",0
    4.  
    5. .code
    6. align 4
    7. ZwSearch proc uses esi lpPath:dword,lpPathLen:dword
    8.      local hFind:HANDLE
    9.      local iosb:IO_STATUS_BLOCK
    10.      
    11.        invoke ZwOpenFile,addr hFind,100001h,lpPath,addr iosb,7,21h
    12.         .if eax == 0 && iosb.Information == 1
    13.            invoke GlobalAlloc,40h,260
    14.            mov esi,eax
    15.            lea ecx,iosb
    16.            xor eax,eax
    17.            invoke ZwQueryDirectoryFile,hFind,eax,eax,eax,ecx,esi,260,1,1,eax,1
    18.             .while eax != 80000006h
    19.                or eax,eax
    20.                jnz @F
    21.                lea eax,[esi+040h] ;FileName
    22.                mov ecx,dword ptr [esi+03Ch] ;FileNameLength
    23.                mov byte ptr [eax+ecx],0
    24.                cmp word ptr [eax],'.'
    25.                jz s_next
    26.                cmp word ptr [eax+2],'.'
    27.                jz s_next
    28.  
    29.                mov ebx,lpPath
    30.                mov ebx,dword ptr [ebx+000000008h] ;ObjectName
    31.                mov edi,dword ptr [ebx+4] ;Buffer
    32.  
    33.                mov ecx,lpPathLen
    34.                mov byte ptr [edi+ecx],0
    35.                add edi,ecx
    36.  
    37.                push esi
    38.                push ecx
    39.                lea esi,[esi+040h]
    40.                rep movsb
    41.                pop ecx
    42.                pop esi
    43.    
    44.                test dword ptr [esi+38h],10h ;FileAttributes
    45.                jz s_file
    46.                
    47.                add ecx,dword ptr [esi+03Ch] ;FileNameLength
    48.                mov edi,dword ptr [ebx+4] ;Buffer
    49.                add edi,ecx
    50.                
    51.                push esi
    52.                push ecx
    53.                mov esi,offset szSlesh
    54.                rep movsb
    55.                pop ecx
    56.                pop esi
    57.  
    58.                add ecx,2
    59.                mov word ptr [ebx],cx ;Length
    60.  
    61.                   pusha
    62.                   lea eax,[esi+040h] ;FileName
    63.                   invoke MessageBoxW,0,eax,dword ptr [ebx+4],0
    64.                   popa
    65.                  
    66.                invoke ZwSearch,lpPath,ecx
    67.                jmp s_next
    68.         s_file:
    69.  
    70.                   pusha
    71.                   lea eax,[esi+040h] ;FileName
    72.                   invoke MessageBoxW,0,eax,dword ptr [ebx+4],0
    73.                   popa
    74.                  
    75.         s_next:
    76.                lea ecx,iosb
    77.                xor eax,eax
    78.                invoke ZwQueryDirectoryFile,hFind,eax,eax,eax,ecx,esi,260,1,1,eax,eax
    79.             .endw
    80.         @@:
    81.            invoke GlobalFree,esi
    82.            invoke ZwClose,hFind
    83.         .endif
    84.        ret
    85. ZwSearch endp
    86. start proc
    87.      local as:ANSI_STRING
    88.      local us:UNICODE_STRING
    89.      local oa:OBJECT_ATTRIBUTES
    90.  
    91.        invoke lstrlen,offset szLink
    92.        mov as._Length,ax
    93.        mov as.MaximumLength,ax
    94.        mov eax,offset szLink
    95.        mov as.Buffer,eax
    96.        invoke RtlAnsiStringToUnicodeString,addr us,addr as,1
    97.        invoke RtlInitUnicodeString,addr us,us.Buffer
    98.        
    99.        xor eax,eax
    100.        lea ecx,oa
    101.        mov dword ptr [ecx],000000018h
    102.        and dword ptr [ecx+000000004h],eax
    103.        mov dword ptr [ecx+00000000Ch],00000240h
    104.        and dword ptr [ecx+000000010h],eax
    105.        lea ebx,us
    106.        mov dword ptr [ecx+000000008h],ebx
    107.        and dword ptr [ecx+000000014h],eax
    108.        
    109.        movzx ecx,us._Length
    110.        invoke ZwSearch,addr oa,ecx
    111.        invoke ExitProcess,0
    112. start endp
     
  2. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Clerk и Flasher спасибо конечно, мне код нужен на C++
    может кто нить кинуть код на С++?
     
  3. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    когдато писал функцию удаления директории и ничего не стоит переписать этот код под поиск файлов (тут правда на делфях, но смысл понять думаю можно)
    Код (Text):
    1. function DeleteDirectory(DirName: PUNICODE_STRING): NTSTATUS;
    2. var
    3.   Status:       NTSTATUS;
    4.   DirFile:      HANDLE;
    5.   Size:         ULONG;
    6.   ObjAttr:      OBJECT_ATTRIBUTES;
    7.   IoStatus:     IO_STATUS_BLOCK;
    8.   FileName:     UNICODE_STRING;
    9.   Buf:          PWCHAR;
    10.   FileDirInfo:  PFILE_DIRECTORY_INFORMATION;
    11. begin
    12.   InitializeObjectAttributes (@ObjAttr, DirName,
    13.                                               OBJ_CASE_INSENSITIVE,
    14.                               0, nil);
    15.   Status := NtCreateFile(@DirFile,
    16.                          FILE_LIST_DIRECTORY,
    17.                          @ObjAttr,
    18.                          @IoStatus, nil,
    19.                          FILE_ATTRIBUTE_DIRECTORY,
    20.                          FILE_SHARE_DELETE + FILE_SHARE_WRITE + FILE_SHARE_READ,
    21.                          FILE_OPEN,
    22.                          FILE_DIRECTORY_FILE,
    23.                          nil, 0);
    24.   if Status = STATUS_SUCCESS then
    25.     begin
    26.       Size := SizeOf(FILE_DIRECTORY_INFORMATION) + 256;
    27.       FileDirInfo := VirtualAlloc(nil,
    28.                                   Size,
    29.                                   MEM_COMMIT or MEM_RESERVE,
    30.                                   PAGE_READWRITE);
    31.       Status := NtQueryDirectoryFile(DirFile, 0, nil,
    32.                                      nil, @IoStatus,
    33.                                      FileDirInfo, Size,
    34.                                      FileDirectoryInformation,
    35.                                      true, nil, true);
    36.       while Status <> STATUS_NO_MORE_FILES do
    37.         begin
    38.           if not cmpwclen(FileDirInfo^.FileName, '.', FileDirInfo^.FileNameLength) then
    39.             if not cmpwclen(FileDirInfo^.FileName, '..', FileDirInfo^.FileNameLength) then
    40.               begin
    41.                 Buf := VirtualAlloc(nil,
    42.                                     DirName^.Length + FileDirInfo^.FileNameLength + 2,
    43.                                     MEM_COMMIT or MEM_RESERVE,
    44.                                     PAGE_READWRITE);
    45.  
    46.                 CopyMemory(Buf, DirName^.Buffer, DirName^.Length);
    47.                 PWCHAR(ULONG(Buf) + DirName^.Length)^ := '\';
    48.                 CopyMemory(PVOID(ULONG(Buf) + 2 + DirName^.Length),
    49.                            @FileDirInfo^.FileName,
    50.                            FileDirInfo^.FileNameLength);
    51.                 RtlInitUnicodeString(@FileName, Buf);
    52.                 if (FileDirInfo^.FileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
    53.                   DeleteDirectory(@FileName)
    54.                 else
    55.                   DeleteFile(@FileName, FILE_NON_DIRECTORY_FILE);
    56.                 VirtualFree(Buf, 0, MEM_RELEASE)
    57.               end;
    58.           VirtualFree(FileDirInfo, 0, MEM_RELEASE);
    59.           FileDirInfo := VirtualAlloc(nil,
    60.                                       Size,
    61.                                       MEM_COMMIT or MEM_RESERVE,
    62.                                       PAGE_READWRITE);
    63.           Status := NtQueryDirectoryFile(DirFile, 0, nil,
    64.                                          nil, @IoStatus,
    65.                                          FileDirInfo, Size,
    66.                                          FileDirectoryInformation,
    67.                                          true, nil, false)
    68.         end;
    69.       VirtualFree(FileDirInfo, 0, MEM_RELEASE);
    70.       NtClose(DirFile);
    71.       Status := DeleteFile(DirName, FILE_DIRECTORY_FILE)
    72.     end;
    73.   Result := Status
    74. end;
     
  4. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Klayd
    огромнейшее спасибо, буду переводить и изучать...
    Подскажи, а что за строка cpmpwclen?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Куда тебе на натив с последним вопросом, ты с разделом попутал -> Beginners,
    вначале с Win32 разберись.
     
  6. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    функция сравнения строк, например такая:
    Код (Text):
    1. function cmpwclen(Str1: PWideChar;
    2.                    Str2: PWideChar;
    3.                    Len: integer): boolean;
    4. var
    5.   i:integer;
    6. begin
    7.   Result := true;
    8.   for i:=0 to (len div 2)-1 do
    9.     if str1[i]<>str2[i] then Result := false
    10. end;
    зы: можно и другие использовать :)
     
  7. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Clerk
    ну так что такое cpmpwclen?
     
  8. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    ну всё больше спасибо, очень помогло...
     
  9. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Использую код товарища Flasher'а, но есть проблема: вроде как работает рекурсивно и должно искать во всех подпапках - ан нет, в некоторых ищет, а в некоторых нет. Как будто это зависит от фазы луны.
    Как я понял - иногда вылетает ZwOpenFile c кодом ошибки С0000033h.

    Код:
    Код (Text):
    1. .386
    2.  
    3. .model flat, stdcall
    4. option casemap: none
    5.  
    6. include \masm32\include\windows.inc
    7. include \masm32\include\kernel32.inc
    8. include \masm32\include\masm32.inc
    9. include \masm32\include\user32.inc
    10.  
    11. includelib \masm32\lib\masm32.lib
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\user32.lib
    14. includelib \masm32\lib\w2k\ntdll.lib
    15.  
    16. IO_STATUS_BLOCK STRUCT      ; sizeof = 08h
    17.     Status      SDWORD      ?   ; 0000h  NTSTATUS
    18.     Information DWORD       ?   ; 0004h
    19. IO_STATUS_BLOCK ENDS
    20.  
    21. UNICODE_STRING STRUCT
    22.     _Length     WORD    ?       ; len of string in bytes (not chars)
    23.     MaximumLength   WORD    ?       ; len of Buffer in bytes (not chars)
    24.     Buffer          PWSTR   ?       ; pointer to string
    25. UNICODE_STRING ENDS
    26.  
    27. _STRING STRUCT
    28.     _Length         WORD    ?
    29.     MaximumLength   WORD    ?
    30.     Buffer          DWORD   ?   ; PCHAR
    31. _STRING ENDS
    32.  
    33. ANSI_STRING equ <_STRING>
    34.  
    35. PUNICODE_STRING typedef PTR UNICODE_STRING
    36.  
    37. OBJECT_ATTRIBUTES STRUCT        ; sizeof = 18h
    38.     _Length                     DWORD           ? ; original name Length
    39.     RootDirectory               HANDLE          ?
    40.     ObjectName                  PUNICODE_STRING ?
    41.     Attributes                  DWORD           ?
    42.     SecurityDescriptor          PVOID           ? ; Points to type SECURITY_DESCRIPTOR
    43.     SecurityQualityOfService    PVOID           ? ; Points to type SECURITY_QUALITY_OF_SERVICE
    44. OBJECT_ATTRIBUTES ENDS
    45.  
    46. ZwOpenFile                                         proto stdcall :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
    47. ZwQueryDirectoryFile                               proto stdcall :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
    48. ZwClose                                            proto stdcall :DWORD
    49. RtlAnsiStringToUnicodeString                       proto stdcall :DWORD, :DWORD, :DWORD
    50. RtlInitUnicodeString                               proto stdcall :DWORD, :DWORD
    51.  
    52.  
    53. .data
    54. szSlesh db "\",0,0,0
    55. szLink db "\??\G:\",0
    56.  
    57. COUNTER dd 0
    58.  
    59. .code
    60. align 4
    61. ZwSearch proc uses esi lpPath:dword,lpPathLen:dword
    62.      local hFind:HANDLE
    63.      local iosb:IO_STATUS_BLOCK
    64.      
    65.        invoke ZwOpenFile,addr hFind,100001h,lpPath,addr iosb,7,21h
    66.         .if eax == 0 && iosb.Information == 1
    67.            invoke GlobalAlloc,40h,260
    68.            mov esi,eax
    69.            lea ecx,iosb
    70.            xor eax,eax
    71.            invoke ZwQueryDirectoryFile,hFind,eax,eax,eax,ecx,esi,260,1,1,eax,1
    72.             .while eax != 80000006h
    73.                or eax,eax
    74.                jnz @F
    75.                lea eax,[esi+040h] ;FileName
    76.                mov ecx,dword ptr [esi+03Ch] ;FileNameLength
    77.                mov byte ptr [eax+ecx],0
    78.                cmp word ptr [eax],'.'
    79.                jz s_next
    80.                cmp word ptr [eax+2],'.'
    81.                jz s_next
    82.  
    83.                mov ebx,lpPath
    84.                mov ebx,dword ptr [ebx+000000008h] ;ObjectName
    85.                mov edi,dword ptr [ebx+4] ;Buffer
    86.  
    87.                mov ecx,lpPathLen
    88.                mov byte ptr [edi+ecx],0
    89.                add edi,ecx
    90.  
    91.                push esi
    92.                push ecx
    93.                lea esi,[esi+040h]
    94.                rep movsb
    95.                pop ecx
    96.                pop esi
    97.    
    98.                test dword ptr [esi+38h],10h ;FileAttributes
    99.                jz s_file
    100.                
    101.                add ecx,dword ptr [esi+03Ch] ;FileNameLength
    102.                mov edi,dword ptr [ebx+4] ;Buffer
    103.                add edi,ecx
    104.                
    105.                push esi
    106.                push ecx
    107.                mov esi,offset szSlesh
    108.                rep movsb
    109.                pop ecx
    110.                pop esi
    111.  
    112.                add ecx,2
    113.                mov word ptr [ebx],cx ;Length
    114.                   ; Это ПАПКА
    115.                   ;pusha
    116.                   ;lea eax,[esi+040h] ;FileName
    117.                   ;invoke MessageBoxW,0,eax,dword ptr [ebx+4],0
    118.                   ;popa
    119.                  
    120.                invoke ZwSearch,lpPath,ecx
    121.                jmp s_next
    122.         s_file:
    123.                   ; ЭТО ФАЙЛ
    124.                   ;pusha
    125.                   ;lea eax,[esi+040h] ;FileName
    126.                   ;invoke MessageBoxW,0,eax,dword ptr [ebx+4],0
    127.                   ;popa
    128.                   inc dword ptr [COUNTER]
    129.                  
    130.         s_next:
    131.                lea ecx,iosb
    132.                xor eax,eax
    133.                invoke ZwQueryDirectoryFile,hFind,eax,eax,eax,ecx,esi,260,1,1,eax,eax
    134.             .endw
    135.         @@:
    136.            invoke GlobalFree,esi
    137.            invoke ZwClose,hFind
    138.         .endif
    139.        ret
    140. ZwSearch endp
    141.  
    142. StartSearch proc
    143.      local as:ANSI_STRING
    144.      local us:UNICODE_STRING
    145.      local oa:OBJECT_ATTRIBUTES
    146.  
    147.        invoke lstrlen,offset szLink
    148.        mov as._Length,ax
    149.        mov as.MaximumLength,ax
    150.        mov eax,offset szLink
    151.        mov as.Buffer,eax
    152.        invoke RtlAnsiStringToUnicodeString,addr us,addr as,1
    153.        invoke RtlInitUnicodeString,addr us,us.Buffer
    154.        
    155.        xor eax,eax
    156.        lea ecx,oa
    157.        mov dword ptr [ecx],000000018h
    158.        and dword ptr [ecx+000000004h],eax
    159.        mov dword ptr [ecx+00000000Ch],00000240h
    160.        and dword ptr [ecx+000000010h],eax
    161.        lea ebx,us
    162.        mov dword ptr [ecx+000000008h],ebx
    163.        and dword ptr [ecx+000000014h],eax
    164.        
    165.        movzx ecx,us._Length
    166.        invoke ZwSearch,addr oa,ecx
    167.        ret
    168. StartSearch endp
    169.  
    170. start:
    171.     call   StartSearch
    172.  
    173.     invoke ExitProcess,0
    174. end start
     
  10. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Так никто и не подскажет, где баг?