很多人不怎麼知道抓包,又非常想學,更煩惱的是,關於抓包技術的實現文章少之又少,於是我萌動了寫一篇關於抓包的實現的步驟的博客。希望對你們有所幫助,同時也希望尊重原創,歡迎轉載。
一、首先你要知道什麼是抓包
抓包就是將網絡傳輸發送與接收的數據包進行截獲、重發、編輯、轉存等操作,也用來檢查網絡安全,但往往被某些無恥之徒用來網遊作弊。
這是我大三上學期通過抓包做的小型教務系統--La吧(喇叭),可以查成績,查所有班級的課表,公告欄,機構通知,圖書館查詢書籍,查詢借書情況、意見反饋等等的功能。後臺數據通過Bmob移動後端雲服務進行數據存儲。
下面就讓我通過我做的小項目進行闡述如何抓包吧。
二、你所需要的工具
抓取數據的分析工具有很多,不同瀏覽器也自帶很多開發人員工具,如果你的是IE內核的瀏覽器的話,比如360安全瀏覽器,你可以安裝一個HttpWatch,相對web開發的人員來說對這個工具很熟悉,HttpWatch是一款強大的網頁數據分析工具。集成在Internet Explorer工具欄。包括網頁摘要。Cookies管理。緩存管理。消息頭髮送/接受。字符查詢。
如果你的是Firefox火狐瀏覽器的話,恭喜你,它裏面自帶了一個比較好用的工具firebug,它的功能是和HttpWatch差不多,區別不大,我就是用Firefox自帶的工具進行抓包分析的。
下面就讓我用圖片展示firebug的安裝吧:
三、你最關心的代碼實現。
我做的作品是通過抓取我校(廣東石油化工學院)的教務系統的數據進行分析和操作的,看到圖片上的我畫的,誒,是不是真是你想做和抓取的呀?
好了,現在要用的firebug終於到場了,我們點擊瀏覽器小蟲子的圖標,或者直接按下F12快捷鍵,便出現這個頁面,這個頁面正是我們所需要的抓包分析頁面。
有木有很激動,看到數據了沒有?這些數據正是我們所需要的抓取的數據。
但是問題來了。我是先登錄才能到這個頁面的啊。
其實我們登陸時是通過cookie進行驗證的,如果返回的cookie不爲null,那麼則是登陸成功
那麼問題來了。我要怎麼才能到到cookie了。cookie其實就相當於我們的身份證一樣,裏面有唯一的信息。不多說,直接上代碼:
/** * 登錄時得到cookie * @param xueHao 學號,即是登陸賬號 * @param password 登陸密碼 * @return */ public List<Cookie> getCookie(String xueHao,String password) { List<Cookie> cookies = null; // 保存獲取的cookie try { HttpClient client = new DefaultHttpClient(); //學校的教務系統,改爲你的學校教務系統 String uriAPI = "http://218.15.22.136:3008/"; HttpPost httpPost = new HttpPost(uriAPI); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair( "Window1$SimpleForm1$rdl_shenFen", "學生")); params.add(new BasicNameValuePair("Window1$SimpleForm1$tbx_XueHao", xueHao)); params.add(new BasicNameValuePair("Window1$SimpleForm1$tbx_pwd", password)); params.add(new BasicNameValuePair("Window1_Collapsed", "false")); params.add(new BasicNameValuePair("Window1_Hidden", "false")); params.add(new BasicNameValuePair("Window1_SimpleForm1_Collapsed", "false")); params.add(new BasicNameValuePair("X_AJAX", "true")); params.add(new BasicNameValuePair("X_CHANGED", "true")); params.add(new BasicNameValuePair("X_STATE", "e30=")); params.add(new BasicNameValuePair("X_TARGET", "Window1_Toolbar1_btn_login")); params.add(new BasicNameValuePair("__EVENTARGUMENT", "")); params.add(new BasicNameValuePair("__EVENTTARGET", "Window1$Toolbar1$btn_login")); // 發出HTTP request httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // 取得HTTP response HttpResponse httpResponse = client.execute(httpPost); // 執行 // 若狀態碼爲200 ok if (httpResponse.getStatusLine().getStatusCode() == 200) { // 返回值正常 // 獲取返回的cookie cookies = ((AbstractHttpClient) client).getCookieStore() .getCookies(); //System.out.println("cookies=" + cookies); if (cookies.isEmpty()) System.out.println("cookies empty"); } else { } } catch (Exception e) { System.out.println("getCookie error:" + e); } return cookies; }
你會問params.add(new BasicNameValuePair("X_AJAX", "true")) 這些東西是什麼啊?別急!再看圖
怎麼樣?懂了吧?其實就是post傳帶的參數。
ok,進入系統之後,我們就要對自己感興趣的數據進行抓取了,繼續如圖:
選擇自己想要抓取的頁面,點擊cookies可以知道,我自己已經登陸,cookie不爲空。點擊響應可以看到
自己想要抓取的數據已經存在,不難發現自己想要數據部分是以json的形式顯示出來的,現在就是得到這些數據進行分解抓取了。你會說,這個什麼東西,我看不懂,看不懂沒關係,你只要數據就行了,對於這響應的數據,其實是asp的格式而已,如果點擊的網頁時htmll的話,那麼響應的便是html,同樣是可以進行解析的。
那怎麼得到這個頁面呢,先看代碼,再解釋吧:
/** * 得到成績數據 */ public ArrayList<HashMap<String, Object>> getMyGrade(List<Cookie> cookies) { String result = null; ArrayList<HashMap<String, Object>> list = null; String uriPath = "http://218.15.22.136:3008/ChengJiChaXun.aspx"; try { HttpPost httpPost = new HttpPost(uriPath); httpPost.setHeader("Cookie", "ASP.NET_SessionId=" + cookies.get(0).getValue() + ";XingMing=" + cookies.get(1).getValue()); HttpResponse httpResponse = new DefaultHttpClient() .execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(httpResponse.getEntity()); if (result != null && !result.isEmpty()) { list = new ArrayList<HashMap<String, Object>>(); list = toGradeData(result); } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
首先呢,你的得到你想要抓取的頁面的地址,如http://218.15.22.136:3008/ChengJiChaXun.aspx,但是這僅僅是不夠的,因爲你要告訴系統的你的身份,不然誰都可以查分數了。沒錯,你要把cookie的內容傳到系統中, httpPost.setHeader("Cookie", "ASP.NET_SessionId=" + cookies.get(0).getValue() + ";XingMing=" + cookies.get(1).getValue());讓系統知道你是否有權限查詢數據。不多說,看下圖:
當然代碼中的 list = toGradeData(result)你可能看不懂,這是我自己寫的獲取我需要的數據的方法,最後把數據裝進ArrayList<HashMap<String,Object>>中返回,那麼接下來,你應該知道怎麼做了吧?和listview綁定,就可以把數據顯示在手機界面了。如圖:
至於對源碼的解析,可以同jsoup解析網頁來進行抓取數據
當然,我的項目做了消息通知,公告欄,機構通知,如圖:
那麼我是怎麼做的呢?
在這裏。我就得向大家介紹一個很好用的移動雲服務器了。Bmob移動後端雲服務,它是一個非常好用的免費的雲數據庫,我們做的項目如果不能聯網獲取數據那麼這樣的應用是沒人用的,或者說是失敗的,但是聯網得到數據我們得有服務器啊,一般個人開發者是沒有自己的服務器,特別是學生來說更是如此,但是,現在你不用擔憂了,Bmob可以幫你搞定所有的繁瑣的後臺開發,而讓你更有時間和精力去開發你的應用。
具體我不多說,免得以爲我在打廣告,如果自己感興趣的話,可以到Bmob官網瞭解。
首先來看,上圖的數據我並不是存在SQLite的,也不是存在文件中的,我是直接通過聯網從我的雲服務中得到的,一旦我的雲服務器中的數據有改變,我下拉就可以得到最新消息。便可以做到類似新聞一樣的消息通知了。
大家請看我後臺的雲端數據庫
怎麼樣?不錯吧?其實你看Bmob的文檔,你會發現,其實這些都不難,代碼說真的挺簡單的。裏面可以設置自己應用的的官網之類的一堆功能,建議都去看看吧,相信你們能做的更好更厲害。這個就是我在Bmob中下載我的應用的官網http://downloadlaba.bmob.cn
最後呢,希望我寫的這些對你們有幫助吧,尊重原創,轉發請寫上原創地址。謝謝啦~如有疑問歡迎[email protected]