Проблемы ZwCreateFile в Делфях

Тема в разделе "WASM.WIN32", создана пользователем test555, 5 ноя 2008.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    ( Заранее прошу не критиковать за выбор делфей и Юзермода, задача должна решиться именно так, в силу многих решающих причин)

    Хочу организовать мониторнг операции с файлами. Для начала - открытие (создание).
    Используя метод перехвата АПИ функций, описанным MS-REM (Перехват АПи функций, часть 1) хочу сделать эту функцию:
    ZwCreateFile. В МСДН вот такое описание:

    The ZwCreateFile routine creates a new file or opens an existing file.
    NTSTATUS
    ZwCreateFile(
    OUT PHANDLE FileHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PLARGE_INTEGER AllocationSize OPTIONAL,
    IN ULONG FileAttributes,
    IN ULONG ShareAccess,
    IN ULONG CreateDisposition,
    IN ULONG CreateOptions,
    IN PVOID EaBuffer OPTIONAL,
    IN ULONG EaLength
    );

    В Делфи я переделал вот так:

    Function ZwCreateFile(FileHandle:PHANDLE;
    DesiredAccess:lol: WORD;
    ObjectAttributes:POBJECT_ATTRIBUTES;
    IoStatusBlock :PIO_STATUS_BLOCK;
    a:PLargeInteger;
    FileAttributes,
    ShareAccess,
    CreateDisposition,
    CreateOptions:lol: WORD;
    EaBuffer:Pointer;
    EaLength:lol: WORD
    ): NTStatus;
    stdcall; external 'ntdll.dll';

    Ведется ее перехват

    Function NewZwCreateFile(FileHandle:PHANDLE;
    DesiredAccess:lol: WORD;
    ObjectAttributes:POBJECT_ATTRIBUTES;
    IoStatusBlock :PIO_STATUS_BLOCK;
    a:PLargeInteger;
    FileAttributes,
    ShareAccess,
    CreateDisposition,
    CreateOptions:lol: WORD;
    EaBuffer:Pointer;
    EaLength:lol: WORD
    ): NTStatus;
    stdcall;
    begin
    Result:=TrueZwCreateFile(FileHandle,
    DesiredAccess,
    ObjectAttributes,
    IoStatusBlock ,
    a,
    FileAttributes,
    ShareAccess,
    CreateDisposition,
    CreateOptions,
    EaBuffer,
    EaLength,
    );

    add2file('c:\FILESLOG.txt',pchar('NEWCREATEFILE, lAST ERROR = '+inttostr(GetLastError())+' , Result= ' +Inttostr(Result)+#13#10));
    end;


    Ну так вот, если программа работает, то выдается ЛастЕррор = 478 (Attempt to access invalid address.) и функция возвращяет -1073741811 значение.

    Я думаю что описал функцию неправильно.. Но.. Не могу понять что не так..

    А IoStatusBlock^.Status дает значение 437336 (ошибка)

    ..
    ПРи этом если открываею тектовый файл, то блокнот не старует, а тотал коммендер пишет что "не удалось запустить программу". Но втроенный вьювер текстовый файл открывает.
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Сервисы возвращают LastStatusValue, LastErrorValue это получается из первого значения далее.
    У тебя сервис возвращает STATUS_INVALID_PARAMETER. Модуль в студию.
     
  3. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Упс, нашлась небольшая бага...
    Но исправив ее, нашлась новая..
    Щас подправлю и посмотрю как работает...

    Ошибки нашлись, причем не в единственном экземпляре.

    Что называется лучше не переделывать, писать модуль заного, т.к. забываешь менять некоторые значения. Так и запутался.

    Еще касяк был что в обработчике у меня вызывается запись в файл, что собственно заного вызывает эту функцию, таким образом идет зацикливание ((

    Но месаджбокс выдается при открытии файла, работаю...

    Пока вопрос на опережение:
    Какие еще нужно будет функции хватать чтобы отловить запись в файл?
     
  4. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Итак, построил небольшой файловый монитор подобно FileNom
    В коно блокнота скидываются строки лога, какая прога и какой файл открывает.
    Впечатление такое что не всегда срабатывает...
     
  5. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    test555
    А что если я заюзаю сервис через Int2e, как ты это мониторить будешь ??
     
  6. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    CrystalIC
    Думаю человек просто учится тому, как вообще это делать, а не пытается от вас защититься.
    test555
    Код нужно увидеть.
     
  7. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Пожалста. Код в студию!

    Код (Text):
    1. library Hide;
    2.  
    3. uses
    4.   Windows,
    5.   NativeAPI, Messages;
    6.  
    7. type
    8.  OldCode = packed record
    9.   One: dword;
    10.   two: word;
    11.  end;
    12.  
    13.  
    14.    type
    15.   LongRec = packed record
    16.     case Integer of
    17.       0: (Lo, Hi: Word);
    18.       1: (Words: array [0..1] of Word);
    19.       2: (Bytes: array [0..3] of Byte);
    20.   end;
    21.  
    22.  
    23. far_jmp = packed record
    24.   PuhsOp: byte;
    25.   PushArg: pointer;
    26.   RetOp: byte;
    27.  end;
    28.  
    29.  PUnicodeString = ^TUnicodeString;
    30.   TUnicodeString = packed record
    31.     Length: Word;
    32.     MaximumLength: Word;
    33.     Buffer: PWideChar;
    34.   end;
    35.  
    36.  
    37.     TOBJECT_ATTRIBUTES = packed record
    38.      Length : ULONG;
    39.      RootDirectory : THandle;
    40.      ObjectName : PUnicodeString;
    41.      Attributes : ULONG;
    42.      SecurityDescriptor : Pointer;
    43.      SecurityQualityOfService : Pointer;
    44.    end;
    45.  
    46.    OBJECT_ATTRIBUTES = TOBJECT_ATTRIBUTES;
    47.    POBJECT_ATTRIBUTES = ^TOBJECT_ATTRIBUTES;
    48.  
    49.  
    50. const
    51.   FileDirectoryInformation        = 1;
    52.   FileFullDirectoryInformation    = 2;
    53.   FileBothDirectoryInformation    = 3;
    54.   FileNamesInformation            = 12;
    55.   KeyValueBasicInformation        =0;
    56.   KeyValueFullInformation         =1;
    57.   KeyValuePartialInformation      =2;
    58.  
    59.  
    60.   STATUS_NO_SUCH_FILE             = $C000000F;
    61.   STATUS_SUCCESS                  = $00000000;
    62.  
    63.  
    64. var
    65. JmpCreateFile: far_jmp;
    66. OldCreateFile : OldCode;
    67. PtrCreateFile: pointer;
    68.  
    69. b:boolean;
    70.  
    71.  
    72.  
    73. Function ZwCreateFile(FileHandle:PHANDLE;
    74.                       DesiredAccess:DWORD;
    75.                       ObjectAttributes:POBJECT_ATTRIBUTES;
    76.                       IoStatusBlock   :PIO_STATUS_BLOCK;
    77.                       a:PLargeInteger;
    78.                       FileAttributes,
    79.                       ShareAccess,
    80.                       CreateDisposition,
    81.                       CreateOptions:DWORD;
    82.                       EaBuffer:Pointer;
    83.                       EaLength:DWORD
    84.                       ): NTStatus;
    85.                          stdcall; external 'ntdll.dll';
    86.  
    87.  
    88.  
    89.  
    90.  
    91.  
    92. function AllocMem(Size: Cardinal): Pointer;
    93. begin
    94.   GetMem(Result, Size);
    95.   FillChar(Result^, Size, 0);
    96. end;
    97.  
    98.  
    99.  
    100.  
    101.  
    102. function StrPas(const Str: PChar): string;
    103. begin
    104.   Result := Str;
    105. end;
    106.  
    107. function StrToInt(S: string): integer;
    108. begin
    109.  Val(S, Result, Result);
    110. end;
    111.  
    112. function IntToStr(I: integer): string;
    113. begin
    114.   Str(I, Result);
    115. end;
    116.  
    117. function GetModuleFileName: string;
    118. var
    119.   Buffer: array[0..261] of Char;
    120. begin
    121.   SetString(Result, Buffer, Windows.GetModuleFileName(HInstance,
    122.     Buffer, SizeOf(Buffer)));
    123. end;
    124.  
    125. Function TrueZwCreateFile(FileHandle:PHANDLE;
    126.                       DesiredAccess:DWORD;
    127.                       ObjectAttributes:POBJECT_ATTRIBUTES;
    128.                       IoStatusBlock   :PIO_STATUS_BLOCK;
    129.                       a:PLargeInteger;
    130.                       FileAttributes,
    131.                       ShareAccess,
    132.                       CreateDisposition,
    133.                       CreateOptions:DWORD;
    134.                       EaBuffer:Pointer;
    135.                       EaLength:DWORD
    136.                       ): NTStatus;                          stdcall;
    137. var
    138.  Written: dword;
    139. begin
    140.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCreateFile,
    141.                      @OldCreateFile, SizeOf(OldCode), Written);
    142.  
    143.   Result := ZwCreateFile(FileHandle,
    144.                       DesiredAccess,
    145.                       ObjectAttributes,
    146.                       IoStatusBlock,
    147.                       a,
    148.                       FileAttributes,
    149.                       ShareAccess,
    150.                       CreateDisposition,
    151.                       CreateOptions,
    152.                       EaBuffer,
    153.                       EaLength
    154.                       );
    155.  
    156.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCreateFile,
    157.                      @JmpCreateFile, SizeOf(far_jmp), Written);
    158.  
    159.  
    160. end;
    161.  
    162.  
    163.  
    164. Function NewZwCreateFile(FileHandle:PHANDLE;
    165.                       DesiredAccess:DWORD;
    166.                       ObjectAttributes:POBJECT_ATTRIBUTES;
    167.                       IoStatusBlock   :PIO_STATUS_BLOCK;
    168.                       a:PLargeInteger;
    169.                       FileAttributes,
    170.                       ShareAccess,
    171.                       CreateDisposition,
    172.                       CreateOptions:DWORD;
    173.                       EaBuffer:Pointer;
    174.                       EaLength:DWORD
    175.                       ): NTStatus;
    176.                          stdcall;
    177. var
    178.       buf : array [0.. 16384-1] of char;
    179.       s, st:string;
    180.       M:integer;
    181.  
    182. const hh=460752; // хендл поля куда скидывать логи. Обычно это поле блокнота (вычислять самому)
    183.  
    184. begin
    185.  
    186. Result:=TrueZwCreateFile(FileHandle,
    187.                       DesiredAccess,
    188.                       ObjectAttributes,
    189.                       IoStatusBlock ,
    190.                       a,
    191.                       FileAttributes,
    192.                       ShareAccess,
    193.                       CreateDisposition,
    194.                       CreateOptions,
    195.                       EaBuffer,
    196.                       EaLength,
    197.                       );
    198.  
    199.  
    200. SendMessage(hh,WM_GETTEXT, 16384,  dword(@buf));
    201. s:=strpas(buf);
    202. m:=length(s);
    203. if m>15000 then s:='';
    204. s:=inttostr(Result) + ': '+ paramstr(0)+ ', '  +   ObjectAttributes^.ObjectName.Buffer  +   ''+  #13#10 +  s   ;
    205. SendMessage(hh,WM_SETTEXT, 0,  integer(pchar(s))  );
    206.  
    207. end;
    208.  
    209.  
    210. Procedure SetHook();
    211. var
    212.  Bytes, bytes2: dword;
    213.  
    214. begin
    215.   PtrCreateFile  := GetProcAddress(GetModuleHandle('ntdll.dll'),
    216.                             'ZwCreateFile');
    217.  
    218.   ReadProcessMemory(INVALID_HANDLE_VALUE, PtrCreateFile, @OldCreateFile, SizeOf(OldCode), Bytes);
    219.   JmpCreateFile.PuhsOp  := $68;
    220.   JmpCreateFile.PushArg := @NewZWCreateFile;
    221.   JmpCreateFile.RetOp   := $C3;
    222.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCreateFile, @JmpCreateFile, SizeOf(far_jmp), Bytes);
    223.  
    224.  
    225.   end;
    226.  
    227. Procedure Unhook();
    228. var
    229.  Bytes: dword;
    230. begin
    231.  
    232.  WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCreateFile, @OldCreateFile, SizeOf(OldCode), Bytes);
    233.  
    234.   end;
    235.  
    236. Function MessageProc(code : integer; wParam : word;
    237.                     lParam : longint) : longint; stdcall;
    238. begin
    239.  CallNextHookEx(0, Code, wParam, lparam);
    240.  Result := 0;
    241. end;
    242.  
    243. Procedure SetGlobalHookProc();
    244. begin
    245.  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    246.  Sleep(INFINITE);
    247. end;
    248. //
    249.  
    250. Procedure SetGlobalHook();
    251. var
    252.  hMutex: dword;
    253.  TrId: dword;  i:integer;
    254. begin
    255. i:=0;
    256.  hMutex := CreateMutex(nil, false, 'ProcHideHook');
    257.  if GetLastError = 0 then
    258.  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
    259.  CloseHandle(hMutex);
    260. end;
    261.  
    262. procedure DLLEntryPoint(dwReason: DWord);
    263. var s:string;
    264. begin
    265.   case dwReason of
    266.     DLL_PROCESS_ATTACH: begin
    267.                           b:=true;
    268.                           SetGlobalHook();
    269.                           SetHook();
    270.                        end;
    271.     DLL_PROCESS_DETACH: begin
    272.                        Unhook();
    273.                         end;
    274.   end;
    275. end;
    276.  
    277.  
    278. begin
    279.  
    280.  DllProc := @DLLEntryPoint;
    281.  DLLEntryPoint(DLL_PROCESS_ATTACH);
    282. end.
    Верно замечено, что это больше учебная задача. Вообще-то это часть дипломного проекта. Но возможно что будет применяться в производстве.

    CrystalIC, а ты сможешь без прав админа запустить свой сервис Int2e
    (с АСМ я не дружу пока, я статью про введение в машинный код еще не прочел, т.е до прерываний дошел..)

    Вообще нужно будет мониторить, чтобы юзеры не сохраняли некотореы документы, например на флешки или сетевые папки...
     
  8. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    советую почитать http://gl00my.chat.ru/nt/int2e.txt
     
  9. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    test555
    Дурдом.
     
  10. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    В каком еще производстве? Это Вы зря.
    Думаю он справится, Вы о себе думайте. Т.к. в данном случае он прав - тут жесть какая-то.
    Вы если коды ошибок указываете указывайте их в 16м представлении и ее смысловое значение (врядли кто-то будет переводить, а потом еще и искать за Вас это же не школа) и строку что ли, где выходит такой код ошибки.
    Выглядит так будто каша сплошная в голове - не стоит скорее всего так спешить.

    По коду
    - Возвращаемые значения стоит проверять наверное.
    - SetGlobalHook нужна вобще? А мьютекс там зачем хоть?
    Про остальное говорить нет смысла - постарайтесь не просто неправильно копипастить код,
    а немного разобраться и попытаться написать в ручную с 0.
    Наверное поэтому тут так и не любят Delphi.
     
  11. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    А это код из топика ниже, там кто то пытался от диспетчера скрыться и эту длл юзал, а ТС скопипастил, добавил только хук ZwCreateFile, ибо видимо не шарет как поставить хук. Даже название мьютекса оставил, наверно побоялся что работать не будет
    а вот сам топик http://www.wasm.ru/forum/viewtopic.php?id=29422
     
  12. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Ох, закритиковали.

    По порядку.

    PE_Kill, не скрываю, исходники были взяты из статьи, и переделаны. А смысла пока менять 'ProcHideHook' я не вижу (или я не прав??), не это щас главное.


    CrystalIC, "дурдом", это про что конкретно вы имеете ввиду?

    Код, приведенный здесь работает, и уже нет никаких ошибок -1073741811 и тд..


    Кому интересно, задача - отловить запись некоторых документов в запрещенные места (сетевые диски, неразрешенные флешки). Юзеры имеют права Пользователя.

    Все же задача более учебная....
     
  13. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500