Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NtCreateFile-и комбинация флагов, Для файла открывающегося на запись 
V
    Опции темы
Coocky
Дата 23.7.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Привет!
Есть такая ситуация. Нужно отловить комбинацию флагов,когда файл открывается на запись.
Никак не получается.
Для функции 
Код

NtCreateFile( phFile, AccessMask,  pObjectAttributes,  pIoStatusBlock,  pliAllocationSize,  uFileAttributes,   uShareAccess,  uCreateDisposition,  uCreateOptions,  pEaBuffer,   uEaLength);

не работает,к примеру в Фаре по нажатию F4 такой код
Код

if(uCreateDisposition==FILE_OPEN&&(AccessMask&GENERIC_WRITE||AccessMask&GENERIC_ALL)/*&&uShareAccess==FILE_SHARE_WRITE*/)


Может кто подскажет правильные флаги,комбинацию которых надо проверить, что б узнать, что файл может открываться для записи
Спасибо


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
dumb
Дата 23.7.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(Coocky @  23.7.2007,  10:41 Найти цитируемый пост)
не работает,к примеру в Фаре по нажатию F4

файл открывается "на запись" при сохранении, а не при открытии.

GENERIC_WRITE и GENERIC_ALL - комбинации флагов, а тебе нужно ловить какой-нибудь FILE_WRITE_DATA.
PM MAIL   Вверх
Coocky
Дата 23.7.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Код

if(AccessMask&FILE_WRITE_DATA)
{
 
}

if(AccessMask&STANDARD_RIGHTS_WRITE)
{
 
}
if(AccessMask&FILE_WRITE_ATTRIBUTES)
{

}
if(AccessMask&FILE_WRITE_EA)
{

}
if(AccessMask&FILE_APPEND_DATA)
{
 
}

Не попадаю ни в один блок при отладке. То же самое, к примеру, и с блокнотом ,при сохранении.
uCreateDisposition приходит с флагом FILE_OPEN
Ну и что делать?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
dumb
Дата 23.7.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



ты б хоть привел значение AccessMask smile
PM MAIL   Вверх
W4FhLF
Дата 23.7.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Coocky, для начала покажи ты получаешь uCreateDisposition и AccessMask. 




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Coocky
Дата 23.7.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Цитата(dumb @  23.7.2007,  13:00 Найти цитируемый пост)
ты б хоть привел значение AccessMask


 Смотрел через FileSpy-действительно Фар записывает через F2 с флагами, в которых одним является FILE_WRITE_DATA.
Но я не попадаю в блок 

 
Код

if(AccessMask&FILE_WRITE_DATA)
{

}

Вообще в никакие не попадаю smile
Вот при сохранении по F2 такое значение-
AccessMask=1074790528 (hex 0x40100080)
У меня определено
#define FILE_WRITE_DATA ( 0x0002 )

Цитата(W4FhLF @  23.7.2007,  13:02 Найти цитируемый пост)
Coocky, для начала покажи ты получаешь uCreateDisposition и AccessMask.

Как и все-методом перехвата функции. smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
W4FhLF
Дата 23.7.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата(Coocky @  23.7.2007,  14:02 Найти цитируемый пост)
Как и все-методом перехвата функции.


Код? 


Цитата(Coocky @  23.7.2007,  14:02 Найти цитируемый пост)
Вообще в никакие не попадаю 
Вот при сохранении по F2 такое значение-AccessMask=1074790528 (hex 0x40100080)
У меня определено
#define FILE_WRITE_DATA ( 0x0002 )


Т.е. один вызов NtCreateFile и разные значения AccessMask у тебя и в FileSpy? 




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Coocky
Дата 23.7.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Цитата(W4FhLF @  23.7.2007,  14:25 Найти цитируемый пост)
Код? 

 Да ну перестань. Сейчас возьму и всю либу брошу сюда smile
Там с перехватом все ок. Все флаги нормальные.
Цитата(W4FhLF @  23.7.2007,  14:25 Найти цитируемый пост)
Т.е. один вызов NtCreateFile и разные значения AccessMask у тебя и в FileSpy

Похоже, что да.



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
W4FhLF
Дата 23.7.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата(Coocky @  23.7.2007,  14:35 Найти цитируемый пост)
Там с перехватом все ок. Все флаги нормальные.


