TUST的抓包之旅(1)----- 一鍵登錄校園網

開發初衷
很久之前做一鍵登錄校園網以失敗告終,最近看By_syk大神的文章By_syk簡書寫的一鍵登錄校園網,很受鼓舞,于是自己動手實驗了一下,By_syk的校園網系統和我們的是同一個系統(很神奇),我們學校的校園網也是按流量計費,所以每個人都會有一個帳號,然后連接校園網之后使用這個帳號登錄才能使用,由于每次都要登錄比較麻煩,所以才會考慮寫簡單的小工具。

開發原型
做一個簡單的APP,提供通知欄瓷片或者快捷方式登錄校園網,同時可以提供流量統計等功能(在下一版本考慮)

第一階段截圖
可以看到第三排第二個圖標就是我們的校園網登錄按鈕(這里由于我對Quick TIle不太熟悉,有一些小問題,不影響使用)

這里寫圖片描述

下面是具體信息頁面,只上傳一個看看


這里寫圖片描述

**

一.分析登錄接口

**

首先我們進入我們的校園網登錄頁面


這里寫圖片描述
這里寫圖片描述

我使用Chrome的開發者工具來分析網站,發現有個Ipv6地址字段,是獲取本機的Ipv6地址上傳,于是訪問了一下手機登錄頁面,也就是59.67.0.245/a30.html(本地址只能在校內訪問),發現沒有該字段,所以打算使用這個頁面來抓包

訪問59.67.0.245/a30.html輸入賬號密碼,打開瀏覽器網站分析工具(快捷鍵F12)切換到開發者工具network選項卡進行抓包,記得要勾選 ?Preserve log 選項進行長連接記錄日志。

當點擊校園網登錄按鈕的時候,所有的數據都被開發者工具記錄下來,我們選擇a30.html這個頁面進行分析,這個是post我們的賬號密碼數據的頁面,一般會列在第一位


圖片中間數據有隱私數據被處理掉了

在這個頁面header選項卡里我們可以看到
Request URL:http://59.67.0.245/a30.htm
這樣一行,這也就是我們的數據將要post到的地方,那我們的數據在哪呢?對,就是下面打馬賽克的那一塊,Form Data(表單數據),可以看到一共有8個數據,第一個DDDDD是學號(網站的開發者還真是隨便命名),第二個打馬賽克當然是密碼啦,另外R1,R2,R6,R7,para,0MKKey初步判斷為定值

字段
DDDDD 15104413
upass ×××××××××××
R1 0
R2
R6 1
R7 0
para 00
0MKKey 123456

那我下面列出了本次我們需要提交的值

字段
DDDDD 15104413
upass ×××××××××××
R1 0
R2
R6 1
R7 0
para 00
0MKKey 123456

在這里我們的密碼并沒有通過任何方式加密,所以我也就不研究源碼了
直接使用postman(一款chrome插件)進行測試


這里寫圖片描述

打開postman,第一步選擇post方式,第二步填入我們剛才所找到的請求url,然后就是填入表中所列的form,點擊藍色send按鈕后,出現PC登錄成功頁面,說明已經登錄成功,這也就意味著我們的測試成功了,我們可以準備開始寫代碼了。

**

二.準備 APP 藍圖

**
這里我們使用幕布(腦圖)分析一下,我們的APP分為3個頁面,狀態,賬號和充值(本篇文章只講狀態里的登錄部分)


這里寫圖片描述

一鍵登錄的按鈕是根據是否連接校園路由器決定的,但是在代碼中可能這部分不會判斷(也就是請求一下59.67.0.245這個頁面,如果成功說明當前連接著校園網,否則連接的不是校園網),為了簡單起見,我們選擇連接上wifi之后,就可以登錄,然后如果不通過就顯示登錄失敗。

下面準備開發,這里我使用的開發環境是deepin15系統下的Android Studio2.3 。

配置依賴

    //網絡請求
    compile 'com.squareup.okhttp3:okhttp:3.8.1'
    //Material Design引導頁面
    compile 'agency.tango.android:material-intro-screen:0.0.5'
    //Design庫
    compile 'com.android.support:design:25.1.0'

配置權限

<!--網絡-->
 <uses-permission android:name="android.permission.INTERNET" />
 <!--網絡狀態讀取-->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

有了這些我們就可以做登錄操作了(先實現核心功能)

