void vmsHttpFlvTrafficAnalyzer5::GetFlvTitle(HTTPDLG pWebPage, LPCSTR pszFlashVars, HTTPDLGTREEITEMLIST &vFlvTree, wstring &wstrTitle) { assert (!vFlvTree.empty ()); if (vFlvTree.empty ()) return; assert (vFlvTree [vFlvTree.size () - 1]->spDlg->enCT == vmsHttpTrafficCollector::HttpDialog::FLV); wstrTitle = L""; if (pszFlashVars && *pszFlashVars) ExtractTitleFromFlashVars (pWebPage, pszFlashVars, wstrTitle); if (!wstrTitle.empty ()) return; for (int i = ((int)vFlvTree.size ()) - 2; i >= 0; i--) { HTTPDLG pDlg = vFlvTree [i]->spDlg; switch (pDlg->enCT) { case vmsHttpTrafficCollector::HttpDialog::X_WWW_FORM_URL_ENCODED: ExtractTitleFromXWwwFormUrlEncoded (pDlg, wstrTitle); break; case vmsHttpTrafficCollector::HttpDialog::XML: ExtractTitleFromXml (pDlg, wstrTitle, vFlvTree [vFlvTree.size () - 1]->spDlg); break; } if (!wstrTitle.empty ()) return; } ExtractTitleFromHtml (pWebPage, wstrTitle); }
void vmsHttpFlvTrafficAnalyzer::FindFlvDownloadInInBetweenDlgs(const vmsHttpTrafficCollector *pTraffic, HTTPDLG pWebPage, LPCSTR pszSwfUrl, LPCSTR pszFlashVars, LPCSTR pszSwfContext, HTTPDLGLIST vFlvs, FindFlvDownloadInInBetweenDlgs_Type enFindType) { LOGFN ("vmsHttpFlvTrafficAnalyzer::FindFlvDownloadInInBetweenDlgs"); if (!pszSwfUrl) { assert (pWebPage != NULL); if (!pWebPage) return; pszSwfUrl = pWebPage->strRequestUrl.c_str (); } string strBody; if (!pszSwfContext) { assert (pWebPage != NULL); if (!pWebPage) return; strBody.assign ((LPSTR)&pWebPage->vbResponseBody [0], pWebPage->vbResponseBody.size ()); pszSwfContext = strBody.c_str (); } int nStartIndex = pWebPage ? pTraffic->getHttpDialogIndex (pWebPage) + 1 : 0; HTTPDLGLIST vFlvs2; DWORD adwCTs [] = { vmsHttpTrafficCollector::HttpDialog::AMF, vmsHttpTrafficCollector::HttpDialog::X_WWW_FORM_URL_ENCODED, vmsHttpTrafficCollector::HttpDialog::XML, vmsHttpTrafficCollector::HttpDialog::HTML, }; for (int iCT = 0; iCT < sizeof (adwCTs) / sizeof (DWORD); iCT++) { HTTPDLGLIST vBetwDlgs; pTraffic->GetHttpDialogs (nStartIndex, -1, adwCTs [iCT], vBetwDlgs); HTTPDLGLIST vBetwDlgs2; vector <HTTPDLGLIST> vBetwToFlvMap; for (size_t iDlg = 0; iDlg < vBetwDlgs.size (); iDlg++) { HTTPDLG pDlg = vBetwDlgs [iDlg]; if (pDlg->vbResponseBody.empty ()) continue; if (pDlg->enCT == vmsHttpTrafficCollector::HttpDialog::HTML && pDlg->vbResponseBody.size () > 1000) continue; string strBody; if (pDlg->enCT == vmsHttpTrafficCollector::HttpDialog::AMF) { for (size_t i = 0; i < pDlg->vbResponseBody.size (); i++) { if (pDlg->vbResponseBody [i] >= ' ') strBody += pDlg->vbResponseBody [i]; } } else if (pDlg->enCT == vmsHttpTrafficCollector::HttpDialog::X_WWW_FORM_URL_ENCODED) { string str; str.assign ((LPSTR)&pDlg->vbResponseBody [0], pDlg->vbResponseBody.size ()); vmsHttpHelper::DecodeUrl (str.c_str (), strBody); } else { strBody.assign ((LPSTR)&pDlg->vbResponseBody [0], pDlg->vbResponseBody.size ()); } if (enFindType == FDT_EXACTURLMATCH) FindDialogsByUrlExactMatch (strBody.c_str (), vFlvs, vFlvs2); else if (enFindType == FDT_FILEURLMATCH) FindDialogsByFileUrlMatch (strBody.c_str (), vFlvs, vFlvs2); else if (enFindType == FDT_BYUNIQUEWORDS) FindDialogsByUniqueUrlWordsMatch (strBody.c_str (), vFlvs, vFlvs2); else return; if (!vFlvs2.empty ()) { vBetwDlgs2.push_back (pDlg); vBetwToFlvMap.push_back (vFlvs2); } } if (vBetwDlgs2.empty ()) continue; LOGHTTPDLGLIST ("List of dialogs with FLVs", vBetwDlgs2); LOGsnl ("Found dialogs with FLVs. Find their source."); HTTPDLGLIST vBetwDlgsFoundInSwfContext; FindDialogsByUrlExactMatch (pszSwfContext, vBetwDlgs2, vBetwDlgsFoundInSwfContext); LOGHTTPDLGLIST ("List of these dialogs belonging to source page (exact match)", vBetwDlgsFoundInSwfContext); if (vBetwDlgsFoundInSwfContext.empty ()) { FindDialogsByFileUrlMatch (pszSwfContext, vBetwDlgs, vBetwDlgsFoundInSwfContext); LOGHTTPDLGLIST ("List of these dialogs belonging to source page (file url match)", vBetwDlgsFoundInSwfContext); } if (vBetwDlgsFoundInSwfContext.empty ()) { FindDialogsByUniqueUrlWordsMatch (pszSwfContext, vBetwDlgs, vBetwDlgsFoundInSwfContext); LOGHTTPDLGLIST ("List of these dialogs belonging to source page (unique url word match)", vBetwDlgsFoundInSwfContext); } if (vBetwDlgsFoundInSwfContext.empty ()) { FindDialogsByUniqueUrlWordsMatch2 (pszSwfUrl, vBetwDlgs, vBetwDlgsFoundInSwfContext); LOGHTTPDLGLIST ("List of these dialogs belonging to source page (unique url words2 match)", vBetwDlgsFoundInSwfContext); } if (!vBetwDlgsFoundInSwfContext.empty ()) { wstring wstrTitle; if (pszFlashVars) ExtractTitleFromFlashVars (pWebPage, pszFlashVars, wstrTitle); if (wstrTitle.empty () && pWebPage) ExtractTitleFromHtml (pWebPage, wstrTitle); for (size_t i = 0; i < vBetwDlgsFoundInSwfContext.size (); i++) { for (size_t j = 0; j < vBetwDlgs2.size (); j++) { if (vBetwDlgs2 [j] == vBetwDlgsFoundInSwfContext [i]) { HTTPDLG pBetwDlg = vBetwDlgs2 [j]; for (size_t k = 0; k < vBetwToFlvMap [j].size (); k++) { HTTPDLG pFlvDlg = vBetwToFlvMap [j][k]; wstring wstrTitle2; if (pBetwDlg->enCT == vmsHttpTrafficCollector::HttpDialog::X_WWW_FORM_URL_ENCODED) ExtractTitleFromXWwwFormUrlEncoded (pBetwDlg, wstrTitle2); else if (pBetwDlg->enCT == vmsHttpTrafficCollector::HttpDialog::XML) ExtractTitleFromXml (pBetwDlg, wstrTitle2, pFlvDlg); if (wstrTitle2.empty ()) wstrTitle2 = wstrTitle; AddFlvDownload (pWebPage, pFlvDlg, wstrTitle2.c_str ()); } break; } } } return; } } }
HRESULT vmsHttpFlvTrafficAnalyzer4::FindFlvDownloads(LPCSTR pszHtmlPageUrl, const vmsHttpTrafficCollector *pTraffic) { LOGFN ("vmsHttpFlvTrafficAnalyzer4::FindFlvDownloads"); m_vDownloads.clear (); const vmsHttpTrafficCollector::HttpDialog* pWebPage = pTraffic->FindDialogByRequestUrl (pszHtmlPageUrl, vmsHttpTrafficCollector::HttpDialog::HTML); if (!pWebPage) return E_INVALIDARG; if (pWebPage->vbResponseBody.empty ()) return S_FALSE; string strPageText; strPageText.assign ((LPSTR)&pWebPage->vbResponseBody [0], pWebPage->vbResponseBody.size ()); int nStartIndex = pTraffic->getHttpDialogIndex (pWebPage) + 1; HTTPDLGLIST vFlvs; pTraffic->GetHttpDialogs (nStartIndex, -1, vmsHttpTrafficCollector::HttpDialog::FLV, vFlvs); HTTPDLGLIST vFlvs2; FindDialogsByUrlExactMatch (strPageText.c_str (), vFlvs, vFlvs2); if (vFlvs2.empty ()) FindDialogsByFileUrlMatch (strPageText.c_str (), vFlvs, vFlvs2); if (!vFlvs2.empty ()) { wstring wstrTitle; ExtractTitleFromHtml (pWebPage, wstrTitle); for (size_t i = 0; i < vFlvs2.size (); i++) AddFlvDownload (pWebPage, vFlvs2 [i], wstrTitle.c_str ()); return S_OK; } string strBody; strBody.assign ((LPSTR)&pWebPage->vbResponseBody [0], pWebPage->vbResponseBody.size ()); FindFlvDownloadInInBetweenDlgs (pTraffic, pWebPage, NULL, NULL, strBody.c_str (), vFlvs, FDT_EXACTURLMATCH); if (!m_vDownloads.empty ()) return S_OK; FindFlvDownloadInInBetweenDlgs (pTraffic, pWebPage, NULL, NULL, strBody.c_str (), vFlvs, FDT_FILEURLMATCH); if (!m_vDownloads.empty ()) return S_OK; FindDialogsByUniqueUrlWordsMatch (strBody.c_str (), vFlvs, vFlvs2); if (vFlvs2.empty ()) FindDialogsByUniqueUrlWordsMatch2 (pWebPage->strRequestUrl.c_str (), vFlvs, vFlvs2); if (!vFlvs2.empty ()) { wstring wstrTitle; ExtractTitleFromHtml (pWebPage, wstrTitle); for (size_t i = 0; i < vFlvs2.size (); i++) AddFlvDownload (pWebPage, vFlvs2 [i], wstrTitle.c_str ()); return S_OK; } FindFlvDownloadInInBetweenDlgs (pTraffic, pWebPage, NULL, NULL, strBody.c_str (), vFlvs, FDT_BYUNIQUEWORDS); if (!m_vDownloads.empty ()) return S_OK; return m_vDownloads.empty () ? S_FALSE : S_OK; }
HRESULT vmsHttpFlvTrafficAnalyzer2::FindFlvDownloadsInHtmlPage_imp(LPCSTR pszHtmlPageUrl, const vmsHttpTrafficCollector *pTraffic, DWORD dwFlags, int nCallDepth) { const vmsHttpTrafficCollector::HttpDialog *pDlg = pTraffic->FindDialogByRequestUrl (pszHtmlPageUrl, vmsHttpTrafficCollector::HttpDialog::HTML); if (!pDlg && (dwFlags & FTAFND_DONT_DOWNLOAD) == 0) { if (vmsDownloadForTrafficCollector::MakeDownload (pszHtmlPageUrl)) { pDlg = pTraffic->FindDialogByRequestUrl (pszHtmlPageUrl, vmsHttpTrafficCollector::HttpDialog::HTML); } } if (!pDlg) return E_INVALIDARG; vector <const vmsHttpTrafficCollector::HttpDialog*> vFlvs; vmsWinSockHttpTrafficAnalyzer::FindOutgoingDialogs (pTraffic, pTraffic->getHttpDialogIndex (pDlg), vmsHttpTrafficCollector::HttpDialog::FLV, (dwFlags & FTAFND_DONT_FIND_UNIQUE) != 0, vFlvs); wstring wstrTitle; ExtractTitleFromHtml (pDlg, wstrTitle); for (int i = 0; i < vFlvs.size (); i++) AddFlvDownload (pDlg, vFlvs [i], wstrTitle.c_str ()); if (vFlvs.empty ()) { vector <const vmsHttpTrafficCollector::HttpDialog*> vDlgs; vmsWinSockHttpTrafficAnalyzer::FindOutgoingDialogs (pTraffic, pTraffic->getHttpDialogIndex (pDlg), vmsHttpTrafficCollector::HttpDialog::X_WWW_FORM_URL_ENCODED | vmsHttpTrafficCollector::HttpDialog::XML, (dwFlags & FTAFND_DONT_FIND_UNIQUE) != 0, vDlgs); for (int i = 0; i < vDlgs.size (); i++) { const vmsHttpTrafficCollector::HttpDialog* pDlg2 = vDlgs [i]; vFlvs.clear (); vmsWinSockHttpTrafficAnalyzer::FindOutgoingDialogs (pTraffic, pTraffic->getHttpDialogIndex (pDlg2), vmsHttpTrafficCollector::HttpDialog::FLV, (dwFlags & FTAFND_DONT_FIND_UNIQUE) != 0, vFlvs); if (!vFlvs.empty ()) { for (int j = 0; j < vFlvs.size (); j++) { wstring wstrTitle2; if (pDlg2->enCT == vmsHttpTrafficCollector::HttpDialog::X_WWW_FORM_URL_ENCODED) ExtractTitleFromXWwwFormUrlEncoded (pDlg2, wstrTitle2); else ExtractTitleFromXml (pDlg2, wstrTitle2, vFlvs [j]); if (wstrTitle2.empty ()) wstrTitle2 = wstrTitle; AddFlvDownload (pDlg, vFlvs [j], wstrTitle2.c_str ()); } } } } if (nCallDepth == 0) if (vFlvs.empty ()) { LPCSTR pszHtml = (LPCSTR)pDlg->getBodyText (); vector <string> v1, v2; vmsHtmlParser::findAllTagsHeads (pszHtml, "iframe", v1); vmsHtmlParser::findAllTagsHeads (pszHtml, "frame", v2); for (int iVector = 0; iVector < 2; iVector++) { vector <string> &v = iVector ? v2 : v1; for (size_t i = 0; i < v.size (); i++) { vmsHtmlTagParser tag (v [i].c_str ()); const vmsHtmlTagParser::TagAttribute *src = tag.findAttribute ("src"); if (!src || src->strValue.empty ()) continue; string strHtmlUrl; vmsHtmlParser::DecodeHtmlSpecEntites (src->strValue.c_str (), strHtmlUrl); if (strHtmlUrl.empty ()) continue; FindFlvDownloadsInHtmlPage_imp (strHtmlUrl.c_str (), pTraffic, dwFlags, nCallDepth+1); } } } return m_vDownloads.empty () ? S_FALSE : S_OK; }