OK, vì vậy, đây là những gì tôi tìm thấy về mã hộp cát với Chrome.
Trước hết, bạn sẽ cần phải đi get the chromium source code. Đây là lớn và sẽ mất một lúc để có được, nhưng tôi vẫn chưa tìm thấy bất kỳ phím tắt đáng tin cậy nào để kiểm tra mà vẫn có kết quả khả dụng. Alos, điều quan trọng là bạn làm theo các hướng dẫn trên trang đó RẤT KẾT THÚC. Các phi hành đoàn Google biết những gì họ đang làm, và không quan tâm đến các bước vô ích. Tất cả mọi thứ trên trang đó là cần thiết. Vâng. Mọi điều.
Bây giờ, khi bạn nhận được nguồn, bạn không thực sự phải tạo chrome toàn bộ (có thể mất hàng giờ!) Để sử dụng hộp cát.Thay vào đó, họ đã đủ tốt để cung cấp cho bạn một giải pháp hộp cát riêng biệt (được tìm thấy trong thư mục hộp cát) có thể xây dựng độc lập. Xây dựng dự án này và đảm bảo mọi thứ biên dịch. Nếu có, tuyệt vời! Nếu không, bạn không làm theo các bước trên trang xây dựng, phải không? Đợi đầu của bạn trong sự xấu hổ và đi thực sự làm điều đó thời gian này. Đừng lo lắng, tôi sẽ đợi ...
Bây giờ mọi thứ đã xây dựng điểm quan tâm chính của bạn là dự án sandbox_poc ("poc" = Proof of Concept). Dự án này về cơ bản là một wrapper GUI tối thiểu xung quanh một sandbox sẽ khởi chạy một dll tùy ý tại một điểm vào cho trước trong một môi trường sandboxed. Nó cho thấy tất cả các bước cần thiết để tạo và sử dụng một sandbox, và là về tài liệu tham khảo tốt nhất mà bạn có. Hãy tham khảo thường xuyên!
Khi bạn xem qua mã, bạn có thể nhận thấy rằng mã thực sự là hộp cát chính nó. Điều này là rất phổ biến với tất cả các ví dụ sandbox và according to this thread (có thể đã lỗi thời) có thể là cách làm việc duy nhất để sandbox vào lúc này. Các chủ đề mô tả cách một trong những lý thuyết sẽ sandbox một quá trình riêng biệt, nhưng tôi đã không thử nó. Chỉ để được an toàn, mặc dù, có một ứng dụng tự gọi là phương pháp "được biết đến" tốt.
sandbox_proc bao gồm nhiều lib tĩnh tuyệt vời, nhưng chúng dường như chủ yếu dành cho giao diện người dùng mẫu mà chúng đã tạo. Những người duy nhất tôi đã tìm thấy rằng dường như được yêu cầu cho một sandbox tối thiểu là:
sandbox.lib base.lib dbghelp.lib
Có một dependancy đó không phải là hoàn toàn rõ ràng từ nhìn vào dự án mặc dù, và đó là những gì tôi đã bắt kịp trên dài nhất. Khi bạn xây dựng giải pháp hộp cát, một trong các tệp đầu ra phải là "wowhelper.exe
". Mặc dù nó không bao giờ được đề cập ở bất cứ đâu, tệp này phải được sao chép vào cùng thư mục với tệp thực thi bạn đang sandboxing! Nếu không, nỗ lực của bạn để sandbox mã của bạn sẽ luôn thất bại với lỗi "không tìm thấy tệp" chung. Điều này có thể rất bực bội nếu bạn không biết điều gì đang xảy ra! Bây giờ, tôi đang phát triển trên Windows 7 64bit, có thể có một cái gì đó để làm với yêu cầu wowhelper (WOW là một từ viết tắt phổ biến cho các ứng dụng interop giữa 16/32/64bit), nhưng tôi không có một cách tốt để kiểm tra ngay bây giờ. Vui lòng cho tôi biết nếu có ai khác tìm hiểu thêm!
Vì vậy, đó là tất cả các công cụ môi trường, đây là một chút mã smaple để giúp bạn đi! Xin lưu ý rằng mặc dù tôi sử dụng wcout trong quá trình con ở đây, bạn không thể thấy bất kỳ đầu ra bàn điều khiển nào khi chạy trong hộp cát. Bất cứ điều gì như thế cần được truyền đạt tới tiến trình cha mẹ thông qua 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);
}
}
Hy vọng điều đó đủ để có được bất kỳ chương trình mã hóa tò mò nào khác! Chúc may mắn!
Chỉ cần FYI: Cuối cùng tôi đã nhận được một sandbox chạy (sau khi LOTS thử nghiệm), và sau khi tôi làm việc ra một kink hoặc hai tôi sẽ đăng phát hiện của tôi ở đây. – Toji
Hãy đăng chúng :) –
Xin lỗi, vẫn đang làm việc trên đó. Điều cuối cùng tôi muốn làm là đăng một cái gì đó gây hiểu lầm hoặc bị hỏng. Tôi vẫn đang lên kế hoạch đăng nó. Cảm ơn bạn đã quan tâm! – Toji