C# 跨域操作浏览器(无限制).ie

如何跨域操作IE浏览器呢?在上次我的这篇帖子中已经有到 http://blog

.csdn.net/u012395622/article/details/46426043 不过它并不是一个很好

的解决方案 因为你无法操作非 Internet Explorer 但基于IE内核的程序

看上图你可以明确的看到由“易语言”编写的一个简单的“超文本浏览框”

小软件处于运行状态,然而它却跳转到我的博客上,你可以在上明确

的知道,是去浏览百度的主页。

看上图,你会看到代码在远程跨域操作对方的浏览器进行跳转到我的

博客,你可以理解为浏览器劫持。

首先你需要准备一个“窗口Spy++”工具 可以使用“Visual Studio”自带的

Spy++工具,你首先需要去寻找一个“基于IE内核”的浏览器软件,得到

它的句柄,但记得窗口的类名必须是“Internet Explorer_Server”仔细看

上图,然后把它的窗口句柄,提供给GetHtmlDocumentByHandle函数

参考本帖:http://blog.csdn.net/u012395622/article/details/46503661

获取到webDomDoc后,调用CorssDomain.GetWebBrowserByHtml

Document函数获取到浏览器的操作指针(IWebBrowser2)然后下面我

们就可以想怎么愉快的玩耍就怎么愉快的玩耍,你可以为它挂接一个

事件接口用于监听浏览器POST请求或者直接干扰用户浏览器跳转等

示例代码一:

         object webDomDoc = GetHtmlDocumentByHandle((IntPtr)4784608);

            CorssDomain.IWebBrowser2 webObject = CorssDomain.GetWebBrowserByHtmlDocument(webDomDoc);

            webObject.Silent = true;

            object unknown = null;      

            webObject.Navigate("http://blog.csdn.net/u012395622", ref unknown, ref unknown, ref unknown, ref unknown);

示例代码二:

            CorssDomain.IWebBrowser2 webObject = CorssDomain.GetWebBrowserByHtmlDocument(webBrowser1.Document.DomDocument);

            webObject.Silent = true;

            object unknown = null;      

            webObject.Navigate("http://blog.csdn.net/u012395622", ref unknown, ref unknown, ref unknown, ref unknown);

