Mutex'ы

Тема в разделе "WASM.WIN32", создана пользователем sideX, 3 июн 2010.

  1. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    Здравствуйте уважаемые.
    Каким образом я могу перечислить все существующие Mutex'ы в системе?
    Спасибо за внимание.
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    так же как и хендлы, см статьи на данном сайте
     
  3. Butters

    Butters New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    47
    sideX
    NtQuerySystemInformation с флагом перечисления описателей. Потом поиск по массиву объектов с соответствующим ID.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    o NtQueryObject(ObjectAllTypesInformation)
    o Находите там описатель типа "Mutant" по имени. Индекс описателя является индексом типа.
    o Получаете слепок(для описателей SystemHandleInformation, для обьектов SystemObjectInformation), енумите его и сравниваете индекс типа с полученным.
     
  5. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    Чтото я не очень понял с NtQuerySystemInformation.. вот код:
    Код (Text):
    1. ...
    2.  
    3.         SYSTEM_HANDLE_INFORMATION struct
    4.             ProcessId       DWORD ?
    5.             ObjectTypeNumber    BYTE  ?
    6.             Flags           BYTE  ?
    7.             Handle          DWORD ?
    8.             Object          DWORD ?
    9.             GrantedAccess       DWORD ?
    10.         SYSTEM_HANDLE_INFORMATION ends
    11.  
    12.  
    13.         SYSTEM_HANDLE_INFORMATION_EX STRUCT
    14.             NumberOfHandles DWORD ?
    15.             Information SYSTEM_HANDLE_INFORMATION 1 dup (<>)
    16.         SYSTEM_HANDLE_INFORMATION_EX ENDS
    17.  
    18. ...
    19.  
    20. GetMutexData    proc uses edi
    21.         LOCAL   lpSysInfo : DWORD
    22.  
    23.  
    24.         mov lpSysInfo, 0
    25.        
    26.         xinvoke ZwQuerySystemInformation, 16, 0, 0, offset dwBytes
    27.         cmp eax, 0C0000004h ; STATUS_INFO_LENGTH_MISMATCH
    28.         jnz _done
    29.        
    30. @@:
    31.         add dwBytes, 1000h
    32.        
    33.         .IF (lpSysInfo != 0)
    34.             invoke  LocalFree, lpSysInfo
    35.         .ENDIF
    36.            
    37.         invoke  LocalAlloc, LPTR, dwBytes
    38.         mov lpSysInfo, eax
    39.        
    40.         xinvoke ZwQuerySystemInformation, 16, lpSysInfo, dwBytes, 0
    41.         cmp eax, 0C0000004h ; STATUS_INFO_LENGTH_MISMATCH
    42.         jz  @B
    43.                
    44. _done:
    45.        
    46.         mov edi, lpSysInfo
    47.         assume  edi : ptr SYSTEM_HANDLE_INFORMATION_EX
    48.         mov ecx, [edi].NumberOfHandles      ; кол-во хендлов
    49.         add edi, 4
    50.  
    51.         assume  edi : ptr SYSTEM_HANDLE_INFORMATION
    52.         xor edx, edx
    53.  
    54.         .WHILE  (edx <= ecx)
    55.             mov eax, [edi].ProcessId
    56.            
    57.            
    58.            
    59.             inc edx
    60.             add edi, sizeof SYSTEM_HANDLE_INFORMATION
    61.         .ENDW
    62.        
    63.        
    64.         invoke  LocalFree, lpSysInfo
    65.         ret
    66. GetMutexData    endp
    я неправильно обрабатываю список, т.к. в
    Код (Text):
    1. mov eax, [edi].ProcessId
    после второго и далее вызовов в еах неправильные данные. никто не подскажет где ошибся?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sideX
    У этой структуры размер 16 байт:
    Код (Text):
    1. typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO {
    2.     USHORT UniqueProcessId;
    3.     USHORT CreatorBackTraceIndex;
    4.     UCHAR ObjectTypeIndex;
    5.     UCHAR HandleAttributes;
    6.     USHORT HandleValue;
    7.     PVOID Object;
    8.     ULONG GrantedAccess;
    9. } SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
     
  7. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    точно. спасибо. действительно в структуре Handle имеет тип WORD
     
  8. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    еще небольшой вопрос. SYSTEM_HANDLE_INFORMATION.ObjectTypeNumber для мьютекса всегда = 0Bh? для любой версии ОС?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sideX
    Вы что ответы не читаете ?
    Сказал ведь в #4.)
     
  10. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    вы будете смеяться, но я снова зашол в тупик.. делаю так:
    Код (Text):
    1. xor ebx, ebx
    2. mov bx, word ptr [edi].Handle
    3.                    
    4. xinvoke ZwQueryObject, ebx, 3, 0, 0, offset dwBytes
    5.                    
    6. .IF (eax == 0C0000004h)
    7.     invoke  LocalAlloc, LPTR, dwBytes
    8.     mov lpObjectName, eax
    9.                        
    10.     xinvoke ZwQueryObject, ebx, 3, lpObjectName, dwBytes, offset dwBytes
    11.                        
    12.     .IF (eax == 0)
    13.         push    edi
    14.                            
    15.         mov edi, lpObjectName
    16.         assume  edi : ptr OBJECT_ALL_INFORMATION
    17.         mov ecx, [edi].NumberOfObjectsTypes
    18.         add edi, 4
    19.         assume  edi : ptr OBJECT_TYPE_INFORMATION
    20.         xor edx, edx
    21.                            
    22.         .WHILE  (edx <= ecx)
    23.                                
    24.             lea eax, [edi]._Name
    25.             assume  eax : ptr UNICODE_STRING
    26.                                
    27.             mov esi, [eax].Buffer
    28.             invoke  MessageBoxW,0,esi,esi,0
    29.                                    
    30.             inc edx
    31.             add edi, sizeof OBJECT_TYPE_INFORMATION
    32.         .ENDW
    33.                            
    34.         pop edi
    35.     .ENDIF
    36.                        
    37.     invoke  LocalFree, lpObjectName
    38. .ENDIF
    в итоге в мессаджбоксе постоянно выводится слово Type
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sideX
    Както так:
    Код (Text):
    1. xCompareStringSensitiveInternal proc uses ebx UnicodeString:PUNICODE_STRING, AnsiString:PSTR, StringLength:ULONG
    2.     mov ebx,StringLength
    3.     mov edx,UnicodeString
    4.     lea eax,[ebx*2]
    5.     assume edx:PUNICODE_STRING
    6.     cmp [edx]._Length,ax
    7.     jne Exit
    8.     mov ecx,AnsiString
    9.     mov edx,[edx].Buffer
    10. @@:
    11.     movzx eax,byte ptr [ecx + ebx - 1]
    12.     cmp word ptr [edx + ebx*2 - 2],ax
    13.     jne Exit
    14.     dec ebx
    15.     jnz @b
    16.     xor eax,eax
    17. Exit:
    18.     ret
    19. xCompareStringSensitiveInternal endp
    20.  
    21. BASE_REGION_SIZE    equ 10000H
    22.  
    23. xQueryObject proc uses ebx esi edi ObjectTypeName:PSTR
    24. Local SystemInformation:PVOID, SystemInformationLength:ULONG
    25. Local ObjectTypeNameLength:ULONG
    26.     cld
    27.     xor eax,eax
    28.     mov ecx,MAX_PATH
    29.     mov edi,ObjectTypeName
    30.     repne scasb
    31.     mov SystemInformationLength,eax
    32.     not ecx
    33.     lea edx,SystemInformationLength
    34.     add ecx,MAX_PATH
    35.     mov SystemInformation,eax
    36.     mov ObjectTypeNameLength,ecx
    37.     invoke ZwQueryObject, Eax, ObjectAllTypesInformation, Eax, Eax, Edx
    38.     cmp eax,STATUS_INFO_LENGTH_MISMATCH
    39.     lea ecx,SystemInformationLength
    40.     lea edx,SystemInformation
    41.     .if !Zero?
    42. ; def. 224 bytes.
    43.     mov SystemInformationLength,PAGE_SIZE
    44.     .endif
    45.     invoke ZwAllocateVirtualMemory, NtCurrentProcess, Edx, 0, Ecx, MEM_COMMIT, PAGE_READWRITE
    46.     test eax,eax
    47.     jnz Exit
    48.     invoke ZwQueryObject, Eax, ObjectAllTypesInformation, SystemInformation, SystemInformationLength, Eax
    49.     test eax,eax
    50.     mov edi,SystemInformation
    51.     jnz Parse
    52.     mov esi,OBJECT_ALL_TYPES_INFORMATION.NumberOfTypes[edi]
    53.     mov ebx,esi
    54.     add edi,4
    55.     assume edi:POBJECT_TYPE_INFORMATION
    56. @@:
    57.     invoke xCompareStringSensitiveInternal, Edi, ObjectTypeName, ObjectTypeNameLength
    58.     movzx ecx,[edi].TypeName._Length
    59.     je Parse
    60.     and ecx,NOT(3)
    61.     mov edi,[edi].TypeName.Buffer
    62.     lea edi,[edi + ecx + 4]
    63.     dec esi
    64.     jnz @b
    65.     mov eax,STATUS_UNSUCCESSFUL
    66. Parse:
    67.     push eax
    68.     invoke ZwFreeVirtualMemory, NtCurrentProcess, addr SystemInformation, addr SystemInformationLength, MEM_RELEASE
    69.     sub ebx,esi ; ID
    70.     pop eax
    71.     mov esi,BASE_REGION_SIZE
    72.     test eax,eax
    73.     jnz Exit
    74.     inc ebx
    75. NextRegion:
    76.     mov SystemInformationLength,esi
    77.     mov SystemInformation,NULL
    78.     lea ecx,SystemInformationLength
    79.     lea edx,SystemInformation
    80.     invoke ZwAllocateVirtualMemory, NtCurrentProcess, Edx, 0, Ecx, MEM_COMMIT, PAGE_READWRITE
    81.     test eax,eax
    82.     jnz Exit
    83.     invoke ZwQuerySystemInformation, SystemHandleInformation, SystemInformation, SystemInformationLength, Eax
    84.     test eax,eax
    85.     jz ParseInfo
    86.     push eax
    87.     invoke ZwFreeVirtualMemory, NtCurrentProcess, addr SystemInformation, addr SystemInformationLength, MEM_RELEASE
    88.     pop eax
    89.     cmp eax,STATUS_INFO_LENGTH_MISMATCH
    90.     jnz Exit
    91.     add esi,BASE_REGION_SIZE
    92.     cmp esi,32*BASE_REGION_SIZE
    93.     jb NextRegion
    94.     jmp Exit
    95. ParseInfo:
    96.     mov esi,SystemInformation
    97. ;   mov ecx,fs:[TEB.Cid.UniqueProcess]
    98.     mov edi,dword ptr [esi]
    99.     add esi,4
    100. NextEntry:
    101.     assume esi:PSYSTEM_HANDLE_INFORMATION
    102. ;   cmp [esi].ProcessId,ecx ; CreatorBackTraceIndex = NULL(def.)
    103. ;   jne @f
    104.     cmp [esi].ObjectTypeNumber,bl
    105.     jne @f
    106.     ; ...
    107. @@:
    108.     add esi,sizeof(SYSTEM_HANDLE_INFORMATION)
    109.     dec edi
    110.     jnz NextEntry
    111.     mov eax,STATUS_NOT_FOUND
    112. ParseError:
    113.     push eax
    114.     invoke ZwFreeVirtualMemory, NtCurrentProcess, addr SystemInformation, addr SystemInformationLength, MEM_RELEASE
    115.     pop eax
    116. Exit:
    117.     ret
    118. xQueryObject endp
     
  12. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    пробовал также через OBJECT_NAME_INFORMATION. код:
    Код (Text):
    1. ...
    2. OBJECT_NAME_INFORMATION STRUCT
    3.         _Name   UNICODE_STRING <?>
    4. OBJECT_NAME_INFORMATION ENDS
    5. ...
    6.  
    7. xor ebx, ebx
    8. mov bx, word ptr [edi].Handle
    9.                    
    10.                    
    11. xinvoke ZwQueryObject, ebx, 3, 0, 0, offset dwBytes
    12.                    
    13. .IF (eax == 0C0000004h)
    14.     invoke  LocalAlloc, LPTR, dwBytes
    15.     mov lpObjectName, eax
    16.                        
    17.     xinvoke ZwQueryObject, ebx, 1, lpObjectName, dwBytes, offset dwBytes
    18.                        
    19.     .IF (eax == 0)
    20.         mov eax, lpObjectName
    21.         assume  eax : ptr OBJECT_NAME_INFORMATION
    22.         assume  eax : ptr UNICODE_STRING
    23.         lea esi, [eax].Buffer
    24.                                                                        
    25.         invoke  MessageBoxW,0,esi,esi,0
    26.                                                
    27.     .ENDIF             
    28.         invoke  LocalFree, lpObjectName
    29. .ENDIF
    30. ...
    в итоге выводит всякий мусор..
     
  13. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    а, не. это я там затупил. сделал:
    Код (Text):
    1. mov esi, [eax].Buffer
    сейчас выводится нормально. правда выводятся не все почемуто. при обработке некоторых элементов в esi оказывается 0, хотя Process Explorer показывает что нужный мне хендл имеет имя (это конкретный мьютекс на котором тестирую). почему так происходит - не могу понять
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sideX
    Апи не сохраняют регистры Ecx и Edx.
     
  15. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    эти регистры я сохраняю перед вызовом 1-ой ZwQueryObject. просто сюда основные моменты привожу
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кстате у вас будут траблы в выравниванием имён. Используйте способ как у меня:
    Код (Text):
    1.     movzx ecx,[edi].TypeName._Length
    2.     and ecx,NOT(3)
    3.     mov edi,[edi].TypeName.Buffer
    4.     lea edi,[edi + ecx + 4]
     
  17. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    ок. спасибо. приму на заметку
     
  18. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    вобщем все получилось. если кому интересно:
    Код (Text):
    1. ;################################################################################################################
    2. ; FindMutexByPID - поиск полного имени мьютекса указанного процесса по имени или его части
    3. ;   IN: dwPID       - ID процесса
    4. ;       szMutexName - имя мьютекса или его часть
    5. ;       lpOutMutex  - буфер для полного имени мьютекса
    6. ;   OUT:    возвращает длину имени мьютекса или 0 в случае неудачи
    7. ;################################################################################################################
    8. FindMutexByPID  proc uses edi dwPID, szMutexName, lpOutMutex : DWORD
    9.         LOCAL   lpSysInfo    : DWORD
    10.         LOCAL   lpObjectName : DWORD
    11.         LOCAL   hProcess     : DWORD
    12.         LOCAL   hDuplicate   : DWORD
    13.  
    14.         xor ebx, ebx
    15.  
    16.         xinvoke OpenProcess, PROCESS_DUP_HANDLE, 0, dwPID
    17.         test    eax, eax
    18.         jz  _return
    19.         mov hProcess, eax
    20.  
    21.         mov lpSysInfo, 0
    22.        
    23.         xinvoke ZwQuerySystemInformation, 16, 0, 0, offset dwBytes
    24.         cmp eax, 0C0000004h ; STATUS_INFO_LENGTH_MISMATCH
    25.         jnz _enum_handles
    26.        
    27. @@:
    28.         add dwBytes, 1000h
    29.        
    30.         .IF (lpSysInfo != 0)
    31.             invoke  LocalFree, lpSysInfo
    32.         .ENDIF
    33.            
    34.         invoke  LocalAlloc, LPTR, dwBytes
    35.         mov lpSysInfo, eax
    36.        
    37.         xinvoke ZwQuerySystemInformation, 16, lpSysInfo, dwBytes, 0
    38.         cmp eax, 0C0000004h ; STATUS_INFO_LENGTH_MISMATCH
    39.         jz  @B
    40.                
    41. _enum_handles:
    42.         mov edi, lpSysInfo
    43.         assume  edi : ptr SYSTEM_HANDLE_INFORMATION_EX
    44.         mov ecx, [edi].NumberOfHandles      ; кол-во хендлов
    45.         add edi, 4
    46.  
    47.         assume  edi : ptr SYSTEM_HANDLE_INFORMATION
    48.         xor edx, edx
    49.  
    50.         .WHILE  (edx <= ecx)
    51.             mov eax, [edi].ProcessId
    52.                
    53.             .IF (eax == dwPID)
    54.                 push    edx
    55.                 push    ecx
    56.                 push    edi
    57.            
    58.                 xor ebx, ebx
    59.                 mov bx, word ptr [edi].Handle
    60.  
    61.                 lea eax, hDuplicate
    62.                 xinvoke ZwDuplicateObject, hProcess, ebx, 0FFFFFFFFh, eax, 0, 0, 0
    63.                
    64.                 .IF (eax == 0)
    65.                     xinvoke ZwQueryObject, hDuplicate, 1, 0, 0, offset dwBytes
    66.                    
    67.                     .IF (eax == 0C0000004h)
    68.                         invoke  LocalAlloc, LPTR, dwBytes
    69.                         mov lpObjectName, eax
    70.                        
    71.                         xinvoke ZwQueryObject, hDuplicate, 1, lpObjectName, dwBytes, offset dwBytes
    72.                        
    73.                         .IF (eax == 0)
    74.                             mov eax, lpObjectName
    75.                             assume  eax : ptr OBJECT_NAME_INFORMATION
    76.                             assume  eax : ptr UNICODE_STRING
    77.                             mov esi, [eax].Buffer
    78.                            
    79.                             .IF (esi != 0)
    80.                                 mov edi, lpOutMutex
    81.                             @@:
    82.                                 lodsw
    83.                                 test    ax, ax
    84.                                 jz  @F
    85.                                 stosb
    86.                                 loop    @B
    87.                             @@:
    88.                                 stosb
    89.                            
    90.                                 invoke  StringPos, 0, lpOutMutex, szMutexName
    91.                                 inc eax
    92.                                
    93.                                 .IF (eax != 0)
    94.                                     invoke  StrLength, lpOutMutex
    95.                                     xchg    ebx, eax
    96.                                     jmp _done
    97.                                 .ENDIF
    98.                        
    99.                             .ENDIF
    100.                            
    101.                         .ENDIF
    102.                    
    103.                         invoke  LocalFree, lpObjectName
    104.                     .ENDIF
    105.                
    106.                     invoke  CloseHandle, hDuplicate
    107.                 .ENDIF
    108.    
    109.                 pop edi
    110.                 pop ecx
    111.                 pop edx
    112.             .ENDIF
    113.            
    114.             inc edx
    115.             add edi, 16
    116.         .ENDW
    117.        
    118.         xor ebx, ebx
    119.        
    120. _done:
    121.         invoke  LocalFree, lpSysInfo
    122.         invoke  CloseHandle, hProcess
    123. _return:
    124.         xchg    ebx, eax
    125.         ret
    126. FindMutexByPID  endp
     
  19. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    при преобразовании WideString -> AnsiString лучше сделать так:
    Код (Text):
    1. ...
    2. assume  eax : ptr UNICODE_STRING
    3. mov esi, [eax].Buffer    ; строка
    4. ...
    5. xor ecx, ecx
    6. mov cx, word ptr [eax]
    7. shr ecx, 1                   ; размер / 2
    8.  
    9. mov edi, lpOutMutex
    10. @@:
    11. lodsw
    12. stosb
    13. loop    @B
    14. xchg    al, ah       ; завершающий 0
    15. stosb
     
  20. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Clerk
    Код (Text):
    1.     movzx ecx,[edi].TypeName._Length
    2.     and ecx,NOT(3)
    3.     mov edi,[edi].TypeName.Buffer
    4.     lea edi,[edi + ecx + 4]
    Формально этот код содержит баг. Необходимыми условиями для верной отработки становятся выравненность значения TypeName.Buffer на 4 и нуль-терминированность строки ровно одним символом. Окей, может быть эти условия и выполняются всегда, но при чтении кода возникает диссонанс.