Ну давай тогда спишем всё на FileSpy, ибо из двух программ одна работает не верно, но т.к. ты уверен, что твоя работает верно, стало быть Far Manager просто нагло обманывает FileSpy, а сам на самом деле юзает порты IO для записи в файл. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Coocky
Дата 23.7.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Цитата(W4FhLF @  23.7.2007,  15:16 Найти цитируемый пост)
Ну давай тогда спишем всё на FileSpy, ибо из двух программ одна работает не верно

Ну так а что-обвинить Detours ? smile
Что тебе -сюда код перехвата выложить?
Ну лови,найди ошибку
Код

NTSTATUS (WINAPI *pNtCreateFile)(PHANDLE phFile,ACCESS_MASK AccessMask_i, POBJECT_ATTRIBUTES pObjectAttributes, PIO_STATUS_BLOCK pIoStatusBlock, PLARGE_INTEGER pliAllocationSize, ULONG uFileAttributes,  ULONG uShareAccess, ULONG uCreateDisposition, ULONG uCreateOptions, PVOID pEaBuffer,  ULONG uEaLength);
............
............
NTSTATUS WINAPI UnrealpNtCreateFile(PHANDLE phFile,ACCESS_MASK AccessMask_i, POBJECT_ATTRIBUTES pObjectAttributes, PIO_STATUS_BLOCK pIoStatusBlock, PLARGE_INTEGER pliAllocationSize, ULONG uFileAttributes,  ULONG uShareAccess, ULONG uCreateDisposition, ULONG uCreateOptions, PVOID pEaBuffer,  ULONG uEaLength)
{
     if(AccessMask_i&FILE_WRITE_DATA)
   
   {
 
    }
return pNtCreateFile( phFile, AccessMask_i,  pObjectAttributes,  pIoStatusBlock,  pliAllocationSize,  uFileAttributes,   uShareAccess,  uCreateDisposition,  uCreateOptions,  pEaBuffer,   uEaLength);

}
........
........
........
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call, LPVOID lpReserved)

{

  if (ul_reason_for_call == DLL_PROCESS_ATTACH)
  
{
        pNtCreateFile=NULL;
        reinterpret_cast<FARPROC&>(pNtCreateFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "ZwCreateFile");
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)pNtCreateFile,UnrealpNtCreateFile);
        DetourTransactionCommit();
}

}


 smile 

Замечу, что все работает во многих приложениях нормально.И ВСЕ совпадает, кроме маски доступа.
Ты просил код? Вот тебе код smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
W4FhLF
Дата 23.7.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата(Coocky @  23.7.2007,  15:24 Найти цитируемый пост)
Ну так а что-обвинить Detours ?


Встречал я такого зверя, не помню правда, толи это был Trojan.Downloader толи Bot.DDOS/Socks. Я надеюсь не ты автор?smile

Цитата(Coocky @  23.7.2007,  15:24 Найти цитируемый пост)
Ну лови,найди ошибку


Ага, благодарю за одолжение smile 


Собственно, я вообще не знаю чего тут репу чесать, у тебя AccessMask_i = 0x40100080, а FILE_WRITE_DATA = 0x0002. С чего условие выполниться должно?smile 
Я б на твоём месте подключился к FAR'у, в который уже внедрена DLL, отладчиком и поставил бряк на CreateFile и протрейсил бы всё это дело внимательно анализирую параметры, ибо это гадание на кофейной гуще ни к чему не приведёт. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dumb
Дата 24.7.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



прошу пардона за небольшой увод в сторону. GENERIC_xxx - это отдельные флаги, которые "превращаются"(где-то там "внутрях") в комбинации флагов согласно типам объектов.
посему проверять надо как-то так:
Код

if(AccessMask&(GENERIC_ALL | GENERIC_WRITE | FILE_WRITE_DATA))


Цитата(Coocky @  23.7.2007,  14:02 Найти цитируемый пост)
AccessMask=1074790528 (hex 0x40100080)
GENERIC_WRITE | SYNCHRONIZE | FILE_READ_ATTRIBUTES.

GENERIC_WRITE вроде как содержит SYNCHRONIZE, так что зачем он тут - smile

Цитата(W4FhLF @  23.7.2007,  16:09 Найти цитируемый пост)
Встречал я такого зверя, не помню правда, толи это был Trojan.Downloader толи Bot.DDOS/Socks. Я надеюсь не ты автор?
Detoursили это была особо-изощренная шутка? smile
PM MAIL   Вверх
Coocky
Дата 24.7.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



