Есть ли способ создать именованный канал из BHO AppContainer на IE11?
Я пытаюсь написать BHO для Internet Explorer 11 (Windows 8.1). Мой BHO реализует песочницу AppContainer, но я не могу создать именованный канал, CreateNamedPipe
не с этим сообщением: Access is denied.
Вот код, который я использую для создания именованного канала (который я нашел на русском сайте, последний комментарий:
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) { SECURITY_ATTRIBUTES SecurityAttributes; SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); SecurityAttributes.bInheritHandle = TRUE; SecurityAttributes.lpSecurityDescriptor = pSD; HANDLE hPipe = CreateNamedPipe( L"\\\\.\\ трубы \\testpipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 4096, 4096, 1000, &SecurityAttributes); }
К сожалению, это не работает. GetLastError() возвращает это Access is denied
по-прежнему.
3 ответа
Вы не можете создать именованный канал в BHO. Но вы можете создать его в своем брокерском процессе и подключиться к каналу из BHO. Я являюсь автором указанного комментария и проверил код в брокерской части своего аддона IE.
Отрывки кода. Создание трубы в автозапуске 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;
Подключение к каналу на панели инструментов 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);
}
}
Я нашел этот вопрос очень полезным и хотел добавить свои 2 цента, основываясь на моем недавнем опыте переоборудования EPM-совместимого BHO в сложный продукт. Сбросив здесь некоторую информацию, которая, надеюсь, поможет сообществу. Мой оригинальный вопрос был размещен здесь, поэтому некоторые из них повторяют мои комментарии там - Доступ к серверам именованных каналов из IE EPM BHO
Мне нужен был какой-то способ для достижения двусторонней связи -
От BHO до службы Windows, которая содержала некоторые соответствующие данные: описанный выше дескриптор безопасности не будет работать, потому что межсессионный IPC не работает. Я попытался установить именованные каналы, чтобы позволить ВСЕМ тоже.
- Решил это, добавив брокера для ретрансляции связи.
От внешнего к BHO: это должно было предоставить BHO некоторые данные для выполнения действий - манипулирование DOM и т. Д. Стандартные параметры IPC - именованные каналы, Windows RPC и т. Д. Не будут работать, потому что BHO не может разместить серверы именованных каналов для внешнего доступа, выглядит лайк.
- Решил это, создав окно HWND_MESSAGE в функции SetSite и вызвав его из процесса Broker, используя SendMessage. Тип используемого сообщения должен быть WM_COPYDATA, так как это перекрестный процесс.
Вы можете добавить разрешение 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;
}