6

我正在嘗試爲Internet Explorer 11(Windows 8.1)編寫一個BHO。 我的BHO實現AppContainer沙箱,但我似乎無法創建命名管道,CreateNamedPipe失敗,該消息:Access is denied.有沒有辦法從IE11上的AppContainer BHO創建一個命名管道?

下面是我使用創建命名管道(我在russian website找到的代碼,最後的評論:。

 
     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);   

     } 

不幸的是,這是行不通的GetLastError()返回此Access is denied像往常一樣

+0

它不適用於任何選項卡嗎?你可以檢查在非保護模式下的標籤嗎? – Andrey

+0

是的,它在EPM關閉時正常工作。 (在保護模式下工作正常,在增強保護模式下不起作用)。 – pyrho

+0

看起來有可能[在appContainer中使用管道](http://stackoverflow.com/questions/7706660/windows-8-named-pipe-creation)。但是你可以試試S:(ML ;; NW ;;; RC)D:(A ;; 0x120083 ;;; WD)(A ;; 0x120083 ;;; AC)? – Andrey

回答

8

在BHO無法創建命名管道,但您可以在代理進程創建和連接到來自BHO的管道 我是有針對性的評論的作者,我在我的IE插件的經紀人部分測試了代碼。

代碼片段。在自動啓動的EXE管道創建(德爾福)

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; 

連接管道在IE工具欄(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

感謝回覆,但我無法使用您的代碼,但在嘗試從BHO連接到管道時仍然拒絕訪問。 但在俄羅斯文章中的代碼工作正常! – pyrho

+0

你是什麼意思的文章代碼作品?你有問題來創建管道?或者連接到另一個BHO實例的管道? – Andrey

+0

我從我工作的代碼中添加了服務器和客戶端代碼片段 – anfilat

0

您可以將ALL_APPLICATION_PACKAGE權限添加到手柄,但它是一個後門程序的解決方案,經紀人解決方案是長期的。

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

我發現這個問題是非常有用的,想根據我最近在一個複雜的產品改造的EPM兼容BHO經驗,在我的2美分的補充。在此放置一些信息,希望能夠幫助社區。我原來的問題被張貼在這裏,所以它的一些是我的意見有沒有重複 - Accessing named pipe servers from within IE EPM BHO

我需要一些方法來實現雙向通信 -

  1. 從BHO到舉辦一個Windows服務一些相關的數據:上面的安全描述符不起作用,因爲跨會話IPC似乎不起作用。我嘗試設置命名管道以允許每個人。

    • 通過添加代理來中繼通信來解決它。
  2. 從外部到BHO:這是提供BHO一些數據來執行操作 - DOM操作等標準IPC選項 - 命名管道的Windows RPC等,將無法工作,因爲BHO不能承載命名用於外部訪問的管道服務器,看起來像。

    • 通過在SetSite函數中創建一個HWND_MESSAGE窗口並使用SendMessage從Broker進程調用它來解決此問題。使用的消息類型需要是WM_COPYDATA,因爲這是跨進程。
相關問題