Не могу заюзать NtDeleteFile

Тема в разделе "WASM.BEGINNERS", создана пользователем pashe4ka13, 17 июн 2011.

  1. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Здравствуйте! Вообщем такая проблема: из юзермода вызываю NtDeleteFile предварительно указав имя файла в структуре OBJECT_ATTRIBUTES. Функция не работает. Я так понимаю это происходит потому, что у меня не достаточно привилегий? Тогда такой вопрос не все функции ntdll могут вызываться из юзермода?
     
  2. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    конечно не все! вот для примера идем в мсдн http://msdn.microsoft.com/en-us/library/ff566435(v=vs.85).aspx и видем IRQL - PASSIVE_LEVEL это и есть привилегии
     
  3. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    h0t
    IRQL никакого отношения к привилегиям не имеет. В юзермоде всегда PASSIVE_LEVEL.

    pashe4ka13
    Все сервисы можно вызывать из юзермода. В ntdll нет ядерной части.

    Статус смотрите возвращаемый.
     
  4. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    К сожалению сейчас нет компа под рукой, но если мне не изменяет память, то в ЕАХ на выходе C000000D
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    pashe4ka13
    0xC000000D - это STATUS_INVALID_PARAMETER, судя по всему что-то с параметрами перемудрил
    Код выкладывай
     
  6. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include 'F:\fasm\INCLUDE\win32ax.inc'
    4. include 'F:\FASM\INCLUDE\MACRO\STRUCT.INC'
    5. section '.data' data readable writable
    6. struct UNICODE_STRING
    7.     Len dw ?
    8.     MaximumLength dw ?
    9.     Buffer  dw   '\','\','?','?','\','\','F',':','\','\','d','e','l','.','t','x','t'
    10. ends
    11. struct   OBJECT_ATTRIBUTES
    12.       length       dd sizeof.OBJECT_ATTRIBUTES
    13.       rootdirectory    dd 0
    14.       object           UNICODE_STRING<>  ; UNICODE_STRING
    15.       attributes   dd 0
    16.       descriptor   dd 0
    17.       service      dd 0
    18. ends
    19. obtt OBJECT_ATTRIBUTES
    20. section 'CODE' code readable executable
    21. proc start
    22.             mov [obtt.object.Len], 34
    23.             mov [obtt.object.MaximumLength], 34
    24.    invoke   NtDeleteFile,obtt
    25.    invoke ExitProcess,0
    26. endp
    27. section '.idata' import data readable writeable
    28.   library  kernel32,'KERNEL32.DLL',\
    29.           ntdll,'ntdll.dll'
    30. include 'F:\fasm\INCLUDE\api\kernel32.inc'
    31. import ntdll,\
    32.        NtDeleteFile,'NtDeleteFile'
     
  7. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    pashe4ka13
    В фасме для таких вещей есть директива "du"
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Хз, не силен в асме, может глупость скажу, но NtDeleteFile требует указателя на структуру OBJECT_ATTRIBUTES
    поэтому наверное так
    Код (Text):
    1. invoke   NtDeleteFile,[obtt]
    ?
     
  9. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    rmka
    Да писал я и du, просто я код этот наверное миллион раз переписал и даже db писал с дополнением нуликов до слова.

    steelfactor
    Нет, у меня именно указатель и передается.
     
  10. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    Еще вы зачем-то по два слеша пишите, это вам не си.
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include '%fasminc%\win32ax.inc'
    4. section '.data' data readable writable
    5. strng du '\??\K:\del.txt'
    6. len = $-strng
    7. align 16
    8. struct UNICODE_STRING
    9.     Len dw len
    10.     MaximumLength dw len
    11.     Buffer  dd  strng
    12. ends
    13.  
    14. us UNICODE_STRING
    15.  
    16. struct   OBJECT_ATTRIBUTES
    17.       length       dd  sizeof.OBJECT_ATTRIBUTES
    18.       rootdirectory    dd 0
    19.       object          dd us
    20.       attributes   dd 0
    21.       descriptor   dd 0
    22.       service      dd 0
    23. ends
    24. obtt OBJECT_ATTRIBUTES
    25. section 'CODE' code readable executable
    26. start:
    27.  
    28.    invoke   NtDeleteFile,obtt
    29.    invoke ExitProcess,0
    30.  
    31. section '.idata' import data readable writeable
    32.   library  kernel32,'KERNEL32.DLL',\
    33.           ntdll,'ntdll.dll'
    34. include '%fasminc%\api\kernel32.inc'
    35. import ntdll,\
    36.        NtDeleteFile,'NtDeleteFile'
     
  11. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Код (Text):
    1. typedef struct _OBJECT_ATTRIBUTES {
    2.   ULONG           Length;
    3.   HANDLE          RootDirectory;
    4.   PUNICODE_STRING ObjectName;
    5.   ULONG           Attributes;
    6.   PVOID           SecurityDescriptor;
    7.   PVOID           SecurityQualityOfService;
    8. }  OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
    В структуре хранится не строка UNICODE_STRING, как у вас, а указатель на строку PUNICODE_STRING

    (уже ответили)
     
  12. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Спасибо вам ребята огромное! Вы мне очень помогли, но у меня еще вопрос, как такое возможно, что данную функцию можно вызывать как с нулевого так и с третьего кольца? Я думал, что такое в принципе невозможно! И еще всю эту тему я затеял прочитав вопрос тут на форуме в ветке вирусология об удалении самого себя. Я подумал, что если DeleteFile заменить NtDeleteFile. Вообщем идея у меня такая выполнить размаплевание самого себя на стеке, а затем вызывать данную функцию, может быть так получится удалить?
     
  13. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    :))) Про системные сервисы давно слышал? Погляди любую Nt* функцию под отладчиком
     
  14. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    steelfactor
    Дело в том, что я вообще ни чего не слышал. Я живу в такой дыре, что мне некому рассказать об этом и до всего я дознаюсь сам, а так же благодаря этому форуму и тем замечательным людям, что тут обитают. Под отладчиком сильно не рассматривал, и сейчас нет такой возможности, но как мне кажется, что сами функции эти находятся в ядре, а в ntdll лишь их обертки которые и выполняют все проверки, в частности с какого кольца был вызван код. Я ошибаюсь?
     
  15. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Нет, ты все верно понимаешь, это называется форвардингом. Т.е. функция kernel32!DeleteFile просто вызывает функцию ntdll!NtDeleteFile, которой передает необходимые параметры, а последняя в свою очередь дергает SYSENTER/INT 2E (т.е. своеобразный "переходник" в нулевое кольцо), которым просто передаются номер функции и параметры. Далее, уже в r0 происходит вызов ntos!ZwDeleteFile, которая если не ошибаюсь вызовет IoSetInformation с параметром FileDispositionInformation.DeleteFile = TRUE.
    Это так, очень приблизительная схема.
    Т.е. все Nt*-функции являются простыми обертками для вызова системных функций ядра ОС, они просто вызывают SYSENTER/INT 2E, которым передаются номер функции и параметры. Номера функции меняются от билда к билду, но основная схема для различных версий ОС остается прежней

    UPD:
    Для более адекватного понимания темы почитай про KiFastSystemCall
     
  16. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    не пудрим моск - форвардинг это совсем иное..

    некоторые с проверкаме, некторые без..а некоторые экспортируемые ntdll функи не просто дёргают один сервис, а делают еще кучу всего, например Ldr* часть..
     
  17. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    steelfactor
    NtDeleteFile, разница значительна(в случае Zw* должен быть рекурсивный вызов менеджера сисколов).
     
  18. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    klzlk
    Да, согласен, ступил
     
  19. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Вообщем запихал я структуру OBJECT_ATTRIBUTES в стек, размапил фаил, вызвал NtDeleteFile и получаю ошибку С0000121 не могу удалить фаил. Если удаляю другой фаил, то все проходит замечательно, если сам себя, то вот такая ошибка( Что еще нужно не пойму?
     
  20. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    pashe4ka13
    вы не сможете удалить сам себя, т.к. фаел обжект есть референсы.. = когда файл открыт кем либо удалить его не получится.