Проблема с затиранием файла

Тема в разделе "WASM.NT.KERNEL", создана пользователем Neorov, 25 июн 2008.

  1. Neorov

    Neorov New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2008
    Сообщения:
    3
    Всех приветствую! Прошу помочь разобраться в одном вопросе, который я долгое время не могу решить.
    Мне нужно сделать затирание файла нулями перед удалением. Для этого я перехватываю NtSetInformationFile.

    Вот тут самое интересное. Сначала попробовал открыть заново файл через NtCreateFile. Не получилось (STATUS_ACCESS_DENIED), доступа нету, т.к. файл уже открыт.

    Нашёл статью Ms-Rem про изменение прав хендла. Попробовал перевести её с "C" на ассемблер, я не уверен, что правильно, вот что получилось у меня

    Код (Text):
    1. XpLookupHandleTableEntry proc HandleTable: PXP_HANDLE_TABLE, Handle:EXHANDLE
    2.     LOCAL i,j,k:ULONG
    3.     LOCAL Entry:PHANDLE_TABLE_ENTRY
    4.     LOCAL TableCode:ULONG
    5.     LOCAL sw: ULONG
    6.    
    7.     assume ecx:PXP_HANDLE_TABLE
    8.     mov ecx, HandleTable
    9.     mov eax, [ecx].TableCode
    10.     xor eax, TABLE_LEVEL_MASK
    11.     mov TableCode, eax
    12.     xor eax,eax
    13.     assume ecx:NOTHING
    14.    
    15.     assume ecx:PEXHANDLE
    16.     lea ecx, Handle
    17.     push [ecx].Index
    18.     push [ecx].Index
    19.     push [ecx].Index
    20.     assume ecx:NOTHING
    21.    
    22.     pop eax
    23.     shl eax, 17d
    24.     and eax, 1FFh
    25.     mov i, eax
    26.    
    27.     pop eax
    28.     shl eax, 9d
    29.     and eax, 1FFh
    30.     mov j, eax
    31.    
    32.     pop eax
    33.     and eax, 1FFh
    34.     mov k, eax
    35.    
    36.     xor eax, eax
    37.    
    38.     mov eax, TableCode
    39.     add eax, TABLE_LEVEL_MASK
    40.     mov sw, eax
    41.    
    42.     mov Entry, 0
    43.    
    44.     .IF sw == 0
    45.         ;int 3
    46.         mov eax, k
    47.         imul eax, 4
    48.         add eax, TableCode
    49.         mov Entry, eax
    50.     .ELSEIF sw == 1
    51.         ;int 3
    52.         ;int 3
    53.         mov eax, k
    54.         imul eax, 4
    55.         add eax, TableCode
    56.         .if eax != 0
    57.             xor eax, eax
    58.             mov eax, j
    59.             imul eax, 4
    60.            
    61.             mov ecx, k
    62.             imul ecx, 4
    63.            
    64.             mov eax, [eax]
    65.             add eax, ecx
    66.            
    67.             mov Entry, eax
    68.         .endif
    69.     .ELSEIF sw == 2
    70.         ;int 3
    71.         ;int 3
    72.         ;int 3
    73.         mov eax, i
    74.         imul eax, 4
    75.         add eax, TableCode
    76.         .if eax != 0
    77.             mov eax, [eax]
    78.             mov ecx, j
    79.             imul ecx, 4
    80.             add eax, ecx
    81.             .if eax != 0
    82.                 mov eax, [eax]
    83.                 mov ecx, k
    84.                 imul ecx, 4
    85.                 add eax, ecx
    86.                 mov Entry, eax
    87.             .endif
    88.         .endif
    89.     .ENDIF
    90.    
    91.    
    92.     mov eax, Entry
    93.     ret
    94. XpLookupHandleTableEntry endp
    95.  
    96. SetHandleAccess proc Handle:HANDLE, GrantedAccess:ACCESS_MASK
    97.     LOCAL currProc:PEPROCESS
    98.     LOCAL Entry:PHANDLE_TABLE_ENTRY
    99.     LOCAL ExHandle:EXHANDLE
    100.     LOCAL ObjectTable:PHANDLE_TABLE
    101.    
    102.     invoke PsGetCurrentProcess
    103.     mov currProc, eax
    104.     ;mov eax, RVATOVA(currProc, ObjectTableOffset)
    105.     mov eax, currProc
    106.     add eax, ObjectTableOffset
    107.     mov eax, [eax]
    108.     mov ObjectTable, eax
    109.    
    110.     assume ecx:PEXHANDLE
    111.     lea ecx, ExHandle
    112.     mov edx, Handle
    113.     mov [ecx].GenericHandleOverlay, edx
    114.     assume ecx:NOTHING
    115.    
    116.     ;int 3
    117.     invoke XpLookupHandleTableEntry, ObjectTable, ExHandle
    118.     mov Entry, eax
    119.    
    120.    
    121.     .if Entry != 0
    122.         assume ecx:PHANDLE_TABLE_ENTRY
    123.         mov ecx, Entry
    124.         mov edx, GrantedAccess
    125.         mov [ecx].GrantedAccess, edx
    126.         assume ecx:NOTHING
    127.     .endif
    128.    
    129.     mov eax, 0
    130.     .if Entry != 0
    131.         mov eax, 1
    132.     .endif
    133.    
    134.     ret
    135. SetHandleAccess endp
    Функция XpLookupHandleTableEntry всегда возвращает ноль. "SW" при этом принимает какое-то левое значение, и оно не равно 0,1 или 2. Есть предположения, что что-то неправильно перевёл на АСМ.

    Пробовал также в перехваченной NtSetInformationFile закрыть хендл через NtClose перед открытием файла. Однако это ничем хорошим не заканчивается, BSOD не заставляет себя долго ждать (после ret идет несколько инструкций в ядре, потом падает при обращении к закрытому хендлу).

    Также была мысль перехвата NtCreateFile. Но там нужно как-то отличать файловую систему от девайсов, портов различных. Поиск по форуму не привёл к нужному результату.

    Пока-что я в тупике. Что посоветуете в данном случае?
     
  2. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Ты пробовал ObReferenceObjectByHandle с AccessMode = KernelMode ?
     
  3. Neorov

    Neorov New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2008
    Сообщения:
    3
    А что это нам даст?
     
  4. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Ну, ты получишь FILE_OBJECT, а потом уже можно с ним работать, в том числе сделать ObOpenObjectByPointer и открыть хэндл. Или ты так и делал и он вернул STATUS_ACCESS_DENIED ?
     
  5. Neorov

    Neorov New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2008
    Сообщения:
    3
    ObReferenceObjectByHandle с типом *IoFileObjectType выполняется нормально.
    Однако, ObOpenObjectByPointer мне говорит, что не совпадают типы (STATUS_OBJECT_TYPE_MISMATCH)

    Странно как-то. Может, не правильно вызываю функции?.



    Код (Text):
    1. HNtSetInformationFile proc uses esi edi FileHandle:dword,IoStatusBlock:dword,FileInformation:dword,llength:dword, FileInformationClass:dword
    2.     LOCAL Result:dword
    3.     LOCAL buf[1024]:BYTE
    4.    
    5.     LOCAL ani:ANSI_STRING
    6.     LOCAL uni:UNICODE_STRING
    7.     LOCAL pobj:dword
    8.     LOCAL retlen:dword
    9.     LOCAL hFile:HANDLE
    10.    
    11.     LOCAL fileobj:PFILE_OBJECT
    12.     LOCAL refHandle:HANDLE
    13.    
    14.     ;jmp next
    15.     cmp         FileInformationClass,FileDispositionInformation
    16.     jne         next
    17.    
    18.     int 3
    19.     mov edx, IoFileObjectType
    20.     mov edx, [edx]
    21.     mov edx, [edx]
    22.     invoke ObReferenceObjectByHandle, FileHandle, GENERIC_ALL, edx, \
    23.         KernelMode, addr fileobj, NULL
    24.     .if eax == STATUS_SUCCESS
    25.         invoke ObOpenObjectByPointer, fileobj, OBJ_KERNEL_HANDLE, NULL, \
    26.             FILE_READ_ACCESS or FILE_WRITE_ACCESS, edx, KernelMode, \
    27.             addr refHandle
    28.        
    29.         ;;;;;;;;;;;;;;;;;;;;;;;;;;
    30.         .if eax == STATUS_SUCCESS
    31.             invoke DbgPrint, $CTA0("ref STATUS_SUCCESS\n")
    32.         .endif
    33.        
    34.         .if eax == STATUS_ACCESS_DENIED
    35.             invoke DbgPrint, $CTA0("ref STATUS_ACCESS_DENIED\n")
    36.         .endif
    37.        
    38.         .if eax == STATUS_INSUFFICIENT_RESOURCES
    39.             invoke DbgPrint, $CTA0("ref STATUS_INSUFFICIENT_RESOURCES\n")
    40.         .endif
    41.        
    42.         .if eax == STATUS_INVALID_PARAMETER
    43.             invoke DbgPrint, $CTA0("ref STATUS_INVALID_PARAMETER\n")
    44.         .endif
    45.        
    46.         .if eax == STATUS_OBJECT_TYPE_MISMATCH
    47.             invoke DbgPrint, $CTA0("ref STATUS_OBJECT_TYPE_MISMATCH\n")
    48.         .endif
    49.        
    50.         .if eax == STATUS_PRIVILEGE_NOT_HELD
    51.             invoke DbgPrint, $CTA0("ref STATUS_PRIVILEGE_NOT_HELD\n")
    52.         .endif
    53.        
    54.         .if eax == STATUS_QUOTA_EXCEEDED
    55.             invoke DbgPrint, $CTA0("ref STATUS_QUOTA_EXCEEDED\n")
    56.         .endif
    57.        
    58.         .if eax == STATUS_UNSUCCESSFUL
    59.             invoke DbgPrint, $CTA0("ref STATUS_UNSUCCESSFUL\n")
    60.         .endif
    61.         ;;;;;;;;;;;;;;;;;;;;;;;;;;
    62.        
    63.         .if eax == STATUS_SUCCESS
    64.             invoke ZwClose, refHandle  
    65.         .endif
    66.        
    67.     .elseif eax == STATUS_OBJECT_TYPE_MISMATCH
    68.         invoke DbgPrint, $CTA0("getobj STATUS_OBJECT_TYPE_MISMATCH\n")
    69.     .elseif eax == STATUS_ACCESS_DENIED
    70.         invoke DbgPrint, $CTA0("getobj STATUS_ACCESS_DENIED\n")
    71.     .elseif eax == STATUS_INVALID_HANDLE
    72.         invoke DbgPrint, $CTA0("getobj STATUS_INVALID_HANDLE\n")
    73.     .endif
    74.    
    75.     ;invoke ObReferenceObjectByHandle,FileHandle,0,0,KernelMode,addr pobj,0
    76.     ;invoke ObQueryNameString,pobj,addr uni,255,addr retlen
    77.     ;invoke RtlUnicodeStringToAnsiString,addr ani,addr uni,TRUE
    78.     ;invoke DbgPrint, $CTA0("%s\n"), ani.Buffer
    79.    
    80.     ;invoke NtClose, FileHandle
    81.     ;invoke MyOpenFile, addr uni
    82.     ;.if eax != 0
    83.     ;   mov hFile, eax
    84.     ;   invoke DbgPrint, $CTA0("open file okey\n")
    85.     ;   invoke RewriteFileByHandle, hFile
    86.     ;   invoke ZwClose, hFile
    87.     ;.endif
    88.  
    89.    
    90.  
    91.     ;invoke SetHandleAccess, FileHandle, AC_GENERIC_READ or AC_GENERIC_WRITE
    92.     ;invoke DbgPrint, $CTA0("ret is:%x"), eax
    93.     ;invoke SetHandleAccess, FileHandle, AC_DELETE
    94.  
    95.     mov         eax,STATUS_ACCESS_DENIED
    96.     ret
    97. next:
    98.  
    99.     invoke SetHookFunk,addr NtSetInformationFile,addr HNtSetInformationFile,addr OldNtCf,0,1
    100.     invoke NtSetInformationFile,FileHandle,IoStatusBlock,FileInformation,llength, FileInformationClass
    101.     mov Result,eax
    102.     invoke SetHookFunk,addr NtSetInformationFile,addr HNtSetInformationFile,addr OldNtCf,1,0
    103. exit:
    104.     mov eax,Result
    105.     ret
    106. HNtSetInformationFile endp
     
  6. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    В MSDN в описании ObReferenceObjectByHandle сказано:

    DesiredAccess
    Specifies the requested types of access to the object. The interpretation of this field is dependent on the object type. Do not use any generic access rights.
    ObjectType

    а у тебя:

    GENERIC_ALL

    может в этом дело...
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    edx не сохраняется апи.