1

BHO에서 IE EPM을 지원하기 위해 기존 제품을 일부 변경하려고합니다. 나는 그것을로드하고 다양한 메소드 - SetSite, DocumentComplete 등을 가져올 수 있었다 - 호출된다.IE EPM BHO 내에서 명명 된 파이프 서버에 액세스

Windows 서비스 내에서 실행되는 명명 된 파이프 서버에 연결하려고 할 때 걸리는 것으로 보입니다.

이전에는 보호 모드의 IE BHO가 LOW_INTEGRITY_SDDL_SACL ("S : (ML ;; NW ;;; LW)")을 사용하여 명명 된 파이프 서버에 액세스 할 수 있도록 변경했습니다. 코드 내에서 ConvertStringSecurityDescriptorToSecurityDescriptor 메서드를 사용하여 보안 설명자를 만든 다음 실제 SD 또는 SECURITY_ATTRIBUTES 개체에서 SetSecurityDescriptorSacl을 수행했습니다. 이로써 BHO 코드는 SYSTEM 서비스에서 호스팅되는 명명 된 파이프 서버에 액세스 할 수있었습니다.

나는 몇 가지 기사를 언급하고 아마도 가장 유용한 일이 게시물이었다 - 지금 보이는 있도록

Is there a way to create a named pipe from an AppContainer BHO on IE11? 내가 SDDL을 일부 변경했다처럼 - 이것은 기본적으로 전체 파일 액세스를 제공

#define EPM_INTEGRITY_SDDL L"S:(ML;;NW;;;LW)D:(A;;FA;;;SY)(A;;FA;;;WD)(A;;FA;;;AC)" 

DACL 부분에있는 모든 응용 프로그램 패키지 및 시스템을 모든 사람에게 보냅니다. 나는 그것이 너무 관대하다는 것을 알고 있지만 SetSecurityDescriptorDacl을 사용한 후에는 이것이 적어도 작동해야한다고 생각했습니다 :-)

어쨌든 SD를 설정하는 코드는 다음과 같습니다. 내가 여기서 뭔가를 놓치고 있니?

if (!ConvertStringSecurityDescriptorToSecurityDescriptor(EPM_INTEGRITY_SDDL, SDDL_REVISION_1, &pLISD, NULL)) 
{ 
    OutputDebugString(L"Unable to get the app-container integrity security descriptor"); 
    return false; 
} 

PACL pAcl = 0; 
BOOL bAclPresent = FALSE; 
BOOL bAclDefaulted = FALSE;    
if (!GetSecurityDescriptorSacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent) 
{ 
    return false; 
} 

if (!SetSecurityDescriptorSacl(pSecurityDesc, TRUE, pAcl, FALSE)) 
{ 
    return false; 
} 

pAcl = 0; 
bAclPresent = FALSE; 
bAclDefaulted = FALSE; 
if (!GetSecurityDescriptorDacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent) 
{ 
    OutputDebugString(L"Setting to low integrity : No DACL Available"); 
      return false; 
} 

if (!SetSecurityDescriptorDacl(pSecurityDesc, TRUE, pAcl, FALSE)) 
{ 
    OutputDebugString(L"Setting to low integrity : Unable to set the DACL"); 
    return false; 
} 
+0

좋은 'EPM_INTEGRITY_SDDL'에 대해 매우 감사드립니다. 매력처럼 작동하고 Windows 11의 IE11에서 EPM 모드로 실행되는 BHO는 일반 데스크톱 프로세스에서 생성 된 일부 공유 메모리를 열 수 있습니다. 그래, 나도 알아, 그 방법 (일명 "거대한 뒷문")가 아니지만, 나는 언젠가 브로커 경로를 갈 것입니다 ... – manuell

+0

건배! 내가 알기에, 일반 데스크탑 프로세스는 당신의 "브로커"입니다. 내 경우에는 브로커 프로세스로 Windows 서비스 (세션 0에서 실행)를 만들려고했지만 SDDL을 사용한 경우에도 세션 간 요청은 작동하지 않습니다. 아래의 솔루션은 양방향 통신을 처리하는 방법을 알려줍니다. – Vivek

답변

1

나는 약간의 연구를 수행하여 작동하는 접근법을 알아 냈습니다.

처음에는 AppContainer 내부의 BHO가 자체 세션 이외의 Windows 세션에서 생성 된 명명 된 파이프 등을 액세스 할 수없는 것으로 보입니다. Windows Service에서 명명 된 파이프 서버를 만들었으므로 지정한 보안 설명자가 중요하지 않습니다. 그것은 작동하지 않습니다.

둘째, 중간 무결성 브로커 프로세스를 사용하여 동일한 시도한 SD로 명명 된 파이프를 만들면 액세스 할 수 있습니다. 그래서 내가 취한 접근법은 Windows 서비스에이 메시지를 전달하는 BHO에 대한 프록시를 만드는 것이 었습니다. 그래서, "서버"논리는 움직일 필요가 없었습니다.

나는이 코드를 완전히 재 작성하지 않고도 JS 기반 확장을 위해이 코드를 재사용 할 수 있기 때문에 접근 방식에 감동하지는 않지만 너무 좋지 않다.

셋째, 외부 자극에 따라 행동을 취하도록 BHO에 요청하는 방법이 필요했습니다. BHO의 SetSite에 HWND_MESSAGE 창을 만들고 브로커 프로세스의 SendMessage를 사용하여이 작업을 수행했습니다. 이것은 교차 프로세스이기 때문에 WM_COPYDATA를 사용해야합니다.