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サービスでホストされている名前付きパイプサーバーにアクセスできました。

私はおそらくいくつかの記事と最も有用な1本のポストだったと呼ば - これは基本的に完全なファイルへのアクセスを提供します

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

からIs there a way to create a named pipe from an AppContainer BHO on IE11?

それが今のように見えるので、私はSDDLにいくつかの変更を行いました全員に、すべてのアプリケーションパッケージと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 10のIE11でEPMモードで動作するBHOは、通常のデスクトッププロセスで作成された共有メモリを開くことができます。はい、私は知っている、それは行く方法ではない(別名 "巨大なバックドア")が、私はいつかブローカーのルートに行くでしょう... – manuell

+0

乾杯!私が理解しているように、通常のデスクトッププロセスはあなたの "ブローカー"です。私の場合、ブローカプロセスとしてWindowsサービス(セッション0で実行中)を作成しようとしていましたが、SDDLを使用してもセッション間要求は機能しません。以下の解決策は、双方向のコミュニケーションをどう扱うかを教えてくれます。 – Vivek

答えて

1

私はいくつかの研究を行い、効果的なアプローチを見つけ出すことができました。

まず、AppContainer内のBHOは、自身以外のWindowsセッションで作成された名前付きパイプなどにアクセスできないように見えます。 Windowsサービスで名前付きパイプサーバーを作成していたので、私が指定したセキュリティ記述子は問題ではありません。それは動作しません。

第2に、中間整合性ブローカープロセスを使用して、同じ試行されたSDを持つ名前付きパイプを作成すると、アクセス可能になります。そこで、私が取ったアプローチは、これらのメッセージをWindowsサービスに転送するBHOへのプロキシを作成することでした。したがって、私の "サーバ"ロジックは動かす必要はありませんでした。

私はアプローチに感心しませんが、コアコードを完全に書き直すことなく、このコードをJSベースの拡張機能に再利用できるため、それほど悪くありません。

第3に、外部刺激に基づいて何らかの行動をとるようにBHOに連絡する方法が必要でした。私は、BHOのSetSiteにHWND_MESSAGEウィンドウを作成し、ブローカープロセスからSendMessageを使用して呼び出すことで、これを達成しました。これはクロスプロセスなので、WM_COPYDATAを使用する必要があります。

関連する問題