6

Próbuję napisać BHO dla Internet Explorer 11 (Windows 8.1). Moja BHO realizuje piaskownicy AppContainer, ale nie wydaje się utworzenie nazwanego potoku, CreateNamedPipe nie powiedzie się z tej wiadomości: Access is denied.Czy istnieje sposób utworzenia nazwanego potoku z elementu AppContainer BHO na IE11?

Oto kod używam, aby utworzyć nazwany potok (który znalazłem na russian website , ostatni komentarz:...

 
     LPCWSTR LOW_INTEGRITY_SDDL_SACL_W = L"S:(ML;;NW;;;LW)D:(A;;0x120083;;;WD)(A;;0x120083;;;AC)"; 

     PSECURITY_DESCRIPTOR pSD = NULL; 
     ConvertStringSecurityDescriptorToSecurityDescriptorW (
      LOW_INTEGRITY_SDDL_SACL_W, 
      SDDL_REVISION_1, 
      &pSD, 
      NULL); 

     if (pSD != NULL) 
     { 
      SECURITY_ATTRIBUTES SecurityAttributes; 

      SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); 
      SecurityAttributes.bInheritHandle = TRUE; 
      SecurityAttributes.lpSecurityDescriptor = pSD; 

      HANDLE hPipe = CreateNamedPipe(
       L"\\\\.\\pipe\\testpipe", 
       PIPE_ACCESS_DUPLEX,      
       PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 
       1,         
       4096,     
       4096,        
       1000, 
       &SecurityAttributes);   

     } 

Niestety, to nie działa GetLastError() zwraca ten Access is denied jak zwykle

+0

Czy to nie działa z żadną zakładką? Czy możesz sprawdzić za pomocą karty w trybie niechronionym? – Andrey

+0

Tak, działa dobrze, gdy EPM jest wyłączony. (Działa poprawnie w trybie chronionym, co nie działa w trybie Enhanced Protected). – pyrho

+0