三.核心代碼

1.第一步,我們把要post的數據單獨寫一個文件
文件名:Data.java


public class Data {

    //post地址
    public static final String post_url = "http://59.67.0.245/a70.htm";

    //固定參數
    public static final String R1 = "0";
    public static final String R2 = "";
    public static final String R7 = "0";
    public static final String para = "00";
    public static final String MKKey = "123456";
    public static final String R6 = "1";
}

2.第二步,新建類,里面包含兩個靜態方法,第一個是檢查網絡狀態,第二個是登錄

獲取網絡狀態

  //3種網絡狀態(wifi鏈接,gprs鏈接,斷網)
    private static final int NETWORK_WIFI_CONNECTION = 1;
    private static final int NETWORK_MOBILE_CONNECTION = 2;
    private static final int NETWORK_DISCONNECTION = 0;
   
 
    //獲取網絡狀態
    public static int getNetWorkStatus(Context context) {
        //連接管理器對象
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        //如果連接管理器不為null
        if (connectivityManager != null) {
            //通過連接管理器獲取網絡連接狀態
            NetworkInfo networkInfo = connectivityManager
                    .getActiveNetworkInfo();
             //如果網絡狀態不為null并且網絡已經連接
            if (networkInfo != null && networkInfo.isConnected()) {
                //根據網絡信息狀態獲取連接種類
                if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                    return NETWORK_WIFI_CONNECTION;
                }
                return NETWORK_MOBILE_CONNECTION;
            }
        }
        //返回未連接
        return NETWORK_DISCONNECTION;
    }

