Я передаю в ZwCreateFile имя файла, скажем "\\?\C:\A.dat" но он возвращает STATUS_OBJECT_NAME_INVALID. Так как надо правильно ее называть?
Хм. Нет. Давайте я приведу полный код, может тут гдето ошибка? Код (Text): UNICODE_STRING pSTR; OBJECT_ATTRIBUTES pAttr; HANDLE hFile; IO_STATUS_BLOCK pStat; RtlInitUnicodeString(&pSTR,L"\\\\??\\C:\\The.dat"); InitializeObjectAttributes(&pAttr,&pSTR,OBJ_KERNEL_HANDLE,0,0); DbgPrint("%S",pSTR.Buffer); DbgPrint("-bbu- ZwCreateFile: %X", (int)ZwCreateFile(&hFile,GENERIC_ALL,&pAttr,&pStat,0,0,0,FILE_CREATE,0,0,0) ); DbgPrint("-bbu- pStat: %i", (int)pStat.Information); ZwClose(hFile);
хм.. что-то я не помню, чтоб в этой функции надо передавать имя файла. В прототипе такого параметра нет. (А вот второй пост все обьясняет). Попробуй так (если строка проинициализированна верно): InitializeObjectAttributes(&pAttr,&pSTR,OBJ_CASE_INSENSITIVE,0,0);
Еще вопрос. Можно как то с его помощью обойти ошибку STATUS_SHARING_VIOLATION, т.е. открыть файл даже тогда, когда он уже открыт userмодным процессом?
1) http://www.wasm.ru/article.php?article=lockfileswork 2) Выяснив, какой процес держит файл и переключившись в контекст жертвы воспользоваться её хенделом.
ANDLL Только возьми во внимание, что второй вариант, с аттачем к жертве, довольно наряжный. Ведь при чтении с файла указатель позиции будет изменяться. В многопоточных приложнеиях это чревато гемороем.
Кстати, ведь можно приаттачась к примеру просто поменять у всех хэндлов атрибуты шаринга на SHARE_READWRITE? И потом заново открыть файл?
а если получать хэндл из fileobject'a, который в свою очередь будет браться из стека перехваченного ирп-пакета драйвером фильтром, то это будет работать или нет?
Так в чем проблема просто скопировать себе хендл, даже не аттачась к чужому процессу? 1. ZwQuerySystemInformation (SystemHandleInformation) - перечисляем хендлы 2. ZwQueryObject (ObjectNameInformation) - сравниванием имена объектов 3. ZwDuplicateObject - копируем себе хендл, не забывая его потом закрыть после использования.