Wygląda na to, że można [użyć rur w appContainer] (http://stackoverflow.com/questions/7706660/windows-8-named-pipe-creation). Ale czy mógłbyś spróbować S: (ML ;; NW ;;; RC) D: (A ;, 0x120083 ;;; WD) (A ;; 0x120083 ;;; AC)? – Andrey

Odpowiedz

8

nie można utworzyć nazwany potok w BHO Ale można go utworzyć w swoim procesie brokera i podłączyć do rury od BHO. Jestem autorem spiczastego komentarza i przetestowałem kod w części brokera mojego dodatku do IE.

Fragmenty kodu. tworzenie rura w auto-rozpoczął exe (Delphi)

function CreateAppContainerSecurityDescriptor(var SD: PSECURITY_DESCRIPTOR): boolean; 
const 
    SDDL_REVISION_1 = 1; 
var 
    pSD: PSECURITY_DESCRIPTOR; 
    ConvertStringSecurityDescriptorToSecurityDescriptor: TConvertStringSecurityDescriptorToSecurityDescriptorW; 
begin 
    @ConvertStringSecurityDescriptorToSecurityDescriptor := GetProcAddress(AdvapiDll(), 
    'ConvertStringSecurityDescriptorToSecurityDescriptorW'); 
    result := false; 
    if ConvertStringSecurityDescriptorToSecurityDescriptor('S:(ML;;NW;;;LW)D:(A;;0x120083;;;WD)(A;;0x120083;;;AC)', 
    SDDL_REVISION_1, pSD, nil) then begin 
    SD := pSD; 
    result := true; 
    end; 
end; 

function TPipeServer.Start: boolean; 
var 
    SD: PSECURITY_DESCRIPTOR; 
    SecurityAttributes: SECURITY_ATTRIBUTES; 
begin 
    result := false; 
    if Win32MajorVersion >= 6 then begin 
    if CreateAppContainerSecurityDescriptor(SD) then begin 
     SecurityAttributes.nLength := sizeof(SECURITY_ATTRIBUTES); 
     SecurityAttributes.bInheritHandle := true; 
     SecurityAttributes.lpSecurityDescriptor := SD; 

     PipeHandle := CreateNamedPipe('\\.\pipe\MyPipe', PIPE_ACCESS_DUPLEX, 
     PIPE_TYPE_BYTE or PIPE_READMODE_BYTE, 1, 0, 0, 1000, @SecurityAttributes); 
     result := PipeHandle <> INVALID_HANDLE_VALUE; 
    end; 
    end; 
end; 

procedure TPipeServer.Execute; 
begin 
    if Start() then begin 
    while true do begin 
     if ConnectNamedPipe(PipeHandle, nil) then begin 
     ... 
     end; 
    end; 
    end; 
end; 

Łączenie rury w IE pasku (C++)

#define PIPE_NAME "\\\\.\\pipe\\MYPipe" 

LRESULT CMFToolbar::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
... 
    HANDLE PipeHandle; 
    if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) != 0) { 
     PipeHandle = CreateFile(PIPE_NAME, FILE_READ_DATA | FILE_WRITE_DATA, 
      0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
     if (PipeHandle != INVALID_HANDLE_VALUE) { 
      WriteFile(PipeHandle, ... 
      CloseHandle(PipeHandle); 
     } 

} 
+0

Dzięki za odpowiadając, ale nie mogłem użyć twojego kodu, nadal otrzymuję odmowę dostępu, gdy próbuję połączyć się z rurą z BHO. Ale kod w rosyjskim artykule działa poprawnie! – pyrho

+0

co masz na myśli, że kod z artykułu działa? Masz problem z utworzeniem rury? LUB połączyć się z rurą z drugiej instancji BHO? – Andrey

+0

Dodałem fragmenty serwera i klienta z mojego obrobionego kodu – anfilat

0

można dodać jako gość ALL_APPLICATION_PACKAGE do uchwytu, ale to backdoor rozwiązania, rozwiązanie brokera jest długoterminowe.

DWORD WindowsSecurity::AddDACLToObject(HANDLE hObj,SE_OBJECT_TYPE seObjectType) { 
LPWSTR szAddSid = SID_ALL_APP_PACKAGES; 

PACL pACL = NULL; 
DWORD dwRes; 
PSID pSIDAllAppPackage = NULL; 

PSECURITY_DESCRIPTOR pSDOld = NULL; 
PACL pOldDACL = NULL; 
dwRes = GetSecurityInfo(hObj, seObjectType, 
    DACL_SECURITY_INFORMATION, 
    NULL, NULL, &pOldDACL, NULL, &pSDOld); 
if (ERROR_SUCCESS != dwRes) { 
    return dwRes; 
} 

if(ConvertStringSidToSid(szAddSid,&pSIDAllAppPackage) == FALSE) { 
    dwRes = GetLastError(); 
    return dwRes; 
} 

const int NUM_ACES = 1; 
EXPLICIT_ACCESS ea[NUM_ACES]; 
ZeroMemory(&ea, NUM_ACES * sizeof(EXPLICIT_ACCESS)); 

ea[0].grfAccessPermissions = GENERIC_ALL; 
ea[0].grfAccessMode = SET_ACCESS; 
ea[0].grfInheritance = NO_INHERITANCE; 
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; 
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP; 
ea[0].Trustee.ptstrName = (LPTSTR)pSIDAllAppPackage; 

dwRes = SetEntriesInAcl(NUM_ACES, ea, pOldDACL, &pACL); 
if (ERROR_SUCCESS != dwRes) { 
    return dwRes; 
} 

dwRes = SetSecurityInfo(
    hObj,     // name of the object 
    seObjectType,    // type of object 
    DACL_SECURITY_INFORMATION, // change only the object's DACL 
    NULL, NULL,     // do not change owner or group 
    pACL,      // DACL specified 
    NULL);      // do not change SACL 
return dwRes; 

}

0

Znalazłem to pytanie bardzo przydatne i chciałem dodać w moim 2 centów na podstawie mojego doświadczenia z niedawnej modernizacji EPM jest kompatybilne BHO w złożonym produktem. Upuszczenie niektórych informacji, które mają nadzieję, pomoże społeczności. Mój oryginalny pytanie zostało wysłane tutaj, więc część z nich jest powtórzeniem tam moje komentarze - Accessing named pipe servers from within IE EPM BHO

potrzebowałem jakiś sposób, aby osiągnąć 2-way communication -

  1. Od BHO do usługi Windows, które odbyło się niektóre istotne dane: powyższy deskryptor zabezpieczeń nie zadziała, ponieważ IPC sesji między sesjami nie działa. Próbowałem ustawić nazwane potoki, aby umożliwić również KAŻDEGO.

    • Rozwiązał to, dodając brokera do przekazywania komunikacji.
  2. Od zewnątrz BHO: To było zapewnienie BHO niektóre dane, aby wykonać działania - manipulacji DOM itp opcji Standardowy IPC - nazwanych potoków, Windows RPC itd. Nie będą działać, ponieważ nie może obsługiwać BHO nazwany na przykład serwery rur dla dostępu zewnętrznego.

    • Rozwiązano, tworząc okno HWND_MESSAGE w funkcji SetSite i wywołując do niego z procesu Broker przy użyciu SendMessage. Typ wiadomości musi być WM_COPYDATA, ponieważ jest to proces krzyżowy.
Powiązane problemy