Перехватываю ZwSetInformationFile не выводит имя файла :(

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 11 ноя 2008.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день!
    Сразу вопрос - как получить полное имя файла?

    Перехватываю ZwSetInformationFile
    Обработчик просто выводит имя файла
    Код (Text):
    1. NewSetInformationFile  proc hfile:HANDLE,\
    2.             iosb:IO_STATUS_BLOCK,\
    3.             psi:FILE_NAME_INFORMATION,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6.     pushad
    7.     invoke  RtlUnicodeStringToAnsiString, addr dwFileName,addr psi.FileName,TRUE
    8.     invoke  DbgPrint, $CTA0("\nFileName: %s\n"),addr dwFileName.Buffer
    9.        
    10.     popad        
    11.     ret
    12. NewSetInformationFile     endp
    В справочнике:
    Код (Text):
    1. typedef struct _FILE_NAME_INFORMATION {
    2.   ULONG  FileNameLength;
    3.   WCHAR  FileName[1];
    4. } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
    5. Members
    6. FileNameLength
    7. Specifies the length, in bytes, of the file name string.
    8. FileName
    9. Specifies the first character of the file name string. This is followed in memory by the remainder of the string.
    то есть должно выводиться полное имя находящ. по адресу FileName

    но на выходе только это
    [​IMG]

    Итак как же получить полностью имя файла ?
    Исходник:
     
  2. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    NTSTATUS RtlUnicodeStringToAnsiString(
    PANSI_STRING DestinationString,
    PUNICODE_STRING SourceString,
    BOOLEAN AllocateDestinationString
    );

    второй параметр передаешь WCHAR FileName[1], юзай RtlInitUnicodeString а потом уже RtlUnicodeStringToAnsiString если нужно вообще..
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    blast
    так ? значит

    Код (Text):
    1. NewSetInformationFile  proc hfile:HANDLE,\
    2.             iosb:IO_STATUS_BLOCK,\
    3.             psi:FILE_NAME_INFORMATION,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6.  
    7. local as:ANSI_STRING
    8. local us:UNICODE_STRING
    9.  
    10.     pushad
    11.  
    12.  
    13.     invoke  RtlInitUnicodeString, addr us, addr psi.FileName
    14.     invoke  RtlUnicodeStringToAnsiString, addr as, addr us, TRUE
    15.     invoke  DbgPrint, $CTA0("\nFileName: %s\n"),addr as.Buffer
    16.        
    17.     popad        
    18.     ret
    19. NewSetInformationFile     endp
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _sheva740
    1) в ZwSetInformationFile в качестве второго и третьего параметров передаются указатели;
    2) в третьем параметре не обязательно указатель на FILE_NAME_INFORMATION;
    3) если вызов RtlUnicodeStringToAnsiString, addr as, addr us, TRUE завершился успешно, то необходимо вызвать invoke RtlFreeAnsiString, addr as;
    4) чтобы увидеть вменяемые результаты необходимо обеспечить вызов оригинальной ZwSetInformationFile.
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    q_q
    спасибо

    вот поправил, правильно ?
    Код (Text):
    1. NewSetInformationFile  proc hfile:HANDLE,\
    2.             iosb:IO_STATUS_BLOCK,\
    3.             psi:FILE_NAME_INFORMATION,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6. local as:ANSI_STRING
    7. local us:UNICODE_STRING
    8.  
    9.     pushad
    10.     invoke  RtlInitUnicodeString, addr us, addr psi.FileName
    11.     ;invoke RtlInitUnicodeString, addr us,psi.FileName
    12.     invoke  RtlUnicodeStringToAnsiString, addr as, addr us, TRUE
    13.     .if eax == STATUS_SUCCESS
    14.         invoke  DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer
    15.         invoke  RtlFreeAnsiString, addr as
    16.     .endif
    17.     popad
    18.    
    19.     push    FileInformationClass
    20.     push    FileInformationLength
    21.     lea eax,psi
    22.     push    eax
    23.     lea eax,iosb
    24.     push    eax
    25.     push    hfile  
    26.     call    dwOldSetInformationFile
    27.    
    28.     ret
    29. NewSetInformationFile     endp
     
  6. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    _sheva740
    Не првильно.
    > Фильтруй инфокласс.
    > Устанавливай SEH/VEH, строки могут быть не валидными.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _sheva740
    правильно?
    1) не учел;
    2) не учел;
    3) учел
    4) т.к. п.1 не учел, то вызов оригинальной ZwSetInformationFile неверный.

    CrystalIC
    > Фильтруй инфокласс
    Ты про FileNameInformation(9)? Разве он часто ходит?
    Afaik надо смотреть в сторону ZwQueryInformationFile/ObReferenceObjectByHandle etc., только очень аккуратно.
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    q_q
    Вот смотрю я на код в 5-м посте и никак не найду где определяетсо что инфокласс именно FileNameInformation...
    Не вижу..
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    CrystalIC
    спасибо
    вот поправил

    Код (Text):
    1. NewSetInformationFile  proc hfile:HANDLE,\
    2.             iosb:IO_STATUS_BLOCK,\
    3.             psi:FILE_NAME_INFORMATION,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6. local as:ANSI_STRING
    7. local us:UNICODE_STRING
    8. ;========================================SEH
    9.     assume fs:nothing
    10.     push offset ExceptionHandler
    11.     push fs:[0]
    12.     mov fs:[0], esp
    13.     assume fs:error
    14.  
    15.     mov seh.SafeEip, offset SafePlace1
    16.     mov seh.PrevEbp, ebp
    17.     mov seh.PrevEsp, esp
    18. ;========================================SEH
    19.  
    20.     pushad
    21.     ;invoke RtlInitUnicodeString, addr us, addr psi.FileName
    22.     invoke  RtlInitUnicodeString, addr us,psi.FileName
    23.     invoke  RtlUnicodeStringToAnsiString, addr as, addr us, TRUE
    24.     .if eax == STATUS_SUCCESS
    25.         invoke  DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer
    26.         invoke  RtlFreeAnsiString, addr as
    27.     .endif
    28.     popad
    29.  
    30. ;========================================SEH
    31. SafePlace1:
    32.     ; Remove seh-frame  
    33.     assume fs:nothing
    34.     pop fs:[0]
    35.     add esp, sizeof DWORD
    36.     assume fs:error
    37.  
    38.  
    39.     assume fs:nothing
    40.     push offset ExceptionHandler
    41.     push fs:[0]
    42.     mov fs:[0], esp
    43.     assume fs:error
    44. ;========================================SEH   
    45.     push    FileInformationClass
    46.     push    FileInformationLength
    47.     lea eax,psi
    48.     push    eax
    49.     lea eax,iosb
    50.     push    eax
    51.     push    hfile  
    52.     call    dwOldSetInformationFile
    53.    
    54.     ret
    55. NewSetInformationFile     endp
    Но пока не пашет, может я как то не так вызываю оригинальную ZwSetInformationFile?


    >Фильтруй инфокласс.
    покажите, пожалуйста, кусочек кода.
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    CrystalIC
    Я не о коде от ТС'а, ну поставит он .if FileInformationClass = 9, а потом придет на форум, "опять не работает".
    Я о том, как часто по сравнению с другими инфоклассами в ZwSetInformationFile приходит девятый?
     
  11. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    q_q
    Он не приходит никогда, данный инфокласс используетсо в NtQueryInformationFile, в NtSetInformationFile он не может применятсо.
    Может автор имел ввиду FileRenameInformation ?
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    CrystalIC
    > Может автор имел ввиду ...
    Я гадать не буду.

    _sheva740
    > вот поправил
    Ничего ты не поправил.

    > покажите, пожалуйста, кусочек кода.
    Каркас
    Код (Text):
    1. NewSetInformationFile  proc hfile:HANDLE,\
    2.             iosb : ptr IO_STATUS_BLOCK,\
    3.             psi : LPVOID,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6.  
    7.     .if     FileInformationClass == тут_номер_требуемого_инфокласса
    8.     .endif
    9.  
    10.     push    FileInformationClass
    11.     push    FileInformationLength
    12.     push    psi
    13.     push    iosb
    14.     push    hfile  
    15.     call    dwOldSetInformationFile
    16.    
    17.     ret
    18. NewSetInformationFile     endp
     
  13. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    q_q
    Кривой каркас у тебя. Должно быть так:
    Код (Text):
    1. ENTER_SEH macro ExceptionHandler
    2. Local Delta1, Delta2
    3.     assume fs:nothing
    4.     push ebp
    5.     Call Delta1
    6. Delta1:
    7.     add dword ptr [esp],(ExceptionExit_ - Delta1)
    8.     Call Delta2
    9. Delta2:
    10.     add dword ptr [esp],(ExceptionHandler - Delta2)
    11.     push dword ptr fs:[TEB.Tib.ExceptionList]
    12.     mov dword ptr fs:[TEB.Tib.ExceptionList],esp
    13. endm
    14.  
    15. LEAVE_SEH macro Frame
    16.     clc
    17. ExceptionExit_:
    18.     pop dword ptr fs:[TEB.Tib.ExceptionList]
    19.     lea esp,[esp + 4*3 + Frame]
    20. endm
    21.  
    22. ExceptionHandler proc C
    23.     mov esp,dword ptr [esp + 8] ;(esp) -> ExceptionList
    24.     mov eax,STATUS_UNSUCCESSFUL
    25.     mov ebp,dword ptr [esp + 4*3]
    26.     stc
    27.     jmp dword ptr [esp + 4*2]
    28. ExceptionHandler endp
    29.  
    30. ZwSetInformationFileHandler proc FileHandle:HANDLE, IoStatusBlock:PIO_STATUS_BLOCK, FileInformation:PVOID, FileInformationLength:ULONG, FileInformationClass:ULONG
    31.     cmp FileInformationClass,FileRenameInformation
    32.     jne call_
    33.     ENTER_SEH ExceptionHandler
    34.     [...]
    35.     LEAVE_SEH NULL
    36.     jc call_
    37.     [...]
    38. call_:
    39.     leave
    40.     call delta_
    41. delta_:
    42.     pop eax
    43.     jmp dword ptr [eax + (offset OriginalHandler - offset delta_)]
    44. ZwSetInformationFileHandler endp
    45.  
    46. OriginalHandler PVOID ?
    Это если юзермод, также лучше заменить оригинальный хэндлер на вызов сервиса через 2e шлюз, но это в том случае если нет цепочки перехватчиков. В случае кернелмода сех аналогично, только имена структур другие(KPCR.NtTib.ExceptionList), смещение ноль также.
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    CrystalIC
    > Должно быть так ... лучше заменить оригинальный хэндлер на вызов сервиса через 2e шлюз ...
    Ты в архиве код видел?

    > Кривой каркас у тебя.
    "Смешно. Пойду учиться." (С) Four-F
     
  15. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Нет.
    Удачи, вам есчо многому учитсо нужно.
     
  16. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    q_q
    CrystalIC

    >1) не учел;
    >2) не учел;
    >3) учел
    >4) т.к. п.1 не учел, то вызов оригинальной ZwSetInformationFile неверный.


    вот вроде как 4) - теперь работает, то есть вызов оригинальной ZwSetInformationFile происходит.
    Но я ооочень прошу ... просвети дурака, сам запомню детям передам .... как выполнить 1) и 2) ??? плиз.

    Код (Text):
    1. NewSetInformationFile  proc     hfile:HANDLE,\
    2.             iosb:IO_STATUS_BLOCK,\
    3.             psi:FILE_NAME_INFORMATION,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6. local as:ANSI_STRING
    7. local us:UNICODE_STRING
    8.  
    9.     push    FileNameInformation
    10.     push    sizeof psi
    11.     lea eax,psi
    12.     push    eax
    13.     lea eax,iosb
    14.     push    eax
    15.     push    hfile  
    16.     call    dwOldSetInformationFile
    17.  
    18. ;========================================SEH
    19. ;seh up ...
    20.  
    21.     pushad
    22.     invoke  RtlInitUnicodeString, addr us, addr psi.FileName
    23.     invoke  RtlUnicodeStringToAnsiString, addr as, addr us, TRUE
    24.     .if eax == STATUS_SUCCESS
    25.         invoke  DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer
    26.         invoke  RtlFreeAnsiString, addr as
    27.     .endif
    28.     popad
    29.  
    30. ;========================================SEH
    31. ;seh down ...
    32.  
    33.     ret
    34. NewSetInformationFile     endp
     
  17. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Он сказал, что это значит - хз, спроси у него.
    Не известно какой инфокласс ты используешь, а от него зависит передаваемая в буфере инфа.
     
  18. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    вот такой вариант работает (в смысле не вываливается в BSOD) но имена файлов показывает пока криво.
    При попытке переименовать файл отображает что-то типа имени файла.
    [​IMG]


    Код (Text):
    1. NewSetInformationFile  proc     hfile:HANDLE,\
    2.             iosb : ptr IO_STATUS_BLOCK,\
    3.             psi : DWORD,\
    4.             FileInformationLength,\
    5.             FileInformationClass
    6. local as:ANSI_STRING
    7. local us:UNICODE_STRING
    8.  
    9.     push    FileInformationClass
    10.     push    sizeof psi
    11.     push    psi
    12.     push    iosb
    13.     push    hfile  
    14.     call    dwOldSetInformationFile
    15. ;========================================SEH
    16. ;seh up ...
    17.  
    18.     pushad
    19.     .if FileInformationClass == FileRenameInformation
    20.         assume esi: PTR FILE_NAME_INFORMATION
    21.         lea eax,[esi].FileName
    22.         invoke  RtlInitUnicodeString, addr us, eax
    23.         invoke  RtlUnicodeStringToAnsiString, addr as, addr us, TRUE
    24.         .if eax == STATUS_SUCCESS
    25.             invoke  DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer
    26.             invoke  RtlFreeAnsiString, addr as
    27.         .endif
    28.     .endif
    29.         assume esi:nothing
    30.     popad
    31. ;========================================SEH
    32. ;seh down ...
    33.  
    34.     ret
    35. NewSetInformationFile     endp
    Значит в зависимости от типа файловой операции в параметре FileInformationClass та или иная
    константа.
    Вот только где бы почитать про эти FileInformationClass - что каждый из них значит и как заполняет FILE_NAME_INFORMATION ?
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _sheva740
    Код (Text):
    1. ...
    2. ;;  push    sizeof psi      ;; что это за самодеятельность?
    3.     push    FileInformationLength   ;; ++
    4. ...
    5.  
    6. ;;  assume  esi: PTR FILE_NAME_INFORMATION
    7. ;;  lea eax,[esi].FileName
    8. ;; не знаю, заполнил ли ты ESI, я воспользуюсь ECX
    9. ;; + обрати внимание на имя
    10.     mov ecx,psi             ;; ++
    11.     assume  ecx: ptr FILE_LINK_INFORMATION  ;; ++
    12.     lea ecx,[ecx].FileName      ;; ++
    13.     invoke  RtlInitUnicodeString, addr us, ecx
    14. ...
     
  20. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    q_q
    спасибо!
    получилось, переименовываю 1.txt в 2.txt
    [​IMG]
    УРА!!!!