(Nt\Zw)LockFile

Тема в разделе "WASM.WIN32", создана пользователем yuzvir, 13 июн 2005.

  1. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Начал недавно постигать программирование в Ring-0 и тут столкнулся с проблемой недостатка информации ...

    Вобщем заинтересовала меня функция (Nt\Zw)LockFile - но она недокументированная и никаких примеров ее использования я не нашел =(

    Может кто подскажет как ей пользоваться?



    PS: и еще такое вопрос - чем отличаются Nt* от Zw* ?
     
  2. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia


    Названием.

    В ntdll.dll ясно же написано:

    <ol type=1>Zw* proc near

    Nt* label near</ol>



    Я как раз только что из IDA. Нашел Кучу толковых функций, на которые тоже не найдешь описание. :)
     
  3. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Вообще дизассемблируй kernel32.dll. Тебе нужно смотреть LockFile (лучше LockFileEx). Эти функции используют ZwLockFile. ZwLockFile получает 10 (!) параметров. В основном они идут из тех, что передаешь LockFile (LockFileEx), а еще из структуры OVERLAPPED (указатель на нее - последний параметр, передаваемый функции LockFileEx).
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Код (Text):
    1. NTSYSAPI
    2. NTSTATUS
    3. NTAPI
    4. ZwLockFile(
    5. IN HANDLE FileHandle,
    6. IN HANDLE Event OPTIONAL,
    7. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
    8. IN PVOID ApcContext OPTIONAL,
    9. OUT PIO_STATUS_BLOCK IoStatusBlock,
    10. IN PULARGE_INTEGER LockOffset,
    11. IN PULARGE_INTEGER LockLength,
    12. IN ULONG Key,
    13. IN BOOLEAN FailImmediately,
    14. IN BOOLEAN ExclusiveLock
    15. );
     
  5. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Вот например дизассемблировал один троян:
    Код (Text):
    1.  
    2. .text:00010676                 push    0               ; EaLength
    3. .text:00010678                 push    0               ; EaBuffer
    4. .text:0001067A                 push    20h             ; CreateOptions
    5. .text:0001067C                 push    1               ; CreateDisposition
    6. .text:0001067E                 push    0               ; ShareAccess
    7. .text:00010680                 push    80h             ; FileAttributes
    8. .text:00010685                 push    0               ; AllocationSize
    9. .text:00010687                 push    offset IoStatusBlock ; IoStatusBlock
    10. .text:0001068C                 push    offset ObjectAttributes ; ObjectAttributes
    11. .text:00010691                 push    1               ; DesiredAccess
    12. .text:00010693                 push    offset FileHandle ; FileHandle
    13. .text:00010698                 call    ZwCreateFile
    14. .text:0001069D                 or      eax, eax
    15. .text:0001069F                 jnz     short loc_10700
    16. .text:000106A1                 push    5               ; FileInformationClass
    17. .text:000106A3                 push    14h             ; FileInformationLength
    18. .text:000106A5                 push    offset FileInformation ; FileInformation
    19. .text:000106AA                 push    offset IoStatusBlock ; IoStatusBlock
    20. .text:000106AF                 push    FileHandle      ; FileHandle
    21. .text:000106B5                 call    ZwQueryInformationFile
    22. .text:000106BA                 push    FileInformation
    23. .text:000106C0                 pop     LockLength.LowPart
    24. .text:000106C6                 mov     eax, [esp+50h+Key]
    25. .text:000106CA                 push    2               ; ExclusiveLock
    26. .text:000106CC                 push    0               ; FailImmediately
    27. .text:000106CE                 push    eax             ; Key
    28. .text:000106CF                 push    offset LockLength ; LockLength
    29. .text:000106D4                 push    offset LockLength.HighPart ; LockOffset
    30. .text:000106D9                 push    offset IoStatusBlock ; IoStatusBlock
    31. .text:000106DE                 push    0               ; ApcContext
    32. .text:000106E0                 push    0               ; ApcRoutine
    33. .text:000106E2                 push    0               ; Event
    34. .text:000106E4                 push    FileHandle      ; FileHandle
    35. .text:000106EA                 call    NtLockFile
    36.  




    Вобщем под вопросом у меня вот это:



    Что это за Key и LockLength и где их брать?



    PS: полностью этот файл в аттаче



    [​IMG] 3576668__vdnt32.vsys
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вот ещё немного инфы, Ms Rem что-то не всё запостил :)
    Код (Text):
    1. Routine Description:
    2.  
    3.     This service locks a specified range of bytes on the file specified by
    4.     the FileHandle parameter.  The lock may either be an exclusive lock or
    5.     a shared lock.  Furthermore, the caller has the option of specifying
    6.     whether or not the service should return immediately if the lock cannot
    7.     be acquired without waiting.
    8.  
    9. Arguments:
    10.  
    11.     FileHandle - Supplies a handle to an open file.
    12.  
    13.     Event - Supplies an optional event to be set to the Signaled state when
    14.         the operation is complete.
    15.  
    16.     ApcRoutine - Supplies an optional APC routine to be executed when the
    17.         operation is complete.
    18.  
    19.     ApcContext - Supplies a context parameter to be passed to the ApcRoutine,
    20.         if an ApcRoutine was specified.
    21.  
    22.     IoStatusBlock - Address of the caller's I/O status block.
    23.  
    24.     ByteOffset - Specifies the starting byte offset of the range to lock.
    25.  
    26.     Length - Specifies the length of the byte range to be locked.
    27.  
    28.     Key - Specifies the key to be associated with the lock.
    29.  
    30.     FailImmediately - Specifies that if the lock cannot immediately be
    31.         acquired that the service should return to the caller.
    32.  
    33.     ExclusiveLock - Specifies, if TRUE, that the lock should be an exclusive
    34.         lock;  otherwise the lock is a shared lock.
    35.  
    36. Return Value:
    37.  
    38.     The status returned is success if the operation was properly queued to
    39.     the I/O system.  Once the operation completes, the status can be
    40.     determined by examining the Status field of the I/O status block.
    41.  
    Key может быть таким:

    ULONG LockFileKey = 1;

    0

    возможно, есть и другие значения, но я не нашел :-(
     
  7. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Вот накатал :)
    Код (Text):
    1.  
    2. LockFile proc
    3. local oa:OBJECT_ATTRIBUTES
    4. local iosb:IO_STATUS_BLOCK
    5. local hFile:HANDLE
    6. local cb:PLARGE_INTEGER
    7. local bo:PLARGE_INTEGER
    8. local fsi:FILE_STANDARD_INFORMATION
    9.  
    10.     InitializeObjectAttributes addr oa, $CCOUNTED_UNICODE_STRING("\\??\\C:\\WINDOWS\\SYSTEM32\\test.exe"),\
    11.         OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL
    12.  
    13.     invoke ZwCreateFile, addr hFile, FILE_WRITE_EA + SYNCHRONIZE, addr oa, addr iosb, 0, \
    14.     FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0
    15.  
    16.     invoke ZwOpenFile, addr hFile, FILE_WRITE_EA + SYNCHRONIZE, addr oa, addr iosb, FILE_SHARE_READ, \
    17.     FILE_SYNCHRONOUS_IO_NONALERT
    18.  
    19.     invoke ZwQueryInformationFile, hFile, addr iosb, addr fsi, sizeof fsi, FileStandardInformation
    20.     mov    eax, fsi.EndOfFile.LowPart
    21.     inc    eax
    22.  
    23.     lea    ecx,cb
    24.     assume ecx:PLARGE_INTEGER
    25.  
    26.     mov    [ecx].LowPart, eax
    27.     mov    [ecx].HighPart, eax
    28.  
    29.     invoke NtLockFile, hFile, 0, 0, 0, addr iosb, addr bo, addr cb, 1, 0, 2
    30.     invoke ZwClose, hFile
    31.    
    32.     ret
    33. LockFile endp


    Блокирует почему-то не все файлы - в чем может быть ошибка?
     
  8. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Вот я не пойму, почему последний параметр равен двум, когда он максимум может быть TRUE? Не блокирует возможно потому, что другой процесс его уже заблокировал с Exclusive Access'ом :). Может GetLastError что подскажет?

    Еще. Если Key может быть равен единице, это вовсе не значит, что он должен быть равен единице.
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Дык если файл вообще открыт другим процессом, то как его возможно заблокировать то? Поэтому и не блочит.
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    dr_dred >




    В Си, как и в ассемблере нет булевых типов данных. так что 2 это тоже TRUE. А то, что TRUE != 2 - это неправильное использование языка microsoft'ом, а следом за ним и другими людьми. подробнее про такие баги можно почитать в книге Ален Голуб "Верёвка достаточной длины, что бы выстрелить себе в ногу"
     
  11. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    S_T_A_S_

    эээ, ты же читал приводимую тобой в пример книгу, а сам пишешь такое...



    единственно верной может быть (и должна быть!) только проверка TRUE != 0 или TRUE == 0.
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Я про это и говорю. У MS есть

    #define TRUE 1

    это, в принципе, баг
     
  13. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Скорее это не баг, а системное ограничение. Иначе как можно определить TRUE и какой будет результат при занесении этого в переменную любого целого типа?

    #define TRUE (some != 0) :)



    В принципе для чистоты можно написать функцию сравнения псевдобулевых значений:
    Код (Text):
    1.  
    2. template<class T> inline BOOL CmpBool (T a, T b)
    3. {
    4.   return (a != 0) == (b != 0);
    5. }
    6.  
     
  14. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    нет, все нормально. А вот если найдешь в коде
    Код (Text):
    1.  
    2. if (doSomth() [b]==[/b] TRUE)
    3.  


    тогда это точно баг будет.
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    alpet >




    А зачем его определять? Язык C не поддерживает булевый тип данных. В принципе, это не является проблемой для написания программ, поскольку этот тип излишество. Если же он нужен, то можно использовать C++ - большенство компиляторов его поддерживают. Или делать свой тип посредством enum.





    infern0 >




    Ага, а ещё и if ( foo == FALSE ) встретить можно.

    IMHO это незнание возможностей языка.
     
  16. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    S_T_A_S_

    В таком случае придется смириться с "TRUE = 1". Во всяком случае я и в Це++ программах использую именно эту константу, а не значение bool::true.
     
  17. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    вот флеймеры :)

    Да просто когда я дизассемблирова тот файл который я выложил там и увидел ExclusiveLock = 2

    А файл который используется тоже нормально блокируется.

    Не блокируются только уже частично заблокированные файлы - можно это как-нибудь обойти?
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    alpet

    А что мешает использовать встроенный в C++ тип bool? В С99 добавилен _Bool. Да и практически всегда можно целый тип использовать вместо. Эти кривые макросы себе дороже обойдутся, с ними можно долго искать сверхестественный глюк :derisive: