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(); }