Здравствуйте! Вообщем такая проблема: из юзермода вызываю NtDeleteFile предварительно указав имя файла в структуре OBJECT_ATTRIBUTES. Функция не работает. Я так понимаю это происходит потому, что у меня не достаточно привилегий? Тогда такой вопрос не все функции ntdll могут вызываться из юзермода?
конечно не все! вот для примера идем в мсдн http://msdn.microsoft.com/en-us/library/ff566435(v=vs.85).aspx и видем IRQL - PASSIVE_LEVEL это и есть привилегии
h0t IRQL никакого отношения к привилегиям не имеет. В юзермоде всегда PASSIVE_LEVEL. pashe4ka13 Все сервисы можно вызывать из юзермода. В ntdll нет ядерной части. Статус смотрите возвращаемый.
pashe4ka13 0xC000000D - это STATUS_INVALID_PARAMETER, судя по всему что-то с параметрами перемудрил Код выкладывай
Код (Text): format PE GUI 4.0 entry start include 'F:\fasm\INCLUDE\win32ax.inc' include 'F:\FASM\INCLUDE\MACRO\STRUCT.INC' section '.data' data readable writable struct UNICODE_STRING Len dw ? MaximumLength dw ? Buffer dw '\','\','?','?','\','\','F',':','\','\','d','e','l','.','t','x','t' ends struct OBJECT_ATTRIBUTES length dd sizeof.OBJECT_ATTRIBUTES rootdirectory dd 0 object UNICODE_STRING<> ; UNICODE_STRING attributes dd 0 descriptor dd 0 service dd 0 ends obtt OBJECT_ATTRIBUTES section 'CODE' code readable executable proc start mov [obtt.object.Len], 34 mov [obtt.object.MaximumLength], 34 invoke NtDeleteFile,obtt invoke ExitProcess,0 endp section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ ntdll,'ntdll.dll' include 'F:\fasm\INCLUDE\api\kernel32.inc' import ntdll,\ NtDeleteFile,'NtDeleteFile'
Хз, не силен в асме, может глупость скажу, но NtDeleteFile требует указателя на структуру OBJECT_ATTRIBUTES поэтому наверное так Код (Text): invoke NtDeleteFile,[obtt] ?
rmka Да писал я и du, просто я код этот наверное миллион раз переписал и даже db писал с дополнением нуликов до слова. steelfactor Нет, у меня именно указатель и передается.
Еще вы зачем-то по два слеша пишите, это вам не си. Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32ax.inc' section '.data' data readable writable strng du '\??\K:\del.txt' len = $-strng align 16 struct UNICODE_STRING Len dw len MaximumLength dw len Buffer dd strng ends us UNICODE_STRING struct OBJECT_ATTRIBUTES length dd sizeof.OBJECT_ATTRIBUTES rootdirectory dd 0 object dd us attributes dd 0 descriptor dd 0 service dd 0 ends obtt OBJECT_ATTRIBUTES section 'CODE' code readable executable start: invoke NtDeleteFile,obtt invoke ExitProcess,0 section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ ntdll,'ntdll.dll' include '%fasminc%\api\kernel32.inc' import ntdll,\ NtDeleteFile,'NtDeleteFile'
Код (Text): typedef struct _OBJECT_ATTRIBUTES { ULONG Length; HANDLE RootDirectory; PUNICODE_STRING ObjectName; ULONG Attributes; PVOID SecurityDescriptor; PVOID SecurityQualityOfService; } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; В структуре хранится не строка UNICODE_STRING, как у вас, а указатель на строку PUNICODE_STRING (уже ответили)
Спасибо вам ребята огромное! Вы мне очень помогли, но у меня еще вопрос, как такое возможно, что данную функцию можно вызывать как с нулевого так и с третьего кольца? Я думал, что такое в принципе невозможно! И еще всю эту тему я затеял прочитав вопрос тут на форуме в ветке вирусология об удалении самого себя. Я подумал, что если DeleteFile заменить NtDeleteFile. Вообщем идея у меня такая выполнить размаплевание самого себя на стеке, а затем вызывать данную функцию, может быть так получится удалить?
steelfactor Дело в том, что я вообще ни чего не слышал. Я живу в такой дыре, что мне некому рассказать об этом и до всего я дознаюсь сам, а так же благодаря этому форуму и тем замечательным людям, что тут обитают. Под отладчиком сильно не рассматривал, и сейчас нет такой возможности, но как мне кажется, что сами функции эти находятся в ядре, а в ntdll лишь их обертки которые и выполняют все проверки, в частности с какого кольца был вызван код. Я ошибаюсь?
Нет, ты все верно понимаешь, это называется форвардингом. Т.е. функция kernel32!DeleteFile просто вызывает функцию ntdll!NtDeleteFile, которой передает необходимые параметры, а последняя в свою очередь дергает SYSENTER/INT 2E (т.е. своеобразный "переходник" в нулевое кольцо), которым просто передаются номер функции и параметры. Далее, уже в r0 происходит вызов ntos!ZwDeleteFile, которая если не ошибаюсь вызовет IoSetInformation с параметром FileDispositionInformation.DeleteFile = TRUE. Это так, очень приблизительная схема. Т.е. все Nt*-функции являются простыми обертками для вызова системных функций ядра ОС, они просто вызывают SYSENTER/INT 2E, которым передаются номер функции и параметры. Номера функции меняются от билда к билду, но основная схема для различных версий ОС остается прежней UPD: Для более адекватного понимания темы почитай про KiFastSystemCall
не пудрим моск - форвардинг это совсем иное.. некоторые с проверкаме, некторые без..а некоторые экспортируемые ntdll функи не просто дёргают один сервис, а делают еще кучу всего, например Ldr* часть..
steelfactor NtDeleteFile, разница значительна(в случае Zw* должен быть рекурсивный вызов менеджера сисколов).
Вообщем запихал я структуру OBJECT_ATTRIBUTES в стек, размапил фаил, вызвал NtDeleteFile и получаю ошибку С0000121 не могу удалить фаил. Если удаляю другой фаил, то все проходит замечательно, если сам себя, то вот такая ошибка( Что еще нужно не пойму?
pashe4ka13 вы не сможете удалить сам себя, т.к. фаел обжект есть референсы.. = когда файл открыт кем либо удалить его не получится.