#include "stdafx.h" #include "SandMan.h" #include #include "../QSbieAPI/SbieAPI.h" #include "../QtSingleApp/src/qtsingleapplication.h" #include "../QSbieAPI/SbieUtils.h" #include "../MiscHelpers/Common/qRC4.h" #include "../MiscHelpers/Common/Common.h" #include CSettings* theConf = NULL; void PackDriver(); void UnPackDrivers(); int main(int argc, char *argv[]) { #ifdef Q_OS_WIN SetProcessDPIAware(); #endif // Q_OS_WIN //QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); //QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); QtSingleApplication app(argc, argv); //InitConsole(false); if (app.arguments().contains("-rc4")) { PackDriver(); return 0; } SB_STATUS Status = CSbieUtils::DoAssist(); if (Status.GetStatus()) { app.sendMessage("Status:" + Status.GetText()); return 0; } if (app.sendMessage("ShowWnd")) return 0; theConf = new CSettings("Sandboxie-Plus"); UnPackDrivers(); //QThreadPool::globalInstance()->setMaxThreadCount(theConf->GetInt("Options/MaxThreadPool", 10)); CSandMan* pWnd = new CSandMan(); QObject::connect(&app, SIGNAL(messageReceived(const QString&)), pWnd, SLOT(OnMessage(const QString&))); pWnd->show(); int ret = app.exec(); delete pWnd; delete theConf; theConf = NULL; return ret; } bool TransformFile(const QString& InName, const QString& OutName, const QString& Key = "default_key") { QFile InFile(InName); QFile OutFile(OutName); if (InFile.open(QIODevice::ReadOnly)) { if (OutFile.open(QIODevice::WriteOnly)) { rc4_sbox_s sbox; rc4_init(&sbox, Key.toLatin1()); OutFile.write(rc4_transform(&sbox, InFile.readAll())); OutFile.flush(); return true; } } return false; } bool TestFile(const QString& OutName) { QThread::sleep(3); return QFile::exists(OutName); } void PackDriver() { int pos = QCoreApplication::arguments().indexOf("-rc4"); QString InName = QCoreApplication::arguments().at(pos + 1); QString OutName = InName; if (OutName.right(4) == ".rc4") OutName.truncate(OutName.length() - 4); else OutName.append(".rc4"); if (TransformFile(InName, OutName)) printf("success\r\n"); else printf("failed\r\n"); } bool NotifyCert() { QString Caption = QObject::tr( "

Important Notie

" ); QString Text = QObject::tr( "

Sandboxie requires a driver to operate (SbieDrv.sys), Windows however denies loading a driver file that has not been digitally signed using an expensive EV-Code Signing Certificate. " "Such certificates cost upwards of 1000$ per year!

" "

Luckily brave hackers have Leaked a few of these Certificates over the years, one of them was found by the author of this software and put to good use.

" "

Unfortunately, such certificates have been abused by malware authors resulting in many Anti Malware Fools being Lazy and flagging Everything signed with them Wrongfully as Malware. " "This Prejudice is Damaging the Open Source Ecosystem as most nonprofit developers can't afford to waste this kind of money every year only to pay that Windows Kernel \"Tax\".

" "

Therefore, the required driver is provided in an obfuscated form and before use must be unpacked. " "When doing so said said Anti Viruses will complain and attempt to destroy the freshly created file. " "Please be aware that this is a false positive caused by the necessary use of a compromitted certificate. " "If this happens you will be notified and offered the option to repeat the unpacking operation, for the operation to succeed you will need to configure an aproproate exemption.

" "

" "

If you want the project to obtain a genuine EV-Code Signing Certificate please visit the Homepage and please donate.

" "

" "

If you want to proceed with the unpacking of the driver pres YES.

" ); QMessageBox *msgBox = new QMessageBox(NULL); msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->setWindowTitle("Sandboxie-Plus"); msgBox->setText(Caption); msgBox->setInformativeText(Text); msgBox->setStandardButtons(QMessageBox::Yes); msgBox->addButton(QMessageBox::No); msgBox->setDefaultButton(QMessageBox::Yes); QIcon ico(QLatin1String(":/SandMan.png")); msgBox->setIconPixmap(ico.pixmap(64, 64)); return msgBox->exec() == QMessageBox::Yes; } void UnPackDrivers() { bool notifyNotOk = false; QDir appDir(QApplication::applicationDirPath()); foreach(const QString& FileName, appDir.entryList(QStringList("*.sys.rc4"), QDir::Files)) { QString InName = QApplication::applicationDirPath() + "/" + FileName; QString OutName = InName.mid(0, InName.length() - 4); QFileInfo InInfo(InName); QFileInfo OutInfo(OutName); if (InInfo.size() != OutInfo.size() || InInfo.lastModified() > OutInfo.lastModified()) { if (theConf->GetBool("Options/NotifyUnPack", true)) { if (!NotifyCert()) { notifyNotOk = true; break; } theConf->SetValue("Options/NotifyUnPack", false); } retry: if (!TransformFile(InName, OutName)) QMessageBox::warning(NULL, "Sandboxie-Plus", QObject::tr("Failed to decrypt %1 ensure app directory is writable.").arg(FileName)); else if (!TestFile(OutName)) { if (QMessageBox("Sandboxie-Plus", QObject::tr("The decrypted file %1 seam to have been removed. Retry file extraction?").arg(FileName), QMessageBox::Information, QMessageBox::Yes | QMessageBox::Default, QMessageBox::Cancel, QMessageBox::NoButton).exec() == QMessageBox::Yes) goto retry; notifyNotOk = true; } } } if (notifyNotOk) QMessageBox::warning(NULL, "Sandboxie-Plus", QObject::tr("Without the Driver Sandboxie-Plus wont be able to run properly.")); }