CorssDomain:

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace CorssDomain
{
    public partial class CorssDomain
    {
        [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
            InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IServiceProvider
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
        }

        [ComImport, Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"),
            TypeLibType(TypeLibTypeFlags.FOleAutomation | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FHidden)]
        public interface IWebBrowser2
        {
            [DispId(100)]
            void GoBack();
            [DispId(0x65)]
            void GoForward();
            [DispId(0x66)]
            void GoHome();
            [DispId(0x67)]
            void GoSearch();
            [DispId(0x68)]
            void Navigate([In] string Url, [In] ref object flags, [In] ref object targetFrameName, [In] ref object postData, [In] ref object headers);
            [DispId(-550)]
            void Refresh();
            [DispId(0x69)]
            void Refresh2([In] ref object level);
            [DispId(0x6a)]
            void Stop();
            [DispId(200)]
            object Application {[return: MarshalAs(UnmanagedType.IDispatch)] get; }
            [DispId(0xc9)]
            object Parent {[return: MarshalAs(UnmanagedType.IDispatch)] get; }
            [DispId(0xca)]
            object Container {[return: MarshalAs(UnmanagedType.IDispatch)] get; }
            [DispId(0xcb)]
            object Document {[return: MarshalAs(UnmanagedType.IDispatch)] get; }
            [DispId(0xcc)]
            bool TopLevelContainer { get; }
            [DispId(0xcd)]
            string Type { get; }
            [DispId(0xce)]
            int Left { get; set; }
            [DispId(0xcf)]
            int Top { get; set; }
            [DispId(0xd0)]
            int Width { get; set; }
            [DispId(0xd1)]
            int Height { get; set; }
            [DispId(210)]
            string LocationName { get; }
            [DispId(0xd3)]
            string LocationURL { get; }
            [DispId(0xd4)]
            bool Busy { get; }
            [DispId(300)]
            void Quit();
            [DispId(0x12d)]
            void ClientToWindow(out int pcx, out int pcy);
            [DispId(0x12e)]
            void PutProperty([In] string property, [In] object vtValue);
            [DispId(0x12f)]
            object GetProperty([In] string property);
            [DispId(0)]
            string Name { get; }
            [DispId(-515)]
            int HWND { get; }
            [DispId(400)]
            string FullName { get; }
            [DispId(0x191)]
            string Path { get; }
            [DispId(0x192)]
            bool Visible { get; set; }
            [DispId(0x193)]
            bool StatusBar { get; set; }
            [DispId(0x194)]
            string StatusText { get; set; }
            [DispId(0x195)]
            int ToolBar { get; set; }
            [DispId(0x196)]
            bool MenuBar { get; set; }
            [DispId(0x197)]
            bool FullScreen { get; set; }
            [DispId(500)]
            void Navigate2([In] ref object URL, [In] ref object flags, [In] ref object targetFrameName, [In] ref object postData, [In] ref object headers);
            [DispId(0x1f5)]
            OLECMDF QueryStatusWB([In] OLECMDID cmdID);
            [DispId(0x1f6)]
            void ExecWB([In] OLECMDID cmdID, [In] OLECMDEXECOPT cmdexecopt, ref object pvaIn, IntPtr pvaOut);
            [DispId(0x1f7)]
            void ShowBrowserBar([In] ref object pvaClsid, [In] ref object pvarShow, [In] ref object pvarSize);
            [DispId(-525)]
            int ReadyState { get; }
            [DispId(550)]
            bool Offline { get; set; }
            [DispId(0x227)]
            bool Silent { get; set; }
            [DispId(0x228)]
            bool RegisterAsBrowser { get; set; }
            [DispId(0x229)]
            bool RegisterAsDropTarget { get; set; }
            [DispId(0x22a)]
            bool TheaterMode { get; set; }
            [DispId(0x22b)]
            bool AddressBar { get; set; }
            [DispId(0x22c)]
            bool Resizable { get; set; }
        }

        public enum OLECMDF
        {
            OLECMDF_DEFHIDEONCTXTMENU = 0x20,
            OLECMDF_ENABLED = 2,
            OLECMDF_INVISIBLE = 0x10,
            OLECMDF_LATCHED = 4,
            OLECMDF_NINCHED = 8,
            OLECMDF_SUPPORTED = 1
        }
        public enum OLECMDID
        {
            OLECMDID_PAGESETUP = 8,
            OLECMDID_PRINT = 6,
            OLECMDID_PRINTPREVIEW = 7,
            OLECMDID_PROPERTIES = 10,
            OLECMDID_SAVEAS = 4
        }
        public enum OLECMDEXECOPT
        {
            OLECMDEXECOPT_DODEFAULT,
            OLECMDEXECOPT_PROMPTUSER,
            OLECMDEXECOPT_DONTPROMPTUSER,
            OLECMDEXECOPT_SHOWHELP
        }

        public static Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");
        public static Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");

        public const int S_OK = 0;

        public static IWebBrowser2 GetWebBrowserByHtmlDocument(object ppvObject)
        {
            object webObject = null;
            if (ppvObject != null && Marshal.IsComObject(ppvObject))
            {
                IServiceProvider sp;
                //ppvObject =  ppvObject.GetType().
                //    InvokeMember("parentWindow", BindingFlags.GetProperty, null, ppvObject, null);

                if ((sp = ppvObject as IServiceProvider) != null)
                {
                    if (sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webObject) != S_OK)
                        throw new ArgumentException();
                }
            }
            return webObject as IWebBrowser2;
        }
    }
}
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetClassName(
    [In]IntPtr hWnd,
    [MarshalAs(UnmanagedType.VBByRefStr)]ref string IpClassName,
    [In]int nMaxCount
    );

        [DllImport("oleacc.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool ObjectFromLresult(
    [In]int lResult,
    [In]ref Guid riid,
    [In]int wParam,
    [Out, MarshalAs(UnmanagedType.IUnknown)]out object ppvObject
    );

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.I4)]
        public static extern int RegisterWindowMessage(
            [In]string lpString
            );

        [DllImport("user32.dll", EntryPoint = "SendMessageTimeoutA", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SendMessageTimeout(
            [In]IntPtr MSG,
            [In]int hWnd,
            [In]int wParam,
            [In]int lParam,
            [In]int fuFlags,
            [In]int uTimeout,
            [In, Out]ref int lpdwResult
            );

        public static object GetComObjectByHandle(int Msg, Guid riid, IntPtr hWnd)
        {
            object _ComObject;
            int lpdwResult = 0;
            if (!SendMessageTimeout(hWnd, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, ref lpdwResult))
                return null;
            if (ObjectFromLresult(lpdwResult, ref riid, 0, out _ComObject))
                return null;
            return _ComObject;
        }

        public object GetHtmlDocumentByHandle(IntPtr hWnd)
        {
            string buffer = new string('\0', 24);
            GetClassName(hWnd, ref buffer, 25);
            if (buffer != "Internet Explorer_Server")
                return null;
            return GetComObjectByHandle(WM_HTML_GETOBJECT, IID_IHTMLDocument, hWnd);
        }

        public const int SMTO_ABORTIFHUNG = 2;

        public readonly static int WM_HTML_GETOBJECT = RegisterWindowMessage("WM_HTML_GETOBJECT");
        public readonly static Guid IID_IHTMLDocument = new Guid("626fc520-a41e-11cf-a731-00a0c9082637");
时间: 2024-10-25 11:24:39

C# 跨域操作浏览器(无限制).ie的相关文章

浅谈配置chrome浏览器允许跨域操作的方法

本文出处:http://www.cnblogs.com/lyingSmall/p/5198624.html 在配置浏览器实现允许跨域之前,我们需要了解跨域的概念. 1:什么是跨域? 答:跨域是指从一个域名的网页去请求另一个域名的资源.比如从http://www.baidu.com/ 页面去请求 http://www.google.com 的资源.跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域.(答案出处:链接:https://www.zhihu.com/quest

解决项目中的跨域操作问题

浏览器存在许多安全策略,其中同源策略就是其中一个,所谓同源策略也叫同域名策略,即只有协议+域名+端口一致的情况下才可以相互访问,其目的就是为了保护用户信息的安全,同源策略现在的范围包括三方面:1).Cookie.LocalStorage.IndexDB无法读取:2).DOM无法获取:3).AJAX请求不能发送.这里主要介绍两种解决AJAX请求不能发送的解决方案:JSONP和CORS.JSONP是一种前端的解决方式:CORS是跨域资源共享,在服务端实现. 一.JSONP 这里使用jquery的$.