dumb, хм.. Мне понравилась твоя мысль. Только не могу за нее толком зацепится
Вот что я нашел в описании winnt.h 
Код

////////////////////////////////////////////////////////////////////////
//                                                                    //
//                             ACCESS MASK                            //
//                                                                    //
////////////////////////////////////////////////////////////////////////

//
//  Define the access mask as a longword sized structure divided up as
//  follows:
//
//       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//       1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//      +---------------+---------------+-------------------------------+
//      |G|G|G|G|Res'd|A| StandardRights|         SpecificRights        |
//      |R|W|E|A|     |S|               |                               |
//      +-+-------------+---------------+-------------------------------+
//
//      typedef struct _ACCESS_MASK {
//          WORD   SpecificRights;
//          BYTE  StandardRights;
//          BYTE  AccessSystemAcl : 1;
//          BYTE  Reserved : 3;
//          BYTE  GenericAll : 1;
//          BYTE  GenericExecute : 1;
//          BYTE  GenericWrite : 1;
//          BYTE  GenericRead : 1;
//      } ACCESS_MASK;
//      typedef ACCESS_MASK *PACCESS_MASK;
//
//  but to make life simple for programmer's we'll allow them to specify
//  a desired access mask by simply OR'ing together mulitple single rights
//  and treat an access mask as a DWORD.  For example
//
//      DesiredAccess = DELETE | READ_CONTROL
//
//  So we'll declare ACCESS_MASK as DWORD
//

// begin_ntddk begin_wdm begin_nthal begin_ntifs
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK *PACCESS_MASK;

////////////////////////////////////////////////////////////////////////
//                                                                    //
//                             ACCESS TYPES                           //
//                                                                    //
////////////////////////////////////////////////////////////////////////


// begin_ntddk begin_wdm begin_nthal begin_ntifs
//
//  The following are masks for the predefined standard access types
//

#define DELETE                           (0x00010000L)
#define READ_CONTROL                     (0x00020000L)
#define WRITE_DAC                        (0x00040000L)
#define WRITE_OWNER                      (0x00080000L)
#define SYNCHRONIZE                      (0x00100000L)

#define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)

#define STANDARD_RIGHTS_READ             (READ_CONTROL)
#define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
#define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)

#define STANDARD_RIGHTS_ALL              (0x001F0000L)

#define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)

//
// AccessSystemAcl access type
//

#define ACCESS_SYSTEM_SECURITY           (0x01000000L)

//
// MaximumAllowed access type
//

#define MAXIMUM_ALLOWED                  (0x02000000L)

//
//  These are the generic rights.
//

#define GENERIC_READ                     (0x80000000L)
#define GENERIC_WRITE                    (0x40000000L)
#define GENERIC_EXECUTE                  (0x20000000L)
#define GENERIC_ALL                      (0x10000000L)


//
//  Define the generic mapping array.  This is used to denote the
//  mapping of each generic access right to a specific access mask.
//

typedef struct _GENERIC_MAPPING {
    ACCESS_MASK GenericRead;
    ACCESS_MASK GenericWrite;
    ACCESS_MASK GenericExecute;
    ACCESS_MASK GenericAll;
} GENERIC_MAPPING;
typedef GENERIC_MAPPING *PGENERIC_MAPPING;

Хрен его знает,как это мне поможет smile,но хотелось бы ...smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 24.7.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



dumb, ничего не понимаю, но вот так
Код

if(uCreateDisposition==FILE_OPEN&&(AccessMask_i&(GENERIC_WRITE)))

работает  smile для всех приложений.
Ладно,лови плюс в репу,незнаю чем помог,но на мысль натолкнул  smile 
Дальше постараюсь копать сам.
W4FhLF, не.Я не пишу трояны.Скорее наоборот-антитроянские программы.Хотя раньше просто интерфейсы для них, теперь-не повезло.Само ядро. smile 


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
dumb
Дата 24.7.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(Coocky @  24.7.2007,  09:34 Найти цитируемый пост)
ничего не понимаю
Access Rights and Access Masks

Цитата(Coocky @  24.7.2007,  09:34 Найти цитируемый пост)
но вот так <...> работает  smile для всех приложений.
более правильную проверку я уже изобразил.

Цитата(Coocky @  24.7.2007,  09:34 Найти цитируемый пост)
Ладно,лови плюс в репу,незнаю чем помог,но на мысль натолкнул
а вот одолжений мне не нужно делать smile - будь добр, компенсируй этот "плюс".

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1160 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.