Как найти ObpRootDirectoryMutex

Тема в разделе "WASM.NT.KERNEL", создана пользователем PROFi, 8 апр 2008.

  1. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Four-F поделись инфой плиз http://www.ntkernel.com/forum/viewtopic.php?p=605&highlight=&sid=326dc9fa24f4c2769ad0a230ac68e91a

    В принципе могу найти, но нужно опуститься на уровень ассемблера, хотелось бы поэлегантнее.
     
  2. sww_

    sww_ New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2007
    Сообщения:
    155
    По-моему, правильно будет "подняться до уровня ассемблера", ибо опускаются обычно до уровня "вижуал бейсик" и "дельфи".

    Кстати, это ж только в w2k мутекс, если я не ошибаюсь (в wxp+ ресурс внутри object_type. Да и зачем он тебе?). Начни поиск с ObCreateObjectType и дизасмом длин ищи сигнатурку. XRefов на него туева хуча...
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    по-мойму тоже завязано на ресурсе в wxp+.
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Поэлегантнее не получилось. Дело было 4 года назад, потратил немеряно времени, но ничего лучше тупого поиска не придумал :dntknw: Код из WinObjEx, так что он вполне работоспособен.

    Код (Text):
    1. //
    2. //  Under 2000 we have to acquire this resource while manually
    3. //  scaning directory object.  We try to find this by calling
    4. //  GetRootDirectoryMutex from within DriverEntry.
    5. //
    6. PERESOURCE          g_pObpRootDirectoryMutex = NULL;
    7.  
    8.  
    9. ///////////////////////////////////////////////////////////////////////////////
    10. //  GetRootDirectoryMutex
    11. ///////////////////////////////////////////////////////////////////////////////
    12.  
    13. PERESOURCE
    14. NTAPI
    15.   GetRootDirectoryMutex (
    16.     VOID
    17.     )
    18. {
    19.  
    20.     #undef ExAcquireResourceExclusiveLite
    21.     __declspec(dllimport)   //NTKERNELAPI
    22.     BOOLEAN
    23.       ExAcquireResourceExclusiveLite(
    24.         IN PERESOURCE   Resource,
    25.         IN BOOLEAN      Wait
    26.         );
    27.  
    28.     #undef ExReleaseResourceLite
    29.     __declspec(dllimport)   //NTKERNELAPI
    30.     VOID
    31.     FASTCALL
    32.       ExReleaseResourceLite(
    33.         IN PERESOURCE Resource
    34.         );
    35.  
    36.     #undef ObReferenceObjectByName
    37.     __declspec(dllimport)   //NTKERNELAPI
    38.     NTSTATUS
    39.       ObReferenceObjectByName(
    40.         IN PUNICODE_STRING  ObjectName,
    41.         IN ULONG            Attributes,
    42.         IN PACCESS_STATE    PassedAccessState OPTIONAL,
    43.         IN ACCESS_MASK      DesiredAccess OPTIONAL,
    44.         IN POBJECT_TYPE     ObjectType,
    45.         IN KPROCESSOR_MODE  AccessMode,
    46.         IN OUT PVOID        ParseContext OPTIONAL,
    47.         OUT PVOID           *Object
    48.         );
    49.  
    50.     //
    51.     // Finds ObpRootDirectoryMutex address
    52.     //
    53.  
    54.     PVOID       pfnExAcquireResourceExclusiveLite;
    55.     PVOID       pfnExReleaseResourceLite;
    56.     PVOID       pfnObReferenceObjectByName;
    57.     PVOID       p;
    58.     ULONG       u;
    59.     ULONG       cbToScan = 0;
    60.     ULONG       uRelativeOffset = 0;
    61.  
    62.     PERESOURCE  pObpRootDirectoryMutex = NULL;
    63.  
    64.     ULONG       MajorVersion;
    65.     ULONG       MinorVersion;
    66.     BOOLEAN     CheckedBuild;
    67.  
    68.     CheckedBuild = PsGetVersion( &MajorVersion, &MinorVersion, NULL, NULL );
    69.  
    70.     //
    71.     //        dwMajorVersion   dwMinorVersion   dwBuildNumber
    72.     // 2000         5                0               2195
    73.     // XP           5                1               2600
    74.     // 2003         5                2               3790
    75.     //
    76.  
    77.     if ( !CheckedBuild  &&  5 == MajorVersion  &&  0 == MinorVersion ) {
    78.  
    79.         pfnExAcquireResourceExclusiveLite = ExAcquireResourceExclusiveLite;
    80.         //pfnExAcquireResourceExclusiveLite = (PVOID) (* (PULONG) ((ULONG) p + 2));
    81.  
    82.         pfnExReleaseResourceLite = ExReleaseResourceLite;
    83.         //pfnExReleaseResourceLite = (PVOID) (* (PULONG) ((ULONG) p + 2));
    84.  
    85.         pfnObReferenceObjectByName = ObReferenceObjectByName;
    86.         //pfnObReferenceObjectByName = (PVOID) (* (PULONG) ((ULONG) p + 2));
    87.  
    88.         //
    89.         //  Try to find in ObReferenceObjectByName
    90.         //
    91.         //  PAGE:004C0046 B9 C0 CD 46 00      mov ecx, offset _ObpRootDirectoryMutex
    92.         //  PAGE:004C004B E8 15 6A F5 FF      call @ExReleaseResourceLite@4
    93.         //
    94.  
    95.         cbToScan = 0x150;
    96.  
    97.         if ( IsMemoryRangeValid( (PVOID) pfnObReferenceObjectByName, cbToScan ) ) {
    98.  
    99.             for ( u = 0; u < cbToScan; u++ ) {
    100.  
    101.                 if ( * (PCHAR) ((ULONG) pfnObReferenceObjectByName + u) == (CHAR) 0xE8 ) {  // Call near, relative
    102.  
    103.                     uRelativeOffset =  * (PULONG) ((ULONG) pfnObReferenceObjectByName + u + 1);
    104.  
    105.                     p = (PVOID) (uRelativeOffset + (ULONG) ((ULONG) pfnObReferenceObjectByName + u + 5));
    106.  
    107.                     if ( p == pfnExReleaseResourceLite ) {
    108.  
    109.                         if ( * (PCHAR) ((ULONG) pfnObReferenceObjectByName + u - 5) == (CHAR) 0xB9 ) { // mov
    110.  
    111.                             pObpRootDirectoryMutex = (PERESOURCE) (* (PULONG) ((ULONG) pfnObReferenceObjectByName + u - 4));
    112.  
    113.                             if ( !IsMemoryRangeValid((PVOID) pObpRootDirectoryMutex, sizeof(*pObpRootDirectoryMutex)) ) {
    114.  
    115.                                 pObpRootDirectoryMutex = NULL;
    116.                             }
    117.  
    118.                             #pragma Fix("Check to see whether it is inside ntoskrnl body or even better inside .data sec")
    119.                         }
    120.  
    121.                         break;
    122.                     }
    123.                 }
    124.             }
    125.  
    126.             if ( u < cbToScan ) {
    127.  
    128.                 // Found ExReleaseResourceLite
    129.             }
    130.         }
    131.     }
    132.  
    133. #ifdef MYDBG
    134.     if ( pObpRootDirectoryMutex != NULL ) {
    135.         DBGPRINT( DBG_LEVEL_TRACE, (DRIVER_NAME ".GetRootDirectoryMutex: ObpRootDirectoryMutex found at %p\n", pObpRootDirectoryMutex) );
    136.     } else {
    137.         DBGPRINT( DBG_LEVEL_ERROR, (DRIVER_NAME ".GetRootDirectoryMutex: ObpRootDirectoryMutex not found\n") );
    138.     }
    139. #endif
    140.  
    141.     return pObpRootDirectoryMutex;
    142. }
    143.  
    144.  
    145. ///////////////////////////////////////////////////////////////////////////////
    146. //  DriverEntry
    147. ///////////////////////////////////////////////////////////////////////////////
    148.  
    149. NTSTATUS
    150. NTAPI
    151.   DriverEntry (
    152.     IN PDRIVER_OBJECT   pDriverObject,
    153.     IN PUNICODE_STRING  pusRegistryPath
    154.     )
    155. {
    156.     ...
    157.     g_pObpRootDirectoryMutex = GetRootDirectoryMutex();
    158.     ...
    159. }
    160.  
    161.  
    162. ///////////////////////////////////////////////////////////////////////////////
    163. //  EnterRootDirectoryMutex
    164. ///////////////////////////////////////////////////////////////////////////////
    165.  
    166. VOID
    167.   EnterRootDirectoryMutex (
    168.     VOID
    169.     )
    170. {
    171.     if ( g_pObpRootDirectoryMutex != NULL ) {
    172.         KeEnterCriticalRegion();
    173.         ExAcquireResourceExclusiveLite( g_pObpRootDirectoryMutex, TRUE );
    174.     }
    175. }
    176.  
    177.  
    178. ///////////////////////////////////////////////////////////////////////////////
    179. //  LeaveRootDirectoryMutex
    180. ///////////////////////////////////////////////////////////////////////////////
    181.  
    182. VOID
    183.   LeaveRootDirectoryMutex (
    184.     VOID
    185.     )
    186. {
    187.     if ( g_pObpRootDirectoryMutex != NULL ) {
    188.         ExReleaseResource( g_pObpRootDirectoryMutex );
    189.         KeLeaveCriticalRegion();
    190.     }
    191. }
    IsMemoryRangeValid листает диапазон постранично и для каждой страницы зовет MmIsAddressValid. Функцию просмотра католога объектов не дам, ибо жалко ;) За основу бралась NtQueryDirectoryObject, убрал лишнее, добавил кое-какие проверки. Каталог лочится так:

    Код (Text):
    1. if ( g_pObpRootDirectoryMutex != NULL) {
    2.     EnterRootDirectoryMutex();
    3. } else {
    4.     KeEnterCriticalRegion();
    5. }
    6.  
    7. ...
    8.  
    9. if ( g_pObpRootDirectoryMutex != NULL) {
    10.     LeaveRootDirectoryMutex();
    11. } else {
    12.     KeLeaveCriticalRegion();
    13. }
    Как лочится каталог на XP+ я так и не разобрался. Под XP+ у меня только Ke...CriticalRegion. Пока никто не жаловался ;)

    Если кто-то знает, было бы весьма интересно...
     
  5. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Four-F

    - не нужно :)

    на XP и выше есть функция (данные из pdb) - ObpLockDirectoryExclusive(...) но видимо и ее тоже искать нужно :dntknw:
     
  6. sww_

    sww_ New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2007
    Сообщения:
    155
    Four-F

    Нереальная жесть :lol:

    1) Дизасм длин все-таки удобнее
    2) Не нужны всякие проверки на валидность памяти, ибо проще загрузить образ к себе

    И вообще, мутекс этот есть только на w2k, можно тупо захардкодить оффсет на его адрес от начала любой функции где он используется.

    Фигней какой-то страдаете...
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Вобщем согласен. Давно дело было и тогда все виделось в несколько ином свете чем теперяча :)