6

Tôi đang cố viết BHO cho Internet Explorer 11 (Windows 8.1). BHO của tôi thực hiện sandbox AppContainer, nhưng tôi dường như không thể tạo ra một ống tên, CreateNamedPipe không thành công với thông điệp rằng: Access is denied.Có cách nào để tạo một đường ống có tên từ AppContainer BHO trên IE11 không?

Dưới đây là đoạn code tôi đang sử dụng để tạo ra các đường ống đặt tên (mà tôi tìm thấy trên một russian website , bình luận cuối cùng:...

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

     } 

Thật không may, nó không hoạt động GetLastError() trả về Access is denied này như thường lệ

+0

Ứng dụng có hoạt động với bất kỳ tab nào không? Bạn có thể kiểm tra bằng tab ở chế độ không được bảo vệ không? – Andrey

+0

Có hoạt động tốt khi EPM tắt. (Trong các tác phẩm OK ở chế độ được bảo vệ, những gì không hoạt động trong Chế độ bảo vệ nâng cao). – pyrho

+0

Có vẻ như có thể [sử dụng đường ống trong appContainer] (http://stackoverflow.com/questions/7706660/windows-8-named-pipe-creation). Nhưng bạn có thể thử S: (ML ;; NW ;;; RC) D: (A ;; 0x120083 ;;; WD) (A ;; 0x120083 ;; AC)? – Andrey

Trả lời

8

bạn không thể tạo Named Pipe trong BHO Nhưng bạn có thể tạo ra nó trong quá trình môi giới của bạn và kết nối với đường ống từ BHO. Tôi là tác giả của nhận xét được chỉ ra và tôi đã thử nghiệm mã trong phần môi giới của trình bổ sung IE của tôi.

Đoạn mã. Ống tạo ra trong exe tự động bắt đầu (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; 

Kết nối đường ống trong IE trên thanh công cụ (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

trả lời, nhưng tôi không thể sử dụng mã của bạn, tôi vẫn nhận được quyền truy cập bị từ chối khi cố gắng kết nối với đường ống từ BHO. Nhưng mã trong bài viết tiếng Nga hoạt động ok! – pyrho

+0

bạn có ý nghĩa gì khi mã hoạt động? Bạn có vấn đề gì để tạo đường ống không? HOẶC để kết nối với đường ống tạo thành thể hiện BHO khác? – Andrey

+0

Tôi đã thêm đoạn mã máy chủ và máy khách từ mã đã làm việc của mình – anfilat

0

bạn có thể thêm các phép ALL_APPLICATION_PACKAGE để xử lý, nhưng đó là một giải pháp backdoor, các giải pháp môi giới là dài hạn.

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

Tôi tìm thấy câu hỏi này rất hữu ích và muốn thêm vào 2 cent của tôi dựa trên kinh nghiệm gần đây của tôi với Retrofitting một BHO EPM-tương thích trong một sản phẩm phức tạp. Thả một số thông tin ở đây mà hy vọng sẽ giúp cộng đồng. câu hỏi ban đầu của tôi đã được đăng ở đây, vì vậy một số của nó là một sự lặp lại ý kiến ​​của tôi ở đó - Accessing named pipe servers from within IE EPM BHO

tôi cần một số cách để đạt được kết nối 2 chiều -

  1. Từ BHO lên một Dịch vụ Windows mà tổ chức một số dữ liệu liên quan: Bộ mô tả bảo mật ở trên sẽ không hoạt động vì IPC phiên giao dịch dường như không hoạt động. Tôi đã thử thiết lập các đường ống được đặt tên để cho phép MỌI NGƯỜI.

    • Giải quyết bằng cách thêm người môi giới để chuyển tiếp liên lạc.
  2. Từ bên ngoài tới BHO: Điều này nhằm cung cấp cho BHO một số dữ liệu để thực hiện hành động - Thao tác DOM. Các tùy chọn IPC chuẩn - tên có tên, Windows RPC vv sẽ không hoạt động vì BHO không thể lưu trữ tên máy chủ đường ống để truy cập bên ngoài, trông giống như.

    • Giải quyết bằng cách tạo cửa sổ HWND_MESSAGE trong hàm SetSite và gọi đến từ quy trình Môi giới bằng cách sử dụng SendMessage. Loại thư được sử dụng cần phải là WM_COPYDATA vì đây là quá trình chéo.
Các vấn đề liên quan