Four-F поделись инфой плиз http://www.ntkernel.com/forum/viewtopic.php?p=605&highlight=&sid=326dc9fa24f4c2769ad0a230ac68e91a В принципе могу найти, но нужно опуститься на уровень ассемблера, хотелось бы поэлегантнее.
По-моему, правильно будет "подняться до уровня ассемблера", ибо опускаются обычно до уровня "вижуал бейсик" и "дельфи". Кстати, это ж только в w2k мутекс, если я не ошибаюсь (в wxp+ ресурс внутри object_type. Да и зачем он тебе?). Начни поиск с ObCreateObjectType и дизасмом длин ищи сигнатурку. XRefов на него туева хуча...
Поэлегантнее не получилось. Дело было 4 года назад, потратил немеряно времени, но ничего лучше тупого поиска не придумал Код из WinObjEx, так что он вполне работоспособен. Код (Text): // // Under 2000 we have to acquire this resource while manually // scaning directory object. We try to find this by calling // GetRootDirectoryMutex from within DriverEntry. // PERESOURCE g_pObpRootDirectoryMutex = NULL; /////////////////////////////////////////////////////////////////////////////// // GetRootDirectoryMutex /////////////////////////////////////////////////////////////////////////////// PERESOURCE NTAPI GetRootDirectoryMutex ( VOID ) { #undef ExAcquireResourceExclusiveLite __declspec(dllimport) //NTKERNELAPI BOOLEAN ExAcquireResourceExclusiveLite( IN PERESOURCE Resource, IN BOOLEAN Wait ); #undef ExReleaseResourceLite __declspec(dllimport) //NTKERNELAPI VOID FASTCALL ExReleaseResourceLite( IN PERESOURCE Resource ); #undef ObReferenceObjectByName __declspec(dllimport) //NTKERNELAPI NTSTATUS ObReferenceObjectByName( IN PUNICODE_STRING ObjectName, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState OPTIONAL, IN ACCESS_MASK DesiredAccess OPTIONAL, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, OUT PVOID *Object ); // // Finds ObpRootDirectoryMutex address // PVOID pfnExAcquireResourceExclusiveLite; PVOID pfnExReleaseResourceLite; PVOID pfnObReferenceObjectByName; PVOID p; ULONG u; ULONG cbToScan = 0; ULONG uRelativeOffset = 0; PERESOURCE pObpRootDirectoryMutex = NULL; ULONG MajorVersion; ULONG MinorVersion; BOOLEAN CheckedBuild; CheckedBuild = PsGetVersion( &MajorVersion, &MinorVersion, NULL, NULL ); // // dwMajorVersion dwMinorVersion dwBuildNumber // 2000 5 0 2195 // XP 5 1 2600 // 2003 5 2 3790 // if ( !CheckedBuild && 5 == MajorVersion && 0 == MinorVersion ) { pfnExAcquireResourceExclusiveLite = ExAcquireResourceExclusiveLite; //pfnExAcquireResourceExclusiveLite = (PVOID) (* (PULONG) ((ULONG) p + 2)); pfnExReleaseResourceLite = ExReleaseResourceLite; //pfnExReleaseResourceLite = (PVOID) (* (PULONG) ((ULONG) p + 2)); pfnObReferenceObjectByName = ObReferenceObjectByName; //pfnObReferenceObjectByName = (PVOID) (* (PULONG) ((ULONG) p + 2)); // // Try to find in ObReferenceObjectByName // // PAGE:004C0046 B9 C0 CD 46 00 mov ecx, offset _ObpRootDirectoryMutex // PAGE:004C004B E8 15 6A F5 FF call @ExReleaseResourceLite@4 // cbToScan = 0x150; if ( IsMemoryRangeValid( (PVOID) pfnObReferenceObjectByName, cbToScan ) ) { for ( u = 0; u < cbToScan; u++ ) { if ( * (PCHAR) ((ULONG) pfnObReferenceObjectByName + u) == (CHAR) 0xE8 ) { // Call near, relative uRelativeOffset = * (PULONG) ((ULONG) pfnObReferenceObjectByName + u + 1); p = (PVOID) (uRelativeOffset + (ULONG) ((ULONG) pfnObReferenceObjectByName + u + 5)); if ( p == pfnExReleaseResourceLite ) { if ( * (PCHAR) ((ULONG) pfnObReferenceObjectByName + u - 5) == (CHAR) 0xB9 ) { // mov pObpRootDirectoryMutex = (PERESOURCE) (* (PULONG) ((ULONG) pfnObReferenceObjectByName + u - 4)); if ( !IsMemoryRangeValid((PVOID) pObpRootDirectoryMutex, sizeof(*pObpRootDirectoryMutex)) ) { pObpRootDirectoryMutex = NULL; } #pragma Fix("Check to see whether it is inside ntoskrnl body or even better inside .data sec") } break; } } } if ( u < cbToScan ) { // Found ExReleaseResourceLite } } } #ifdef MYDBG if ( pObpRootDirectoryMutex != NULL ) { DBGPRINT( DBG_LEVEL_TRACE, (DRIVER_NAME ".GetRootDirectoryMutex: ObpRootDirectoryMutex found at %p\n", pObpRootDirectoryMutex) ); } else { DBGPRINT( DBG_LEVEL_ERROR, (DRIVER_NAME ".GetRootDirectoryMutex: ObpRootDirectoryMutex not found\n") ); } #endif return pObpRootDirectoryMutex; } /////////////////////////////////////////////////////////////////////////////// // DriverEntry /////////////////////////////////////////////////////////////////////////////// NTSTATUS NTAPI DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath ) { ... g_pObpRootDirectoryMutex = GetRootDirectoryMutex(); ... } /////////////////////////////////////////////////////////////////////////////// // EnterRootDirectoryMutex /////////////////////////////////////////////////////////////////////////////// VOID EnterRootDirectoryMutex ( VOID ) { if ( g_pObpRootDirectoryMutex != NULL ) { KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite( g_pObpRootDirectoryMutex, TRUE ); } } /////////////////////////////////////////////////////////////////////////////// // LeaveRootDirectoryMutex /////////////////////////////////////////////////////////////////////////////// VOID LeaveRootDirectoryMutex ( VOID ) { if ( g_pObpRootDirectoryMutex != NULL ) { ExReleaseResource( g_pObpRootDirectoryMutex ); KeLeaveCriticalRegion(); } } IsMemoryRangeValid листает диапазон постранично и для каждой страницы зовет MmIsAddressValid. Функцию просмотра католога объектов не дам, ибо жалко За основу бралась NtQueryDirectoryObject, убрал лишнее, добавил кое-какие проверки. Каталог лочится так: Код (Text): if ( g_pObpRootDirectoryMutex != NULL) { EnterRootDirectoryMutex(); } else { KeEnterCriticalRegion(); } ... if ( g_pObpRootDirectoryMutex != NULL) { LeaveRootDirectoryMutex(); } else { KeLeaveCriticalRegion(); } Как лочится каталог на XP+ я так и не разобрался. Под XP+ у меня только Ke...CriticalRegion. Пока никто не жаловался Если кто-то знает, было бы весьма интересно...
Four-F - не нужно на XP и выше есть функция (данные из pdb) - ObpLockDirectoryExclusive(...) но видимо и ее тоже искать нужно
Four-F Нереальная жесть 1) Дизасм длин все-таки удобнее 2) Не нужны всякие проверки на валидность памяти, ибо проще загрузить образ к себе И вообще, мутекс этот есть только на w2k, можно тупо захардкодить оффсет на его адрес от начала любой функции где он используется. Фигней какой-то страдаете...