0

目前我重新定义了函数window.openwindow.unload等;作为一个空函数。

for (int C = 0; C < webBrowser1.Document.GetElementsByTagName("head").Count; C++)
            {
                HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[C];
                HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
                IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
                string alertBlocker = "window.alert = function () { }; window.print = function () { }; window.open = function () { }; window.onunload = function () { }; window.onbeforeunload = function() { };";
                element.text = alertBlocker;
                head.AppendChild(scriptEl);
            }

现在的问题是,该站点例如通过外部 javascript 加载了此函数,但它不存在注入:

<script src="/js/jquery.js"></script><- 有例如document.onunload函数并且不是纯粹注入的。然而,现在程序应该在文档中搜索所有加载的 Javascript 并注入代码。

问候,Bl1zz4rD

4

1 回答 1

1

要覆盖这些 Javascript 函数,您需要确保它们进入正确的页面。

您可能会在页面加载中看到分阶段的事件。这意味着一旦页面被加载,脚本可能不会被加载但仍在加载。或者,绝对 URL 可能不是加载脚本的 URL。

先试试这个:

public void navigateURL(string URL)
{
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(page_Loaded);
webBrowser1.Navigate(URL); 
}

void page_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show(e.Url.AbsolutePath)
}

这将告诉您尝试将代码注入的 URL 是否正确。我在某些页面上看到,e.Url.AbsolutePath 可以在加载最终页面之间多次更改。在以下 URL 字符串中记录显示在 MessageBox 中的 URL。

private string URL1 = "<First URL to load>";
private string URL2 = "<Second URL to load>";
private string URL3 = "<Third URL to load>";

void page_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.Url.ToString() == "URL3")
{
// Block POP Ups...
HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
string alertBlocker = "window.alert = function () { }";
element.text = alertBlocker;
head.AppendChild(scriptEl);

this.webBrowser1.PerformLayout();

webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(Page_Loaded);
}
}

我已将 URL1 - 3 放在那里,以指示您需要使用的可能 URL。

在某些情况下,我还需要实现一个 Timer 来等待对象加载:

void page_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{          
// Wait for Objects to Load...
delaytimer.Interval = 500;
delaytimer.Enabled = true;
delaytimer.Tick += new EventHandler(PageObjects_Loaded);
delaytimer.Start();
}

void PageObjects_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{ 
// Do your stuff Here...
}

还要检查所有其他简单的事情,确保页面有一个 head 标签,那里可能已经有代码注入,并且你的代码被注入到 head 标签中。

希望这可以帮助。

[编辑]

IHTMLScriptElement 位于 mshtml 库中,因此您需要参考:“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Common”或“C:\Program Files (x86)\ Microsoft Visual Studio 11.0\Visual Studio Tools for Office\PIA\Common"

并添加:使用 mshtml;

我看到你已经完成了,所以这是给其他人的。

于 2013-09-21T23:48:29.513 回答