Ok, donc voici ce que j'ai trouvé sur le bac à sable de code avec google Chrome.
Tout d'abord, vous aurez besoin d'aller obtenir le code source de chrome. C'est grand, et prendra un certain temps pour vous, mais je n'ai pas encore trouver toute la fiabilité de raccourcis à la caisse encore le rendement des résultats utilisables. Alos, il est très important que vous suiviez les instructions de la page de TRÈS PRÈS. Le Google de l'équipage sait ce qu'ils font, et ne sont pas désireux sur les étapes inutiles. Tout sur la page en question est nécessaire. Oui. Tout.
Maintenant, une fois que vous obtenez la source, vous n'avez pas fait construire en chrome dans son intégralité (ce qui peut prendre des heures!) pour utiliser le bac à sable. Au lieu de cela, ils ont été assez gentil pour vous donner un distinct solution sandbox (qui se trouve dans le dossier sandbox) qui permet de construire de manière autonome. Construire ce projet et assurez-vous que tout compile. Si elle le fait, la grande! Si ça ne marche pas, vous n'avez pas suivi les étapes indiquées sur la page de création, avez-vous? Accrocher votre tête dans la honte et aller le faire cette fois. Ne vous inquiétez pas, je vais attendre...
Maintenant que tout a construit votre principal point d'intérêt est la sandbox_poc projet ("poc" = la Preuve de Concept). Ce projet est fondamentalement un minimum de GUI wrapper autour d'un bac à sable qui va lancer un arbitraire dll à un point donné dans un environnement de type sandbox. Il montre toutes les étapes requises pour la création et l'utilisation d'un bac à sable, et est sur la meilleure référence que vous avez. Consultez-le souvent!
Comme vous regardez à travers le code, vous remarquerez probablement que le code qu'il fait sandbox est lui-même. C'est très fréquent, avec tous le bac à sable, des exemples, et en fonction de ce fil (qui est peut-être obsolète) est peut-être la seule façon de travailler pour sandbox pour le moment. Le fil décrit la manière dont une théorie, la sandbox d'un processus distinct, mais je n'ai pas essayé. Juste pour être sûr, cependant, avoir une auto-application appelante est le "bien connues" de la méthode.
sandbox_proc comprend un grand nombre de bibliothèques statiques, mais ils semblent être la plupart du temps pour l'INTERFACE utilisateur de l'exemple qu'ils ont construit. Les seuls que j'ai trouvé qui semblent être nécessaires pour un minimum de bac à sable sont:
sandbox.lib base.lib dbghelp.lib
Il y a une autre dépendance qui n'est pas totalement évident en regardant le projet, et c'est ce que je me suis rattrapé sur la plus longue. Lorsque vous avez créé la solution sandbox, un des fichiers de sortie doit être un "wowhelper.exe
". Bien qu'il n'est jamais mentionné nulle part, ce fichier doit être copié dans le même répertoire que le fichier exécutable que vous êtes le bac à sable! Si elle ne l'est pas, vos tentatives de sandbox de votre code échouera toujours avec un générique "fichier non trouvé" erreur. Cela peut être très frustrant si vous ne savez pas ce qu'il se passe! Maintenant, je suis le développement sur Windows 7 64 bits, ce qui peut avoir quelque chose à voir avec la wowhelper exigence (WOW est un acronyme commun pour l'interopérabilité des applications entre 16/32/64bit), mais je n'ai pas un bon moyen de tester ce droit maintenant. S'il vous plaît laissez-moi savoir si quelqu'un d'autre le trouve plus!
Donc, c'est tout l'environnement des trucs, voici un peu de smaple code pour démarrer! Veuillez noter que, bien que j'utilise wcout dans le processus de l'enfant ici, vous ne pouvez pas voir toute sortie de la console lors de l'exécution dans le bac à sable. Quelque chose comme ça doit être communiquée au processus parent via 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's 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);
}
}
J'espère que c'est assez pour obtenir tout autre curieux codeurs "bac à sable"! Bonne chance!