登錄核心代碼

   //返回給調用者登錄狀態
   static int status = 0;
  public static int LoginNetWork(final Context mContext) {
        //這里是讀取文件中儲存的賬號密碼并解密的過程(使用base64加密)
        SharedPreferences sharedPreferences = mContext.getSharedPreferences("data",MODE_PRIVATE);
        String id = new String(Base64.
             decode(sharedPreferences.getString("id","0"),Base64.DEFAULT));
        String pwd = new String(Base64.
                decode(sharedPreferences.getString("pwd","0"),Base64.DEFAULT));
 //初始化okhttp的客戶端      
  OkHttpClient client = new OkHttpClient();
        //填寫表單,如果APP自己用,賬號密碼可以寫死,而不需要從保存的數值里讀取
        FormBody formBody = new FormBody.Builder()
                .add("DDDDD", id)
                .add("R1", Data.R1)
                .add("R2", Data.R2)
                .add("R7", Data.R7)
                .add("upass", pwd)
                .add("para", Data.para)
                .add("0MKKey", Data.MKKey)
                .add("R6", Data.R6)
                .build();
        //將表單提交到url
        Request request=new Request.Builder().url(Data.post_url).post(formBody).build();
        client.newCall(request).enqueue(new Callback() {
            //請求失敗回調
            @Override
            public void onFailure(Call call, IOException e) {
                status = -1;
            }

            //請求成功回調
            @Override
            public void onResponse(Call call, Response response) throws IOException {
               status = 1;
            }
        });
        //將狀態返回給調用者
        return status;

啊,猝不及防就結束了?

沒錯就是這樣,使用了Okhttp讓請求變得更簡單,剩下的,就是調用的過程咯
寫一個Activity,名字叫ShortActivity,并且配置他為啟動器,這樣我們就有了一個一鍵登錄的圖標,可以放在桌面上

  <activity android:name=".ShortActivity"
            android:label="快捷登錄"
            android:theme="@style/myTransparent"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

3.最后一步吧,在shortActivity里調用登錄方法

//這是他的onCreate方法,不需要界面,直接登錄,隨后自己finish掉自己
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在這里我沒有寫檢查網絡的代碼,當然也非常簡單,調用我們寫好的方法,根據返回值來判斷是不是需要開放登錄
//根據login方法的返回值確定是否登錄成功
        if(CheckWiFiANDLogin.LoginNetWork(this)==1){
            Toast.makeText(this,"登錄成功",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
        }

        finish();
    }

現在可以運行試試了
此處沒有截圖……
連接校園網,點擊登錄的圖標就可以登錄

就這樣就結束了么?
應該沒毛病啊Android4.0 - Android 8.0都兼容了

老板讓你兼容到Android2.0!!!
日你MMP的2.0

在Android日益發展更迭的版本中,有這么一個版本(7.0),新增加了Quilk Setting TIle功能,這是個什么功能呢,就是在通知欄下拉的列表中,添加自定義的設置瓷片,達到快速設置的功能,所以叫快速設置瓷片


這里寫圖片描述

對,就是這個樣子

我們來實現更高大上的操作方式吧
不過很遺憾,大部分國產的Android Rom都被定制的不成樣子,根本就沒有這個功能,所以這個也只能在原生的系統上體驗了。

如果你想體驗的話,不妨試試刷機原生系統
寶寶這里是小米note 標準版 ,系統是Lineage os Android7.1.2

實現QST首先要在清單文件中注冊服務

//配置一些必須的參數
 <service
            android:name=".Service.QSTileService"
            android:icon="@drawable/ic_action_wifi2"
            android:label="@string/app_name"
       //必須     android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
            //必須
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE" />
            </intent-filter>
        </service>

下面實現這個服務


/**
 * 快速設置系統磁塊
 * Created by surine on 17-7-6.
 */

//Android7.0使用注解
@SuppressLint("NewApi")
public class QSTileService extends TileService {

    int net_status = 0;
    private static final String SERVICE_STATUS_FLAG = "serviceStatus";
    private static final String PREFERENCES_KEY = "com.google.android_quick_settings";

  
    /**
     * 這個方法是打開通知欄的時候進行的處理
     * 比如說我們這個情況就是打開通知欄判斷網絡有沒有連接
     * 連接了就可用,沒連接就不可用
     */
    @Override
    public void onStartListening() {
        
        //如果網絡未連接或者gprs網絡,設置圖塊不可見
        if (CheckWiFiANDLogin.getNetWorkStatus(this) == 0 || CheckWiFiANDLogin.getNetWorkStatus(this) == 2) {
        //我們自定義一個更新磁塊方法
            updateTile("校園網未連接", false);
        } else {
            updateTile("校園網已連接", true);
        }
    }

    /**
     * 當磁塊點擊了會發生什么情況
     */
    @Override
    public void onClick() {
        Log.d("QS", "Tile tapped");

//開一個子線程來執行要發生的邏輯
        new Thread(new Runnable() {
            @Override
            public void run() {
//沒錯,就是登錄,并且返回登錄狀態
                    if(CheckWiFiANDLogin.LoginNetWork(QSTileService.this) == -1){
                        updateTile("登錄失敗",true);
                    }else{
                        updateTile("登錄成功",true);
                    }

                }

        }).start();
    }
    // 更新瓷片方法
    private void updateTile(String title,boolean b) {

         //獲取瓷片
        Tile tile = this.getQsTile();
        int newState;

        // 改變瓷片活躍度
        if (b){
            newState = Tile.STATE_ACTIVE;
        }else{
            newState = Tile.STATE_UNAVAILABLE;
        }

        // 設置標簽,圖標,活躍度等
        tile.setLabel(title);
        tile.setState(newState);

        // 刷新
        tile.updateTile();
    }

}

本寶寶也是第一次接觸這個功能,所以不太會,根據Google Code Lab提供的方法簡單實現了一下,不過還有些ui上的小bug,不影響使用

到這里我們的瓷片也已經做好了,一個簡單的登錄校園網APP已經做好了
以后終于不用使用瀏覽器登錄了。

四.寫在最后

本篇文章主要講解了分析抓包,測試抓包,利用抓包實現實用功能
在下一篇文章中,我們將利用抓包進行更多酷炫的操作

在這里很感謝By_syk大佬,在酷安遇到他,很巧在簡書也遇到了他,他的文章給了我很大的幫助。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,702評論 25 708
  • 這篇文章是對于上一篇文章TUST抓包之旅(1)的補充,上一篇文章我們實現了一鍵登錄校園網,并做了快捷瓷片。那么這篇...
    做夢枯島醒閱讀 922評論 0 1
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,816評論 18 139
  • 創建一個函數斷點 避免每次都去控制臺去做expr @import UIKit ...命令 出現錯誤 iOS 開始
    zhouwude閱讀 724評論 0 0
  • 銅錢草很有意思,看著嬌嬌弱弱的,卻朝氣蓬勃,但一少了水,就立馬焉吧,沒見過比她變臉更快的植物,還動不動就生病,沒辦...
    56東南西閱讀 176評論 0 0