终于完成的webbrowser永久记录cookie功能

来源:互联网 发布:程序员必看的电影 编辑:程序博客网 时间:2024/04/30 02:58

      说说最初的想法 :

   一 、根据文件名把cookie拷出去,修改其过期时间,需要用的时候在拷贝到cookie目录。

        失败原因:这个方法比较幼稚,没有可实现性,单纯的拷贝文件到cookie目录并不会被系统识别为cookie文件,因为系统检索cookie是通过 index.bat文件,没有在这个文件加入记录就不会被系统检索到,(证据 现在在win7的系统下,cookie的文件名已经和网址没有关系了,名字是随机的),只有cookie文件里面的 domain+path与网址有关。

   二、登录网站以后通过GetCookie,或者GetCookieEx的方式获取cookie,将cookie另存,以后使用的时候通过SetCookie重新写入Cookie。

          失败原因: GetCookie,和GetCookieEx需要准确知道当前页面的url 和 所加载的所有子页url的地址,我们访问一个网页,可能有多个iframe,就科可能有多个不同域的url,还有些网页通过javascript动态加载,其url很难获得,所以某些网站不能完全获得cookie。

 

   三、登录网站以后通过文本的方式读取cookie目录下的cookie,在再次访问前通过SetCookie写入所有Cookie。

          失败原因:情况很复杂,应该主要问题还是读到的cookie不完整,未能获取httponly属性的cookie。对浏览器的行为不清楚,无法判断什么时候能读到完整的cookie。

 

   现在的做法:

      

        Hook 对当前进程 wininet.dll的调用,用了hook以后世界突然美妙起来了。 在InternetCloseHandle之前保存所有的cookie,在HttpOpenRequest的时候SetCookie。 软件主题部分是C#,所以webbrowser是C#,Hook 部分采用的是c++来实现。

比较重要的有两点

     1  webbrowser访问网站和程序主线程不是在一个线程,因此 在InternetCloseHandle 保存cookie的时候一定要注意保证互斥,要不然程序可能会报stack overflow 异常,死掉。这个问题不好调试,因为你不知道它什么时候出现,我就为这个耗了整整一周,人都憔悴了。

     2 Hook 了HttpOpenRequest以后可以很轻松的实现过滤webbrowser的内容,例如要屏蔽 js,根据HttpOpenRequest参数中的url判断一下后缀,如果是.js的,直接调用InternetCloseHandle关闭就可以了,同理也可以屏蔽 .swf .flv .gif .jpg .png .bmp……

 

 

 

 

      
原创粉丝点击