ठीक है, तो क्रोम के साथ सैंडबॉक्सिंग कोड के बारे में मुझे यह मिला है।
सबसे पहले, आपको get the chromium source code पर जाना होगा। यह बड़ा है, और इसमें कुछ समय लगेगा, लेकिन मुझे अभी भी चेकआउट के लिए कोई विश्वसनीय शॉर्टकट नहीं मिला है जो अभी भी उपयोग करने योग्य परिणाम हैं। एलोस, यह बहुत महत्वपूर्ण है कि आप उस पृष्ठ पर बहुत से निर्देशों का पालन करें। Google चालक दल जानता है कि वे क्या कर रहे हैं, और बेकार कदमों पर उत्सुक नहीं हैं। उस पृष्ठ पर सबकुछ जरूरी है। हाँ। सब कुछ।
अब, स्रोत मिलने के बाद, आपको वास्तव में सैंडबॉक्स का उपयोग करने के लिए क्रोम बनाने की ज़रूरत नहीं है (जिसमें घंटों लग सकते हैं!)।इसके बजाए वे आपको एक अलग सैंडबॉक्स समाधान (सैंडबॉक्स फ़ोल्डर में पाए गए) देने के लिए काफी अच्छे रहे हैं जो स्टैंडअलोन बना सकते हैं। इस परियोजना को बनाएं और सुनिश्चित करें कि सब कुछ संकलित हो। अगर यह करता है, तो बढ़िया! यदि ऐसा नहीं होता है, तो आपने बिल्ड पेज पर चरणों का पालन नहीं किया है, है ना? अपने सिर को शर्म में लटकाओ और वास्तव में इस बार ऐसा करें। चिंता न करें, मैं इंतजार करूंगा ...
अब सब कुछ आपके ब्याज का मुख्य बिंदु बनाया गया है sandbox_poc प्रोजेक्ट ("poc" = अवधारणा का सबूत)। यह प्रोजेक्ट मूल रूप से एक सैंडबॉक्स के चारों ओर एक न्यूनतम जीयूआई रैपर है जो एक सैंडबॉक्स वाले वातावरण में दिए गए एंट्री पॉइंट पर मनमाने ढंग से डीएल लॉन्च करेगा। यह सैंडबॉक्स बनाने और उपयोग करने के लिए सभी आवश्यक कदम दिखाता है, और यह आपके द्वारा प्राप्त सर्वोत्तम संदर्भ के बारे में है। अक्सर इसका संदर्भ लें!
जैसा कि आप कोड देखते हैं, आपको शायद पता चलेगा कि वास्तव में यह कोड सैंडबॉक्स स्वयं है। यह सभी सैंडबॉक्स उदाहरणों के साथ बहुत आम है, और according to this thread (जो पुराना हो सकता है) इस समय सैंडबॉक्स के लिए संभवतः एकमात्र कामकाजी तरीका है। धागा बताता है कि कैसे सैद्धांतिक रूप से एक अलग प्रक्रिया को सैंडबॉक्स करेगा, लेकिन मैंने कोशिश नहीं की है। बस सुरक्षित होने के लिए, हालांकि, स्वयं-कॉलिंग ऐप रखना "ज्ञात अच्छी" विधि है।
sandbox_proc में बहुत से स्थिर स्थिर libs शामिल हैं, लेकिन वे अधिकतर नमूना यूआई के लिए बने होते हैं जो उन्होंने बनाए हैं। केवल लोगों को मैं पाया है कि एक न्यूनतम सैंडबॉक्स के लिए आवश्यक हो रहे हैं:
sandbox.lib base.lib dbghelp.lib
एक और dependancy कि हालांकि इस परियोजना को देख से पूरी तरह से स्पष्ट नहीं है नहीं है, और यह क्या मैं सबसे लंबे समय तक पर पकड़ा गया है। जब आपने सैंडबॉक्स समाधान बनाया, आउटपुट फाइलों में से एक "wowhelper.exe
" होना चाहिए। यद्यपि इसका कभी भी उल्लेख नहीं किया गया है, लेकिन इस फ़ाइल को निष्पादन योग्य के रूप में उसी निर्देशिका में कॉपी किया जाना चाहिए, जिसे आप सैंडबॉक्सिंग कर रहे हैं! यदि ऐसा नहीं है, तो आपके कोड को सैंडबॉक्स करने के आपके प्रयास हमेशा सामान्य "फ़ाइल नहीं मिली" त्रुटि के साथ असफल हो जाएंगे। यदि आप नहीं जानते कि क्या हो रहा है तो यह बहुत निराशाजनक हो सकता है! अब, मैं विंडोज 7 64 बिट पर विकसित कर रहा हूं, जिसमें वॉशेलर आवश्यकता के साथ कुछ करना हो सकता है (वाह 16/32/64 बिट के बीच इंटरऑप ऐप्स के लिए एक आम संक्षिप्त शब्द है), लेकिन मेरे पास परीक्षण का एक अच्छा तरीका नहीं है अभी। अगर किसी और को पता चला तो कृपया मुझे बताएं!
तो यह सभी पर्यावरण सामग्री है, यहां जाने के लिए यहां एक छोटा सा स्पीपल कोड है! कृपया ध्यान दें कि यद्यपि मैं यहां बाल प्रक्रिया में wcout का उपयोग करता हूं, फिर भी आप sandbox में चलते समय कोई कंसोल आउटपुट नहीं देख सकते हैं। इस तरह की कुछ भी आईपीसी के माध्यम से मूल प्रक्रिया में संवाद करने की जरूरत है।
#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);
}
}
उम्मीद है कि किसी अन्य उत्सुक कोडर सैंडबॉक्सिंग प्राप्त करने के लिए पर्याप्त है! सौभाग्य!
बस FYI: मुझे अंत में एक सैंडबॉक्स चल रहा है (प्रयोग के बहुत सारे बाद), और जब मैं एक कंक या दो काम करता हूं तो मैं यहां अपने निष्कर्ष पोस्ट करूंगा। – Toji
कृपया उन्हें पोस्ट करें :) –
क्षमा करें, अभी भी इस पर काम कर रहा है। आखिरी चीज जो मैं करना चाहता हूं वह कुछ भ्रामक या टूटी हुई है। मैं अभी भी इसे पोस्ट करने की योजना बना रहा हूं, हालांकि। ब्याज के लिए धन्यवाद! – Toji