【学亮IT手记】Ajax跨域问题精讲--jQuery解决跨域操作

什么是跨域 跨域,它是不同的域名(服务器)之间的相互的资源之间的访问. 当协议,域名,端口号任意一个不同,它们就是不同的域. 正常情况下,因为浏览器安全的问题,不同域之间的资源是不可以访问的. 跨域的解决方案 什么情况下会用到跨域? 一般情况,是在自己的内部的工程中会出现跨域的情况. 有三种解决方案: 1.服务器跨域(代理方案) 2.jsonp,<script>标签的开发策略. 3.XHR2,HTML5提供,一般是在移动开发中使用. jQuery解决跨域操作 在jquery中可以使用$.aja

本地跨域操作iframe的提示

Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match. 不想说什么,知道跨域就可以了 本地跨域操作iframe的提示

前端本地跨域调试 浏览器

?    降低chrome浏览器安全级别允许跨域请求 版本号49之前的跨域设置 先介绍一下老方法,参考了一些网上的教程,其实直接在打开命令上加--disable-web-security就可以了. 具体做法为: 1.下载并安装好chorme浏览器后在桌面找到浏览器快捷图标并点击鼠标右键的属性一栏. 2.在属性页面中的目标输入框里加上   --disable-web-security 3.点击应用和确定后关闭属性页面,并打开chrome浏览器.如果浏览器出现提示“你使用的是不受支持的命令标记 --

JSONP跨域操作

JSP <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><ti

数据库跨域操作配置

INSERT INTO mysql.user(Host,User,Password) VALUES('%','papaid',PASSWORD('123456'));FLUSH PRIVILEGES;GRANT ALL PRIVILEGES ON  `papaid` . * TO  'papaid'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION ; GRANT ALL PRIVILEGES ON  `papa_papaid` . * TO  'papa

浏览器解决跨域

有的公司后台没有设置浏览器跨域,所以我们就要在本地设置浏览器跨域,我用的是谷歌浏览器,步骤如下: 1.找到谷歌浏览器的安装目录,如:C:\Program Files (x86)\Google\Chrome\Application,复制此路径: 2.在桌面新建记事本把 第一行 写 刚刚复制的路径:第二行 写 chrome.exe --disable-web-security --user-data-dir=C:\MyChromeDevUserData 3.把 文件名后缀改成:.bat;以后只要双击

JavaScript 九种跨域方式实现原理

前言 前后端数据交互经常会碰到请求跨域,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容. 一.什么是跨域? 1.什么是同源策略及其限制内容? 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到 XSS.CSFR 等***.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略限制内容有: Cookie.LocalStorage.IndexedDB 等存储性内容DOM 节点AJAX 请求发送