c#浏览器在html加载的js中注入Javascript

C# Webbrowser inject Javascript in html loaded js

本文关键字:js 注入 Javascript 加载 浏览器 html      更新时间:2023-09-26

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

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

要覆盖这些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.l 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的你需要与工作。

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

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...
}

检查所有其他简单的事情也,确保页面有一个头部标签,可能已经有一个代码注入正在那里,你的代码被注入到头部标签。

希望对你有帮助。

(编辑]

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"

我看到你已经这样做了,所以这是给别人的