Удалить чужой mutex

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by EEjester, 18 Jan 2016.

  1. EEjester

    EEjester Banned

    Joined:
    15 May 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Код реализации: Delphi.
    Есть сторонний процесс который создает mutex. Мне требуется его удалить программно.
    Рассматривается вариант как с инжектом так и без.
    Сразу говорю, вот что пробовал:
    http://www.delphisources.ru/forum/showthread.php?t=28172
    http://www.cyberforum.ru/delphi-beginners/thread1639687.html
    и все возможные исходники что находил в интернете (включая забугор) тоже пробовал.

    Ничего не заработало! На вас одна надежда, господа.
     
  2. EEjester

    EEjester Banned

    Joined:
    15 May 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Господа... похоже надежды больше нет.
     
  3. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Инжекти свой код в процесс и выполняй ReleaseMutex. В гугле инфы по инжектам туева хуча.
     
  4. neviens

    neviens Member

    Joined:
    9 Oct 2013
    Messages:
    82
    Likes Received:
    28
    Reputations:
    3
    Это не сработает, мутекс удаляется из системы, только когда закрывается последний хендл к нему.

    Если не смущает C код, ниже рабочий пример (с закрытием из другого процесса):
    Code:
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <psapi.h>
    #include <TlHelp32.h>
    #include <Subauth.h>
    
    #ifndef _WIN64
     #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\i386\\ntdll.lib")
     int __stdcall NtQuerySystemInformation(unsigned long, void*, unsigned long, unsigned long*);
     int __stdcall NtQueryObject(HANDLE, unsigned long, void*, unsigned long, unsigned long*);
    #else
     #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\amd64\\ntdll.lib")
    #endif
    
    #define SystemExtendedHandleInformation 64
    #define ObjectNameInformation 1
    #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004
    
    #define MUTEX_TO_CLOSE L"MySuperPuperMutex705519"
    #define PROC_NAME "host.exe"
    
    typedef struct {
       PVOID Object;
       HANDLE UniqueProcessId;
       HANDLE HandleValue;
       ULONG GrantedAccess;
       USHORT CreatorBackTraceIndex;
       USHORT ObjectTypeIndex;
       ULONG HandleAttributes;
       ULONG Reserved;
    } SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX;
    
    typedef struct {
       ULONG_PTR HandleCount;
       ULONG_PTR Reserved;
       SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1];
    } SYSTEM_HANDLE_INFORMATION_EX;
    
    ///////////////////////////////////////////////////////////
    DWORD GetProcessIdByName(char* procName)
    {
       DWORD id = 0;
       HANDLE h;
       PROCESSENTRY32 pe;
    
       h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       pe.dwSize = sizeof(pe);
       Process32First(h, &pe);
       do {
         if(!strcmp(pe.szExeFile, procName))
         {
           id = pe.th32ProcessID;
           break;
         }
       } while(Process32Next(h, &pe));
       CloseHandle(h);
       return id;
    }
    
    ///////////////////////////////////////////////////////////
    int main()
    {
       HANDLE h, hRemote, hLocal;
       DWORD id, i, len, tmp;
       char buf[0x800], fub[0x400];
       SYSTEM_HANDLE_INFORMATION_EX* mem;
       UNICODE_STRING* pObjName = (UNICODE_STRING*)buf;
       PWSTR uPtr;
    
       id = GetProcessIdByName(PROC_NAME);
       if(!id)
         return -1;
       
       hRemote = OpenProcess(PROCESS_DUP_HANDLE, 0, id);
       if(!hRemote)
         return -1;
    
       len = 0x10000;
       mem = (SYSTEM_HANDLE_INFORMATION_EX*)malloc(len);
       for(;;)
       {
         i = NtQuerySystemInformation(SystemExtendedHandleInformation, mem, len, &tmp);
         if(!i)
           break;
         if(i != STATUS_INFO_LENGTH_MISMATCH)
         {
           free(mem);
           return -1;
         }
         mem = (SYSTEM_HANDLE_INFORMATION_EX*)realloc(mem, len *= 2);
       }
    
       for(i = 0; i < mem->HandleCount; ++i)
       {
         if(mem->Handles[i].UniqueProcessId == (HANDLE)id)
         {
           if(DuplicateHandle(hRemote, mem->Handles[i].HandleValue, GetCurrentProcess(), &hLocal, 0, 0, 0))
           {
             NtQueryObject(hLocal, ObjectNameInformation, buf, sizeof(buf), &tmp);
    
             if(pObjName->Length)
             {
               WideCharToMultiByte(CP_ACP, 0, pObjName->Buffer, pObjName->MaximumLength, fub, sizeof(fub), NULL, NULL);
               puts(fub);
               
               uPtr = pObjName->Buffer + pObjName->Length / 2;
               while(uPtr > pObjName->Buffer && *uPtr != '\\')
                 --uPtr;
                 
               if(!lstrcmpW(uPtr + 1, MUTEX_TO_CLOSE))
               {
                 hLocal = 0;
                 DuplicateHandle(hRemote, mem->Handles[i].HandleValue, GetCurrentProcess(), &hLocal, 0, 0, DUPLICATE_CLOSE_SOURCE);
                 if(hLocal)
                   CloseHandle(hLocal);
               }
             }
           }
         }
       }
    
       free(mem);
    }
    
     
  5. EEjester

    EEjester Banned

    Joined:
    15 May 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Спасибо огромное! Но пример на С на просторах интернета я уже находил, мне бы на delphi...
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    EEjester, транслировать конкретно этот сишный код на delphi дело 5 минут, чтобы из этого:
    Code:
    #ifndef _WIN64
    #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\i386\\ntdll.lib")
    int __stdcall NtQuerySystemInformation(unsigned long, void*, unsigned long, unsigned long*);
    int __stdcall NtQueryObject(HANDLE, unsigned long, void*, unsigned long, unsigned long*);
    #else
    #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\amd64\\ntdll.lib")
    #endif
    #define SystemExtendedHandleInformation 64
    #define ObjectNameInformation 1
    #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004
    typedef struct {
       ULONG_PTR HandleCount;
       ULONG_PTR Reserved;
       SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1];
    } SYSTEM_HANDLE_INFORMATION_EX;
    
    получить это:
    Code:
    const
      NTDLL = 'ntdll.dll';
      STATUS_SUCCESS = NT_STATUS($00000000);
      STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
      ObjectNameInformation = 1;
      SystemExtendedHandleInformation = 64;
    type
      PSystemHandleInformationEx = ^TSystemHandleInformationEx;
      _SYSTEM_HANDLE_INFORMATION_EX = packed record
        NumberOfHandles: DWORD;
        Reserved: DWORD;
        Information: array [0..0] of TSystemHandleInformation;
      end;
      {$EXTERNALSYM _SYSTEM_HANDLE_INFORMATION_EX}
      TSystemHandleInformationEx = _SYSTEM_HANDLE_INFORMATION_EX;
      SYSTEM_HANDLE_INFORMATION_EX = _SYSTEM_HANDLE_INFORMATION_EX;
      {$EXTERNALSYM SYSTEM_HANDLE_INFORMATION_EX}
    
    function NtQuerySystemInformation(ASystemInformationClass: DWORD; ASystemInformation: Pointer;
    ASystemInformationLength: DWORD; AReturnLength:PCardinal): NT_STATUS; stdcall;external NTDLL;
    function NtQueryObject(ObjectHandle: THandle; ObjectInformationClass: DWORD; ObjectInformation: Pointer;
    ObjectInformationLength: ULONG; ReturnLength: PDWORD): NT_STATUS; stdcall; external NTDLL;
    
    но видимо вам так сильно надо XD