Ответ 1
Хорошо, вот что я нашел о коде песочницы с Chrome.
Прежде всего, вам нужно пойти получить исходный код хрома. Это большой, и потребуется некоторое время, чтобы получить, но я еще не нашел надежных ярлыков для проверки, которые все еще пригодны для использования. Алос, очень важно, чтобы вы следуете инструкциям на этой странице ОЧЕНЬ ЗАКРЫТЬ. Команда Google знает, что они делают, и не стремится к бесполезным шагам. Все на этой странице необходимо. Да. Все.
Теперь, как только вы получите источник, на самом деле вам не нужно создавать хром в нем целиком (что может занять несколько часов!) для использования песочницы. Вместо этого они были достаточно хороши, чтобы дать вам отдельное решение для песочницы (находящееся в папке песочницы), которое может создавать автономные. Создайте этот проект и убедитесь, что все скомпилировано. Если да, то здорово! Если это не так, вы не выполнили шаги на странице сборки, не так ли? Повесьте голову в позоре и на самом деле сделайте это на этот раз. Не волнуйся, я подожду...
Теперь, когда все построено, ваша главная достопримечательность - проект sandbox_poc ( "poc" = "Доказательство концепции" ). Этот проект в основном представляет собой минимальную оболочку GUI вокруг изолированной программной среды, которая запускает произвольную DLL в данной точке входа в изолированной среде. Он показывает все необходимые шаги для создания и использования песочницы, и это лучшая ссылка, которую вы получили. Обратитесь к нему часто!
Когда вы просматриваете код, вы, вероятно, заметите, что сам код его песочницы сам по себе. Это очень часто встречается со всеми примерами песочницы, и в соответствии с этим потоком (который может быть устаревшим), возможно, является единственным рабочим способом для песочницы на момент. В потоке описывается, как теоретически изолировать отдельный процесс, но я его не пробовал. Однако, чтобы быть в безопасности, при использовании самозавершения приложение является "известным хорошим" методом.
sandbox_proc содержит большое количество статических библиотек, но они, по-видимому, в основном относятся к образцу пользовательского интерфейса, который они создали. Единственные, которые я нашел, которые, как представляется, требуются для минимальной песочницы:
sandbox.lib base.lib dbghelp.lib
Там другая зависимость, которая не совсем очевидна, если посмотреть на проект, и это то, что я догнал дольше всего. Когда вы строите решение для песочницы, один из выходных файлов должен быть "wowhelper.exe
". Хотя он никогда нигде не упоминается, этот файл должен быть скопирован в тот же каталог, что и исполняемый файл, который вы выполняете в песочнице! Если это не так, ваши попытки изолировать ваш код всегда будут терпеть неудачу с общей ошибкой "файл не найден". Это может быть очень неприятно, если вы не знаете, что происходит! Теперь я разрабатываю Windows 64-разрядный 64-разрядный, что может иметь какое-то отношение к требованию wowhelper (WOW является общим сокращением для приложений interop между 16/32/64 бит), но у меня нет хорошего способа тестирования прямо сейчас. Пожалуйста, дайте мне знать, если кто-нибудь еще узнает больше!
Итак, чтобы вся окружающая среда, здесь немного кода, чтобы заставить вас двигаться! Обратите внимание, что, хотя я использую wcout в дочернем процессе здесь, вы не можете видеть какой-либо вывод консоли при работе в песочнице. Все это должно быть передано родительскому процессу через IPC.
#include <sandbox/src/sandbox.h>
#include <sandbox/src/sandbox_factory.h>
#include <iostream>
using namespace std;
int RunParent(int argc, wchar_t* argv[], sandbox::BrokerServices* broker_service) {
if (0 != broker_service->Init()) {
wcout << L"Failed to initialize the BrokerServices object" << endl;
return 1;
}
PROCESS_INFORMATION pi;
sandbox::TargetPolicy* policy = broker_service->CreatePolicy();
// Here where you set the security level of the sandbox. Doing a "goto definition" on any
// of these symbols usually gives you a good description of their usage and alternatives.
policy->SetJobLevel(sandbox::JOB_LOCKDOWN, 0);
policy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, sandbox::USER_LOCKDOWN);
policy->SetAlternateDesktop(true);
policy->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW);
//Add additional rules here (ie: file access exceptions) like so:
policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, sandbox::TargetPolicy::FILES_ALLOW_ANY, "some/file/path");
sandbox::ResultCode result = broker_service->SpawnTarget(argv[0], GetCommandLineW(), policy, &pi);
policy->Release();
policy = NULL;
if (sandbox::SBOX_ALL_OK != result) {
wcout << L"Sandbox failed to launch with the following result: " << result << endl;
return 2;
}
// Just like CreateProcess, you need to close these yourself unless you need to reference them later
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
broker_service->WaitForAllTargets();
return 0;
}
int RunChild(int argc, wchar_t* argv[]) {
sandbox::TargetServices* target_service = sandbox::SandboxFactory::GetTargetServices();
if (NULL == target_service) {
wcout << L"Failed to retrieve target service" << endl;
return 1;
}
if (sandbox::SBOX_ALL_OK != target_service->Init()) {
wcout << L"failed to initialize target service" << endl;
return 2;
}
// Do any "unsafe" initialization code here, sandbox isn't active yet
target_service->LowerToken(); // This locks down the sandbox
// Any code executed at this point is now sandboxed!
TryDoingSomethingBad();
return 0;
}
int wmain(int argc, wchar_t* argv[]) {
sandbox::BrokerServices* broker_service = sandbox::SandboxFactory::GetBrokerServices();
// A non-NULL broker_service means that we are not running the the sandbox,
// and are therefore the parent process
if(NULL != broker_service) {
return RunParent(argc, argv, broker_service);
} else {
return RunChild(argc, argv);
}
}
Надеюсь, этого хватит, чтобы получить любые другие любопытные кодеры песочницы! Удачи!