1. 程式人生 > >關於破解廣州天翼校園 + 小米路由器實現自動上網 突破wifi限制

關於破解廣州天翼校園 + 小米路由器實現自動上網 突破wifi限制

關於破解廣州天翼校園 + 路由器刷韌體 實現自動上網 突破wifi限制

有位大神告訴我發現了github上有人破解了廣州天翼校園加密。具體倉庫請點選連結EsDialerGD 程式碼實現了認證和keep請求。

接下來我會介紹如何通過以上程式碼完成小米路由器3g的自動認證上網邏輯。

使用wireshark抓包確定請求url

EsDialerGD專案預設不提供相關的請求url
這些url需要自行抓包獲取,url包括:

  • ESD_TICKET_URL:ticket url
  • ESD_AUTH_URL: auth url
  • ESD_KEEP_URL:keep url
  • ESD_TERM_URL:term url 此選項並不重要,如若不存在不影響上網。

ps 程式預設的獲取config url 為重定向地址ip的url,但在我們學校這個url是另外一個ip地址,所以具體的url需要用wireshark抓包拿到。以我們學校為例,需要修改原始碼中的auth.c檔案:

	int get_ticket(AUTH_CONTEXT *ctx) {
    if (!ctx->ticket_url[0]) {
        dbgout("ticket_url not found");
        goto _fail;
    }
    update_local_time(ctx);
    char data[UD_BUF_SIZE] = {0};
    char buf[UD_BUF_SIZE] = {0};
    char md5_hex[64] = {0};
    build_ticket_payload(ctx, data, md5_hex);
    char headers[8][HEADER_LEN];
    build_headers(ctx, headers, md5_hex);
             (*((uint8_t *) (md5_bin + 1))),
             (*((uint8_t *) (md5_bin + 2))),
             (*((uint8_t *) (md5_bin + 3))),
             (*((uint8_t *) (md5_bin + 4))),
             (*((uint8_t *) (md5_bin + 5))));
    dbgout("Fake MAC=%s", ctx->mac_addr);
    
    snprintf(ctx->client_id, 64, "%08X-%04X-%04X-%04X-%04X%08X",
             (*((uint32_t *) md5_bin)),
             (*((uint16_t *) (md5_bin + 1))),
             (*((uint16_t *) (md5_bin + 2))),
             (*((uint16_t *) (md5_bin + 3))),
             (*((uint16_t *) (md5_bin + 4))),
             (*((uint32_t *) (md5_bin + 5))));
    dbgout("Fake ClientID=%s", ctx->client_id);

    if (cdc_domain) strcpy(ctx->cdc_domain, cdc_domain);
    if (cdc_area) strcpy(ctx->cdc_area, cdc_area);
    if (cdc_schoolid) strcpy(ctx->cdc_schoolid, cdc_schoolid);
    strcpy(ctx->ostag, ostag);
    strcpy(ctx->host_name, host_name);
    strcpy(ctx->user_agent, user_agent);
    strcpy(ctx->algo_id, algo_id);
    char *ticker_url_buffer = malloc(2048);
    //使用抓包獲取到的config_url 
    memset(ticker_url_buffer, 0, 2048);
    strcat(ticker_url_buffer, "http://14.146.227.141/index.cgi?wlanuserip=");
    strcat(ticker_url_buffer, ctx->ipv4_addr);
    strcat(ticker_url_buffer, "&wlanacip=61.142.108.88&portal_node=http://125.88.59.131:10002");
    if (get_config(ctx, ticker_url_buffer)) {
        free(ticker_url_buffer);
        goto _fail;
    }
    free(ticker_url_buffer);
    return 0;
    _fail:
    dbgout(FAILED_STR);
    return -1;
}

如果程式編譯後無法正常認證,請自行抓包確認一下URL,並且需要確認認證的韌體ID為54EB0E0D-58FE-46E2-8629-0A517E2785F4

CMakeLists.txt檔案

由於需要執行在小米路由器中,需要交叉編譯。為了方便期間,我決定用cmake實現編譯指令碼,EsDialerGD專案預設只使用了curl連結庫,所以動態連結並不麻煩。 我的CMakeLists.txt檔案的程式碼如下:

cmake_minimum_required(VERSION 3.2)

set(PROJECT_NAME EsDialerGD)
set(PROJECT_SOURCE_FILES
        auth.c
        codec.c
        http_req.c
        md5.c
        str_extract.c
        main.c)

project(${PROJECT_NAME} C)

option(USE_SYSTEM_CURL "Set to ON to use system default curl otherwise your must define curl include path." OFF)

message(STATUS "-------------------------------------------")
message(STATUS "Options USE_SYSTEM_CULR " ${USE_SYSTEM_CURL})
message(STATUS "Options LIB_PATH" ${LIB_PATH})
if(NOT USE_SYSTEM_CURL)
        if(NOT CURL_INCLUDE_PATH OR NOT LIB_PATH)
        message(ERROR "Your must define curl include path when not use system curl.")
        exit(1)
        else()
        include_directories(${CURL_INCLUDE_PATH})
        link_directories(${LIB_PATH})
        endif()
endif()
add_executable(${PROJECT_NAME} ${PROJECT_SOURCE_FILES})
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99)
target_link_libraries(${PROJECT_NAME} curl)

其中需要指定三個變數:

  • USE_SYSTEM_CURL:是否使用系統的curl 當在交叉編譯時必須使用交叉編譯toolchains提供的curl連結庫。
  • CURL_INCLUDE_PATH:指定make檔案的 -i 引數 include目錄。此目錄為交叉編譯toolchains提供的include目錄
  • LIB_PATH:指定交叉編譯toolchains 提供的lib目錄

使用linux編譯目標檔案

這裡以小米路由器3g為例子,但其他的可以刷openwrt路由器也是可以的,具體的步驟如下

//下載小米路由器提供的toolchains
cd /root
wget http://bigota.miwifi.com/xiaoqiang/sdk/tools/package/sdk_package_r3p.zip
unzip sdk_package_r3p
mkdir bin && cd bin
git clone https://github.com/claw6148/EsDialerGD.git
cd EsDialerGD


vim CMakeLists.txt
//這裡將我上面的CMakeLists.txt文字拷貝進去

vim config //在config檔案中新增如下內容
#!/bin/bash
ROOTDIR="/root/sdk_package/"
toolchain="${ROOTDIR}toolchain"
CURL="${ROOTDIR}include/"
LIB="-Wl,--rpath-link ${ROOTDIR}lib"
LIBRARY="${ROOTDIR}lib/"
export CXX="${toolchain}/bin/arm-xiaomi-linux-uclibcgnueabi-g++"
export CC="${toolchain}/bin/mipsel-xiaomi-linux-uclibc-gcc-4.8.5"
mkdir build
cmake -D CURL_INCLUDE_PATH=${CURL} -D LIB_PATH=${LIBRARY} .
cd build && cmake --build ..
chmod a+x ./config
./config

接下來將編譯好的EsDialerGD檔案拷貝到路由器中,並加上守護程序。就可以實現自動認證上網。