Beispiel #1
0
void LoaderPacker::ProcessExecutable(
  std::vector<uint8_t>& outFileBuffer,
  const AdditionalDataBlocksType& additionalDataBlocks)
{
  auto loaderBlock = utils::GetSingleAdditionalBlock(additionalDataBlocks, PackerType::kLoaderPacker);

  // get type of source executable
  PlatformType platformType;
  auto sourcePEbits = srcPEFile_->getBits();
  switch (sourcePEbits)
  {
  case 32:
    platformType = PlatformType::x86;
    break;
  case 64:
    platformType = PlatformType::x64;
    break;
  default:
    break;
  }

  auto loaderInfo = std::find_if(gloadersNames.begin(), gloadersNames.end(), [&platformType](LoaderInfo& loaderInfo)->bool
  {
    return loaderInfo.platformType == platformType;
  });

  if (loaderInfo == gloadersNames.end())
  {
    throw std::runtime_error("error finding loader");
  }

  // load loader data
  boost::filesystem::path loaderFullPath = loadersStoragePath_;
  loaderFullPath /= loaderInfo->loaderName;

  boost::filesystem::ifstream loaderFile;
  loaderFile.open(loaderFullPath, std::ios::in || std::ifstream::binary);

  auto pbuf = loaderFile.rdbuf();
  // get file size
  size_t size = static_cast<size_t>(pbuf->pubseekoff(0, loaderFile.end, loaderFile.in));
  pbuf->pubseekpos(0, loaderFile.in);

  std::vector<PeLib::byte> loaderData(size);

  // get file data
  pbuf->sgetn(reinterpret_cast<char*>(loaderData.data()), size);

  loaderFile.close();

  // get stub data offset to update loader code with pointer to stub data ( link stubData to loader )
  ModifyLoaderWithStubDataInfo(loaderData, additionalDataBlocks);

  utils::ReplaceContainerData(outFileBuffer, loaderBlock.rawOffset, loaderData);
}
void CaptchaFormsPlugin::eventActivated(const QString& from)
{
    int index = findChalleng("sender", from);
    if(index == -1)
        return;

    QHash<QString, QString> dataFields = challenges_.at(index);
    QString id = dataFields.value("id");
    QPointer<CaptchaDialog> cd = new CaptchaDialog(id);
    cd->setBody(dataFields.value("body"));
    cd->setQuestion(dataFields.value("label"));
    connect(cd, SIGNAL(ok(QString, QString)), this, SLOT(submitChallenge(QString, QString)));
    connect(cd, SIGNAL(cancel(QString)), this, SLOT(cancelChallenge(QString)));
    dialogs_[id] = cd;


    if(dataFields.contains("data")) {
        QByteArray ba;
        ba.append(dataFields.value("data"));
        QPixmap pix = QPixmap::fromImage(QImage::fromData(QByteArray::fromBase64(ba)));
        cd->setPixmap(pix);
    }
    else {
        Loader *ld = new Loader(id, this);
        if(useProxy) {
            int acc = dataFields.value("account").toInt();
            QString host_ = accInfo->proxyHost(acc);
            if(!host_.isEmpty()) {
                ld->setProxy(host_, accInfo->proxyPort(acc), accInfo->proxyUser(acc), accInfo->proxyPassword(acc));
            }
        }
        else {
            Proxy p = appInfo->getProxyFor(name());
            ld->setProxy(p.host, p.port, p.user, p.pass);
        }
        QString url = dataFields.value("uri");
        if(url.isEmpty()) {
            QString str = dataFields.value("body");
            QRegExp re(".*(http://[^\"]+).*");
            if(re.indexIn(str) != -1)
                url = re.cap(1) + "/image";
        }
        ld->start(url);
        connect(ld, SIGNAL(data(QString,QByteArray)), SLOT(loaderData(QString, QByteArray)));
        connect(ld, SIGNAL(error(QString)), SLOT(loaderError(QString)));
    }
    cd->show();
}